基于 Terraform 的阿里云基础设施即代码(IAC)项目,用于自动化部署和管理阿里云资源。
本项目提供标准化的阿里云基础设施部署框架,采用模块化设计,通过 GitLab CI/CD 实现持续集成和持续部署,并使用 Azure China Storage Account 存储 Terraform 状态文件。
| 组件 | 版本 | 说明 |
|---|---|---|
| Terraform | >= 1.13.0 | 基础设施即代码工具 |
| Alibaba Cloud Provider | ~> 1.273.0 | 阿里云 Terraform 提供商 |
| Azure Storage Account | - | 远程状态存储(中国区) |
| GitLab CI/CD | - | 持续集成与持续部署 |
| OIDC | - | GitLab OIDC 认证阿里云 |
aliyun-test/
├── .cicd/ # CI/CD 配置目录
│ ├── Jobs_config/ # 环境配置文件
│ │ ├── config_dev.yml # 开发环境配置
│ │ ├── config_prd.yml # 生产环境配置
│ │ └── config_uat.yml # UAT 环境配置
│ ├── Jobs_template/ # CI/CD 任务模板
│ │ ├── template_alicloud_oidc.yml # 阿里云 OIDC 认证模板
│ │ ├── template_terraform_alicloud_mirror.yml # 阿里云镜像配置
│ │ ├── template_terraform_backend.yml # Azure 状态存储模板
│ │ ├── template_terraform_change_rule.yml # 变更规则模板
│ │ ├── template_terraform_remote_module.yml # 远程模块配置
│ │ ├── terraform_apply.yml # Apply 任务
│ │ ├── terraform_lint.yml # TFLint 检查
│ │ ├── terraform_plan.yml # Plan 任务
│ │ ├── terraform_scan_checkov.yml # Checkov 安全扫描
│ │ ├── terraform_scan_gitleaks.yml # Gitleaks 敏感信息扫描
│ │ ├── terraform_scan_wizcli.yml # Wizcli 安全扫描
│ │ ├── terraform_test.yml # 基础设施测试
│ │ └── terraform_validate.yml # 配置验证
│ └── .gitlab-ci.yml # GitLab CI/CD 主配置
├── backend.tf # Terraform 后端配置
├── main.tf # 主配置文件(模块引用)
├── outputs.tf # 输出定义
├── variables.tf # 变量定义
├── versions.tf # 版本约束
├── terraform.dev.tfvars # 开发环境变量
├── terraform.uat.tfvars # UAT 环境变量
└── terraform.prd.tfvars # 生产环境变量
git clone https://gitlab.com/hermes-hcn-iac/aliyun-test.git
cd aliyun-test
选择对应环境的变量文件:
| 环境 | 变量文件 |
|---|---|
| 开发 | terraform.dev.tfvars |
| UAT | terraform.uat.tfvars |
| 生产 | terraform.prd.tfvars |
# 设置 Azure China 环境变量
export ARM_ENVIRONMENT="china"
export ARM_ACCESS_KEY=""
# 初始化
terraform init
# 创建工作空间
terraform workspace new dev # 开发环境
terraform workspace new uat # UAT 环境
terraform workspace new prd # 生产环境
# 切换工作空间
terraform workspace select dev
terraform plan -var-file=terraform.dev.tfvars
terraform apply -var-file=terraform.dev.tfvars
项目集成了完整的 GitLab CI/CD 流水线:
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ ┌──────────────┐ ┌──────────────┐
│ Gitleaks扫描 │ -> │ 安全扫描阶段 │ -> │ 质量检查阶段 │ -> │ Plan阶段 │ -> │ Apply阶段 │
│ (敏感信息检测) │ │ (Checkov+Wiz) │ │(Validate+Lint) │ │ (生成计划) │ │ (应用配置) │
└─────────────────┘ └──────────────────┘ └─────────────────┘ └──────────────┘ └──────────────┘
| 阶段 | 任务 | 说明 |
|---|---|---|
terraform_scan_gitleaks |
terraform_scan_gitleaks |
敏感信息扫描 |
terraform_scan_security |
terraform_scan_checkov |
Checkov 安全扫描 |
terraform_scan_security |
terraform_scan_wizcli |
Wizcli 安全扫描 |
terraform_quality |
terraform_validate |
Terraform 配置验证 |
terraform_quality |
terraform_lint |
TFLint 代码检查 |
terraform_quality |
terraform_test |
基础设施测试 |
terraform_plan |
terraform_plan |
生成执行计划 |
terraform_apply |
terraform_apply |
应用配置(手动触发) |
| 分支 | 环境 | 部署方式 | 变量文件 |
|---|---|---|---|
dev |
开发环境 | 自动部署 | terraform.dev.tfvars |
feature/* |
功能分支 | 自动部署 | terraform.dev.tfvars |
uat |
UAT 测试环境 | 自动部署 | terraform.uat.tfvars |
prod |
生产环境 | 手动确认 | terraform.prd.tfvars |
使用 GitLab OIDC 向阿里云获取临时凭证,避免持久化 Access Key:
ALICLOUD_ROLE_ARNALICLOUD_OIDC_PROVIDER_ARNexport ALICLOUD_ACCESS_KEY_ID=""
export ALICLOUD_ACCESS_KEY_SECRET=""
Terraform 状态文件存储在 Azure China Storage Account:
# backend.tf
terraform {
backend "azurerm" {
resource_group_name = "wb-poc-rg"
storage_account_name = "wbtfstate"
container_name = "wbtf"
key = "network.tfstate"
}
}
CI/CD 变量:
VAR_TF_STATE_FILE_CREDENTIAL: Azure Storage Account Account Keyexport VAR_TF_STATE_FILE_CREDENTIAL=""
| 变量名 | 类型 | 描述 | 默认值 |
|---|---|---|---|
resource_group_name |
string | 资源组名称 | "" |
resource_group_display_name |
string | 资源组显示名称 | "" |
security_group_name |
string | 安全组名称 | "" |
environment |
string | 环境名称 (dev/uat/prd) | "" |
| 输出名称 | 描述 |
|---|---|
security_group_id |
安全组 ID |
项目使用以下远程 Terraform 模块:
| 模块 | 仓库地址 |
|---|---|
| 网络模块 | git::https://gitlab.com/hermes-hcn-iac/aliyun-pattern/wb-terraform-alicloud-network.git?ref=dev |
模块引用示例:
module "network" {
source = "git::https://gitlab.com/hermes-hcn-iac/aliyun-pattern/wb-terraform-alicloud-network.git?ref=dev"
resource_group_name = var.resource_group_name
resource_group_display_name = var.resource_group_display_name
security_group_name = var.security_group_name
}
| 问题 | 排查方向 |
|---|---|
| OIDC 认证失败 | 检查 ALICLOUD_ROLE_ARN 和 ALICLOUD_OIDC_PROVIDER_ARN 是否正确 |
| 状态存储连接失败 | 确认 ARM_ACCESS_KEY 包含正确的 Azure Connection String |
| 远程模块下载失败 | 检查 CI_JOB_TOKEN 是否有权限访问私有模块仓库 |
| 权限不足 | 检查阿里云 RAM 角色是否具备创建资源的权限 |
需要在 GitLab CI/CD 中配置以下变量:
| 变量名 | 说明 | 敏感 |
|---|---|---|
VAR_ALICLOUD_REGION |
阿里云区域 | 否 |
VAR_ENVIRONMENT |
环境名称 | 否 |
VAR_TF_VARIABLE_FILE |
Terraform 变量文件路径 | 否 |
VAR_TF_STATE_FILE_CREDENTIAL |
Azure Storage Connection String | 是 |
VAR_WIZCLI_CLIENT_ID |
Wizcli 客户端 ID | 是 |
VAR_WIZCLI_CLIENT_SECRET |
Wizcli 客户端密钥 | 是 |
VAR_WIZCLI_SCAN_POLICY |
Wizcli 扫描策略 | 否 |
VAR_WIZCLI_DOWNLOAD_URL |
Wizcli 下载地址 | 否 |
VAR_TF_CLI_DOWNLOAD_URL |
Terraform CLI 下载地址 | 否 |
VAR_TFLINT_DOWNLOAD_URL |
TFLint 下载地址 | 否 |
欢迎提交 Pull Request!请遵循以下步骤:
feature/*)MIT License
Wenbo Yang
Active Development