Terraform基础架构
Terraform 是一款开源的基础设施即代码工具,可帮助您安全、可预测地创建、变更和改进基础设施。
Terraform 基础设施生成器用于创建 Terraform 基础设施项目。生成的应用程序通过 Checkov 安全检查集成了安全最佳实践。
生成 Terraform 项目
Section titled “生成 Terraform 项目”您可以通过两种方式生成新的 Terraform 项目:
- 安装 Nx Console VSCode Plugin 如果您尚未安装
- 在VSCode中打开Nx控制台
- 点击
Generate (UI)
在"Common Nx Commands"部分 - 搜索
@aws/nx-plugin - terraform#project
- 填写必需参数
- name: tf-infra
- 点击
Generate
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra
bunx nx g @aws/nx-plugin:terraform#project --name=tf-infra
您还可以执行试运行以查看哪些文件会被更改
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
yarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
npx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
bunx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-run
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
name 必需 | string | - | The name of the project. |
type | string | application | Whether this is a terraform lib (re-usable modules) or app (deployable). |
directory | string | packages | The directory of the new project. |
生成器会根据项目类型创建不同的文件结构:
对于应用项目(--type=application
),生成器会创建完整的 Terraform 应用并包含远程状态管理:
文件夹src
- main.tf 主 Terraform 配置文件
- providers.tf 包含 S3 后端配置的 Provider 配置
- variables.tf 输入变量定义
- outputs.tf 输出值定义
文件夹env 环境特定变量文件
- dev.tfvars 开发环境变量
文件夹bootstrap 远程状态初始化配置
- main.tf 状态存储的 S3 桶和策略
- providers.tf AWS provider 配置
- variables.tf 初始化变量定义
- project.json 项目配置和构建目标
对于库项目(--type=library
),生成器会创建更简洁的可复用 Terraform 模块结构:
文件夹src
- main.tf 主 Terraform 模块文件
- project.json 项目配置和构建目标
实现 Terraform 基础设施
Section titled “实现 Terraform 基础设施”您可以在 src/main.tf
中开始编写 Terraform 基础设施代码,例如:
locals { account_id = data.aws_caller_identity.current.account_id aws_region = data.aws_region.current.id}
resource "null_resource" "print_info" { # triggers = { # always_run = timestamp() # }
provisioner "local-exec" { command = "echo 'AWS Region: ${local.aws_region}, AWS Account: ${local.account_id}, Environment: ${var.environment}'" }}
# 在此声明您的基础设施resource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}
如需引用其他项目(库)中的模块,可以按如下方式操作:
module "lib_module" { source = "../../path/to/my-lib/src"}
这将自动更新 Nx 依赖图,在消费应用和库之间建立依赖关系。
在 src/env/*.tfvars
文件中配置环境特定变量。
要添加新环境,需创建新的 src/env/<environment>.tfvars
文件并定义环境变量,同时在 project.json
中为 apply, destroy, init, plan
添加新环境配置。例如添加 prod
环境:
# 生产环境变量environment = "prod"region = "us-west-2"
{ "targets": { "apply": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform apply ../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform apply ../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["plan"] }, "destroy": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform destroy -var-file=env/dev.tfvars" }, "prod": { "command": "terraform destroy -var-file=env/prod.tfvars" } }, "options": { "forwardAllArgs": true, "cwd":"{projectRoot}/src" }, "dependsOn": ["init"] }, "init": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=dev/terraform.tfstate\"" }, "prod": { "command": "terraform init -reconfigure -backend-config=\"region=$(aws configure get region)\" -backend-config=\"bucket=$(aws sts get-caller-identity --query Account --output text)-tf-state-$(aws configure get region)\" -backend-config=\"key=prod/terraform.tfstate\"" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" } }, "plan": { "executor": "nx:run-commands", "defaultConfiguration": "dev", "configurations": { "dev": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/dev.tfplan" }, "prod": { "command": "terraform plan -var-file=env/dev.tfvars -out=../../../dist/packages/infra/terraform/prod.tfplan" } }, "options": { "forwardAllArgs": true, "cwd": "{projectRoot}/src" }, "dependsOn": ["init"] } }}
远程状态初始化(仅应用项目)
Section titled “远程状态初始化(仅应用项目)”对于应用项目,在部署基础设施前需要初始化远程状态后端(创建存储 Terraform 状态文件的 S3 桶):
pnpm nx run tf-infra:bootstrap
yarn nx run tf-infra:bootstrap
npx nx run tf-infra:bootstrap
bunx nx run tf-infra:bootstrap
可用目标取决于项目类型:
通用目标(应用和库)
Section titled “通用目标(应用和库)”验证基础设施
Section titled “验证基础设施”使用 validate
目标验证 Terraform 配置:
pnpm nx run tf-infra:validate
yarn nx run tf-infra:validate
npx nx run tf-infra:validate
bunx nx run tf-infra:validate
使用 fmt
目标格式化 Terraform 代码:
pnpm nx run tf-infra:fmt
yarn nx run tf-infra:fmt
npx nx run tf-infra:fmt
bunx nx run tf-infra:fmt
使用 test
目标通过 Checkov 进行基础设施安全检查:
pnpm nx run tf-infra:test
yarn nx run tf-infra:test
npx nx run tf-infra:test
bunx nx run tf-infra:test
安全测试结果位于根目录 dist
文件夹下的 dist/packages/<my-terraform-project>/checkov
。
应用专属目标
Section titled “应用专属目标”以下目标仅适用于应用类型项目:
基础设施规划
Section titled “基础设施规划”执行变更前可通过 plan
目标查看 Terraform 计划:
pnpm nx run tf-infra:plan
yarn nx run tf-infra:plan
npx nx run tf-infra:plan
bunx nx run tf-infra:plan
这将在 dist/packages/<my-terraform-project>/terraform/dev.tfplan
生成计划文件。
初始化 Terraform
Section titled “初始化 Terraform”使用 init
目标初始化 Terraform 工作目录:
pnpm nx run tf-infra:init
yarn nx run tf-infra:init
npx nx run tf-infra:init
bunx nx run tf-infra:init
部署到 AWS
Section titled “部署到 AWS”规划完成后,使用 apply
目标将基础设施部署到 AWS:
pnpm nx run tf-infra:apply
yarn nx run tf-infra:apply
npx nx run tf-infra:apply
bunx nx run tf-infra:apply
从 Terraform 配置中获取输出值:
pnpm nx run tf-infra:output
yarn nx run tf-infra:output
npx nx run tf-infra:output
bunx nx run tf-infra:output
销毁基础设施
Section titled “销毁基础设施”使用 destroy
目标销毁基础设施:
pnpm nx run tf-infra:destroy
yarn nx run tf-infra:destroy
npx nx run tf-infra:destroy
bunx nx run tf-infra:destroy
销毁初始化资源
Section titled “销毁初始化资源”清理状态存储的 S3 桶等初始化资源:
pnpm nx run tf-infra:bootstrap-destroy
yarn nx run tf-infra:bootstrap-destroy
npx nx run tf-infra:bootstrap-destroy
bunx nx run tf-infra:bootstrap-destroy
有关 Terraform 的更多信息,请参考 Terraform 文档 和 AWS Provider 文档。