Terraformインフラストラクチャ
Terraform はオープンソースのインフラストラクチャー as コード(IaC)ツールで、安全かつ予測可能な方法でインフラの作成・変更・改善を可能にします。
Terraform インフラストラクチャージェネレーターは、Terraform インフラストラクチャープロジェクトを作成します。生成されたアプリケーションには、Checkov セキュリティチェックを通じたセキュリティベストプラクティスが組み込まれています。
Terraform プロジェクトの生成
Section titled “Terraform プロジェクトの生成”新しい Terraform プロジェクトを2つの方法で生成できます:
- インストール 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. |
ジェネレーターの出力
Section titled “ジェネレーターの出力”ジェネレーターはプロジェクトタイプに応じて異なるファイル構造を作成します:
アプリケーションタイプ
Section titled “アプリケーションタイプ”アプリケーションプロジェクト(--type=application
)の場合、リモートステート管理を備えた完全な Terraform アプリケーションが生成されます:
Directorysrc
- main.tf Terraform メイン設定ファイル
- providers.tf S3 バックエンド付きプロバイダー設定
- variables.tf 入力変数定義
- outputs.tf 出力値定義
Directoryenv 環境固有の変数ファイル
- dev.tfvars 開発環境用変数
Directorybootstrap リモートステート用ブートストラップ設定
- main.tf ステート保存用 S3 バケットとポリシー
- providers.tf AWS プロバイダー設定
- variables.tf ブートストラップ変数定義
- project.json プロジェクト設定とビルドターゲット
ライブラリタイプ
Section titled “ライブラリタイプ”ライブラリプロジェクト(--type=library
)の場合、再利用可能な Terraform モジュール用のシンプルな構造が生成されます:
Directorysrc
- 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"}
クロスプロジェクト依存関係
Section titled “クロスプロジェクト依存関係”別プロジェクト(ライブラリ)のモジュールを実行する場合、次のように記述できます:
module "lib_module" { source = "../../path/to/my-lib/src"}
これにより、消費側アプリケーションとライブラリ間に依存関係が自動的に追加されます。
環境固有の変数は src/env/*.tfvars
ファイルで設定します。
新しい環境を追加するには、src/env/<環境名>.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 “共通ターゲット(アプリケーション/ライブラリ共通)”インフラストラクチャーの検証
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
コードのフォーマット
Section titled “コードのフォーマット”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
セキュリティテスト
Section titled “セキュリティテスト”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
出力値の取得
Section titled “出力値の取得”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 プロバイダードキュメント を参照してください。