Hạ tầng Terraform
Terraform là một công cụ phần mềm mã nguồn mở cho infrastructure as code, cho phép bạn tạo, thay đổi và cải thiện hạ tầng một cách an toàn và dự đoán được.
Trình tạo hạ tầng Terraform tạo ra một dự án 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 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:
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-infraBạn cũng có thể thực hiện chạy thử để xem những tệp nào sẽ bị thay đổi
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-run- Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
- Mở Nx Console trong VSCode
- Nhấp
Generate (UI)trong phần "Common Nx Commands" - Tìm kiếm
@aws/nx-plugin - terraform#project - Điền các tham số bắt buộc
- name: tf-infra
- Nhấp
Generate
Tùy chọn
Phần tiêu đề “Tùy chọn”| Tham số | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
| name Bắt buộc | string | - | Tên của dự án. |
| type | application | library | application | Đây là terraform lib (các module có thể tái sử dụng) hay app (có thể triển khai). |
| directory | string | packages | Thư mục của dự án mới. |
| subDirectory | string | - | Thư mục con mà dự án được đặt trong đó. Mặc định đây là tên dự án. |
| preferInstallDependencies | boolean | true | Có nên cài đặt các dependencies sau khi generator chạy xong hay không. Đặt thành false để hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối. |
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 S3 backend
- 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 cụ thể cho môi trường
- dev.tfvars Biến môi trường Development
Thư mụcbootstrap Cấu hình Bootstrap cho trạng thái từ xa
- main.tf S3 bucket và policies cho lưu trữ state
- providers.tf Cấu hình AWS provider
- variables.tf Định nghĩa biến Bootstrap
Thư mụcscripts Node helpers chạy bởi các target nx
bootstrapvàinit- aws-config.ts Phân giải account + region thông qua chuỗi thông tin xác thực AWS SDK
- bootstrap.ts Pull/push bootstrap tfstate và chạy
terraform apply - init.ts Chạy
terraform initvới cấu hình S3 backend
- project.json Cấu hình dự án và build targets
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à build targets
Triển khai Hạ tầng Terraform của bạn
Phần tiêu đề “Triển khai Hạ tầng Terraform của bạn”Bạn có thể bắt đầu viết 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}'" }}
# Declare your infrastructure hereresource "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 sử dụng 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 cụ thể cho môi trường 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 cụ thể cho môi trường và thêm các mục mới cho apply, destroy, init, plan trong project.json cho cấu hình env mới. Ví dụ, giả sử chúng ta muốn thêm một env prod:
# Production environment variablesenvironment = "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": { "env": { "TF_ENV": "dev" } }, "prod": { "env": { "TF_ENV": "prod" } } }, "options": { "forwardAllArgs": true, "commands": ["tsx {projectRoot}/scripts/init.ts {projectRoot}"], "cwd": "{workspaceRoot}" } }, "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ự án Application)
Phần tiêu đề “Bootstrap Trạng thái Từ xa (Chỉ Dự án Application)”Trước khi triển khai 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 bootstrap tf-infrayarn nx bootstrap tf-infranpx nx bootstrap tf-infrabunx nx bootstrap tf-infraCác Target Khả dụng
Phần tiêu đề “Các Target Khả dụng”Các target khả dụng 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 Hạ tầng của bạn
Phần tiêu đề “Xác thực 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 validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraĐịnh dạng Code của bạn
Phần tiêu đề “Định dạng Code của bạn”Định dạng code Terraform của bạn bằng cách sử dụng target fmt:
pnpm nx fmt tf-infrayarn nx fmt tf-infranpx nx fmt tf-infrabunx nx fmt tf-infraKiể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 hạ tầng của bạn bằng cách sử dụng Checkov với target test:
pnpm nx test tf-infrayarn nx test tf-infranpx nx test tf-infrabunx nx test tf-infraBạ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ỉ khả dụng cho các dự án loại application:
Lập kế hoạch Hạ tầng của bạn
Phần tiêu đề “Lập kế hoạch 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 plan tf-infrayarn nx plan tf-infranpx nx plan tf-infrabunx nx plan tf-infraĐiều này sẽ tạo một tệp plan 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 hạ tầng của mình lên AWS bằng cách sử dụng target apply:
pnpm nx apply tf-infrayarn nx apply tf-infranpx nx apply tf-infrabunx nx apply tf-infraLấy Outputs
Phần tiêu đề “Lấy Outputs”Truy xuất các giá trị output từ cấu hình Terraform của bạn:
pnpm nx output tf-infrayarn nx output tf-infranpx nx output tf-infrabunx nx output tf-infraHủy Hạ tầng
Phần tiêu đề “Hủy Hạ tầng”Khi bạn cần phá bỏ hạ tầng của mình, sử dụng target destroy:
pnpm nx destroy tf-infrayarn nx destroy tf-infranpx nx destroy tf-infrabunx nx destroy tf-infraHủ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 cho lưu trữ state):
pnpm nx bootstrap-destroy tf-infrayarn nx bootstrap-destroy tf-infranpx nx bootstrap-destroy tf-infrabunx nx bootstrap-destroy tf-infraThô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.