Cơ sở hạ tầng Terraform
Terraform là một công cụ phần mềm mã nguồn mở về cơ sở hạ tầng dưới dạng mã (infrastructure as code) cho phép bạn tạo, thay đổi và cải thiện cơ sở hạ tầng một cách an toàn và có thể dự đoán được.
Trình tạo cơ sở hạ tầng Terraform tạo ra một dự án cơ sở hạ tầng Terraform. Ứng dụng được tạo ra bao gồm các phương pháp bảo mật tốt nhất thông qua các kiểm tra bảo mật Checkov.
Cách sử dụng
Phần tiêu đề “Cách sử dụng”Tạo một Dự án Terraform
Phần tiêu đề “Tạo một Dự án Terraform”Bạn có thể tạo một dự án Terraform mới theo hai cách:
- Install the Nx Console VSCode Plugin if you haven't already
- Open the Nx Console in VSCode
- Click
Generate (UI)in the "Common Nx Commands" section - Search for
@aws/nx-plugin - terraform#project - Fill in the required parameters
- name: tf-infra
- Click
Generate
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infrayarn nx g @aws/nx-plugin:terraform#project --name=tf-infranpx nx g @aws/nx-plugin:terraform#project --name=tf-infrabunx nx g @aws/nx-plugin:terraform#project --name=tf-infraYou can also perform a dry-run to see what files would be changed
pnpm nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runyarn nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runnpx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runbunx nx g @aws/nx-plugin:terraform#project --name=tf-infra --dry-runTùy chọn
Phần tiêu đề “Tùy chọn”| Parameter | Type | Default | Description |
|---|---|---|---|
| name Required | 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. |
Kết quả của Trình tạo
Phần tiêu đề “Kết quả của Trình tạo”Trình tạo tạo ra các cấu trúc tệp khác nhau tùy thuộc vào loại dự án:
Loại Application
Phần tiêu đề “Loại Application”Đối với các dự án application (--type=application), trình tạo tạo ra một ứng dụng Terraform hoàn chỉnh với quản lý trạng thái từ xa:
Thư mụcsrc
- main.tf Tệp cấu hình Terraform chính
- providers.tf Cấu hình Provider với backend S3
- variables.tf Định nghĩa biến đầu vào
- outputs.tf Định nghĩa giá trị đầu ra
Thư mụcenv Tệp biến theo môi trường cụ thể
- dev.tfvars Biến môi trường phát triển
Thư mụcbootstrap Cấu hình Bootstrap cho trạng thái từ xa
- main.tf S3 bucket và các chính sách cho lưu trữ trạng thái
- providers.tf Cấu hình AWS provider
- variables.tf Định nghĩa biến Bootstrap
- project.json Cấu hình dự án và các target build
Loại Library
Phần tiêu đề “Loại Library”Đối với các dự án library (--type=library), trình tạo tạo ra một cấu trúc đơn giản hơn cho các module Terraform có thể tái sử dụng:
Thư mụcsrc
- main.tf Tệp module Terraform chính
- project.json Cấu hình dự án và các target build
Triển khai Cơ sở hạ tầng Terraform của bạn
Phần tiêu đề “Triển khai Cơ sở hạ tầng Terraform của bạn”Bạn có thể bắt đầu viết cơ sở hạ tầng Terraform của mình bên trong src/main.tf, ví dụ:
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}'" }}
# Khai báo cơ sở hạ tầng của bạn ở đâyresource "aws_s3_bucket" "my_bucket" { bucket = "my-unique-bucket-name"}Phụ thuộc giữa các dự án
Phần tiêu đề “Phụ thuộc giữa các dự án”Nếu bạn muốn thực thi một module từ một dự án riêng biệt (lib), bạn có thể làm như sau:
module "lib_module" { source = "../../path/to/my-lib/src"}Điều này sẽ tự động cập nhật đồ thị Nx để thêm phụ thuộc giữa ứng dụng tiêu thụ của bạn và lib của bạn.
Cấu hình Môi trường
Phần tiêu đề “Cấu hình Môi trường”Cấu hình các biến theo môi trường cụ thể trong các tệp src/env/*.tfvars.
Để thêm môi trường mới, tạo một tệp src/env/<environment>.tfvars mới với các biến theo môi trường cụ thể và thêm các mục mới cho apply, destroy, init, plan trong project.json cho cấu hình môi trường mới. Ví dụ, giả sử chúng ta muốn thêm một môi trường prod:
# Biến môi trường Productionenvironment = "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=my-scope-my-project/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=my-scope-my-project/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"] } }}Bootstrap Trạng thái Từ xa (Chỉ dành cho Dự án Application)
Phần tiêu đề “Bootstrap Trạng thái Từ xa (Chỉ dành cho Dự án Application)”Đối với các dự án application, trước khi triển khai cơ sở hạ tầng của bạn, bạn sẽ cần bootstrap backend trạng thái từ xa. Điều này tạo ra một S3 bucket để lưu trữ các tệp trạng thái Terraform của bạn:
pnpm nx run tf-infra:bootstrapyarn nx run tf-infra:bootstrapnpx nx run tf-infra:bootstrapbunx nx run tf-infra:bootstrapCác Target Có sẵn
Phần tiêu đề “Các Target Có sẵn”Các target có sẵn phụ thuộc vào loại dự án của bạn:
Các Target Chung (Cả Application và Library)
Phần tiêu đề “Các Target Chung (Cả Application và Library)”Xác thực Cơ sở hạ tầng của bạn
Phần tiêu đề “Xác thực Cơ sở hạ tầng của bạn”Bạn có thể xác thực cấu hình Terraform của mình bằng cách sử dụng target validate:
pnpm nx run tf-infra:validateyarn nx run tf-infra:validatenpx nx run tf-infra:validatebunx nx run tf-infra:validateĐịnh dạng Mã của bạn
Phần tiêu đề “Định dạng Mã của bạn”Định dạng mã Terraform của bạn bằng cách sử dụng target fmt:
pnpm nx run tf-infra:fmtyarn nx run tf-infra:fmtnpx nx run tf-infra:fmtbunx nx run tf-infra:fmtKiểm tra Bảo mật
Phần tiêu đề “Kiểm tra Bảo mật”Chạy kiểm tra bảo mật trên cơ sở hạ tầng của bạn bằng cách sử dụng Checkov với target test:
pnpm nx run tf-infra:testyarn nx run tf-infra:testnpx nx run tf-infra:testbunx nx run tf-infra:testBạn sẽ tìm thấy kết quả kiểm tra bảo mật của mình trong thư mục dist gốc, dưới dist/packages/<my-terraform-project>/checkov.
Các Target Chỉ dành cho Application
Phần tiêu đề “Các Target Chỉ dành cho Application”Các target sau chỉ có sẵn cho các dự án loại application:
Lập kế hoạch cho Cơ sở hạ tầng của bạn
Phần tiêu đề “Lập kế hoạch cho Cơ sở hạ tầng của bạn”Trước khi áp dụng các thay đổi, bạn có thể xem Terraform sẽ làm gì bằng cách chạy target plan:
pnpm nx run tf-infra:planyarn nx run tf-infra:plannpx nx run tf-infra:planbunx nx run tf-infra:planĐiều này sẽ tạo một tệp kế hoạch trong dist/packages/<my-terraform-project>/terraform/dev.tfplan.
Khởi tạo Terraform
Phần tiêu đề “Khởi tạo Terraform”Khởi tạo thư mục làm việc Terraform của bạn với target init:
pnpm nx run tf-infra:inityarn nx run tf-infra:initnpx nx run tf-infra:initbunx nx run tf-infra:initTriển khai lên AWS
Phần tiêu đề “Triển khai lên AWS”Sau khi lập kế hoạch, bạn có thể triển khai cơ sở hạ tầng của mình lên AWS bằng cách sử dụng target apply:
pnpm nx run tf-infra:applyyarn nx run tf-infra:applynpx nx run tf-infra:applybunx nx run tf-infra:applyLấy Outputs
Phần tiêu đề “Lấy Outputs”Truy xuất các giá trị đầu ra từ cấu hình Terraform của bạn:
pnpm nx run tf-infra:outputyarn nx run tf-infra:outputnpx nx run tf-infra:outputbunx nx run tf-infra:outputHủy Cơ sở hạ tầng
Phần tiêu đề “Hủy Cơ sở hạ tầng”Khi bạn cần phá bỏ cơ sở hạ tầng của mình, sử dụng target destroy:
pnpm nx run tf-infra:destroyyarn nx run tf-infra:destroynpx nx run tf-infra:destroybunx nx run tf-infra:destroyHủy Tài nguyên Bootstrap
Phần tiêu đề “Hủy Tài nguyên Bootstrap”Để dọn dẹp các tài nguyên bootstrap (S3 bucket để lưu trữ trạng thái):
pnpm nx run tf-infra:bootstrap-destroyyarn nx run tf-infra:bootstrap-destroynpx nx run tf-infra:bootstrap-destroybunx nx run tf-infra:bootstrap-destroyThông tin Thêm
Phần tiêu đề “Thông tin Thêm”Để biết thêm thông tin về Terraform, vui lòng tham khảo Tài liệu Terraform và Tài liệu AWS Provider.