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:
- 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
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-runTù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 | string | 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. |
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 bootstrap tf-infrayarn nx bootstrap tf-infranpx nx bootstrap tf-infrabunx nx bootstrap tf-infraCá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 validate tf-infrayarn nx validate tf-infranpx nx validate tf-infrabunx nx validate tf-infraĐị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 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 cơ sở 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ỉ 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 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 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 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ị đầu ra 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 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 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 để lưu trữ trạng thái):
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.