89 lines
2.3 KiB
Markdown
89 lines
2.3 KiB
Markdown
# Terraform 代码仓库最佳实践
|
|
|
|
## 应该提交到仓库的文件
|
|
|
|
1. **配置文件**:
|
|
- `main.tf` - 主配置文件
|
|
- `variables.tf` - 变量定义
|
|
- `outputs.tf` - 输出定义
|
|
- `providers.tf` - Provider 配置
|
|
- `versions.tf` - 版本约束
|
|
|
|
2. **文档文件**:
|
|
- `README.md` - 项目说明
|
|
- `CHANGELOG.md` - 变更日志
|
|
- `LICENSE` - 许可证
|
|
|
|
3. **配置文件**:
|
|
- `.gitignore` - Git 忽略规则
|
|
- `terraform.tfvars.example` - 变量示例文件
|
|
|
|
## 不应该提交到仓库的文件
|
|
|
|
### 1. 状态文件 (.tfstate)
|
|
- **原因**: 包含敏感信息和当前基础设施状态
|
|
- **风险**: 泄露基础设施详情,可能导致安全问题
|
|
- **位置**: `terraform.tfstate`, `terraform.tfstate.backup`
|
|
|
|
### 2. 本地配置文件 (terraform.tfvars)
|
|
- **原因**: 包含敏感的访问密钥和配置
|
|
- **替代方案**: 提交 `terraform.tfvars.example` 作为模板
|
|
|
|
### 3. Provider 目录 (.terraform/)
|
|
- **原因**:
|
|
- 包含下载的 provider 二进制文件
|
|
- 文件体积大,不适合存入 Git
|
|
- 二进制文件在不同架构上不同
|
|
- **说明**: 每个用户应通过 `terraform init` 下载
|
|
|
|
### 4. 锁定文件 (.terraform.lock.hcl)
|
|
- **原因**: 包含特定于本地系统的 provider 校验和
|
|
- **例外**: 如果团队使用相同架构,可选择提交
|
|
|
|
### 5. 临时和日志文件
|
|
- **原因**: 临时文件,不应进入版本控制
|
|
- **包括**: 日志文件、备份文件、临时文件
|
|
|
|
## 推荐的 .gitignore 模式
|
|
|
|
```
|
|
# Terraform
|
|
*.tfstate
|
|
*.tfstate.*
|
|
.terraform/
|
|
.terraform.lock.hcl
|
|
|
|
# Sensitive files
|
|
terraform.tfvars
|
|
|
|
# Logs
|
|
*.log
|
|
*.backup
|
|
```
|
|
|
|
## 安全注意事项
|
|
|
|
1. **绝不要提交敏感信息**:
|
|
- 访问密钥 (Access Keys)
|
|
- 私钥 (Private Keys)
|
|
- 密码 (Passwords)
|
|
- 其他认证信息
|
|
|
|
2. **使用环境变量或外部密钥管理**:
|
|
- AWS Secrets Manager
|
|
- HashiCorp Vault
|
|
- 环境变量
|
|
|
|
3. **定期审查**:
|
|
- 检查是否有敏感信息被意外提交
|
|
- 使用 `git-secrets` 等工具扫描
|
|
|
|
## 工作流程
|
|
|
|
1. 开发者克隆仓库
|
|
2. 创建 `terraform.tfvars` 文件 (不提交)
|
|
3. 运行 `terraform init` 下载 providers
|
|
4. 运行 `terraform plan` 和 `terraform apply`
|
|
5. 状态文件仅保存在本地或远程后端
|
|
|
|
这样可以确保代码库的安全性和可移植性。 |