Skip to content

Terraformインフラストラクチャ

TerraformはオープンソースのInfrastructure as Codeツールで、安全かつ予測可能な方法でインフラの作成・変更・改善を可能にします。

TerraformインフラジェネレータはTerraformインフラプロジェクトを作成します。生成されたアプリケーションにはCheckovセキュリティチェックを通じたセキュリティベストプラクティスが含まれています。

新しいTerraformプロジェクトを2つの方法で生成できます:

  1. インストール Nx Console VSCode Plugin まだインストールしていない場合
  2. VSCodeでNxコンソールを開く
  3. クリック Generate (UI) "Common Nx Commands"セクションで
  4. 検索 @aws/nx-plugin - terraform#project
  5. 必須パラメータを入力
    • name: tf-infra
  6. クリック Generate
パラメータ デフォルト 説明
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アプリケーションが生成されます:

  • 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 プロジェクト設定とビルドターゲット

ライブラリプロジェクト(--type=library)の場合、再利用可能なTerraformモジュール用のシンプルな構造が生成されます:

  • Directorysrc
    • main.tf メインのTerraformモジュールファイル
  • project.json プロジェクト設定とビルドターゲット

src/main.tf内にTerraformインフラを記述できます。例:

src/main.tf
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"
}

別プロジェクト(lib)のモジュールを実行する場合、次のように記述できます:

module "lib_module" {
source = "../../path/to/my-lib/src"
}

これによりNxグラフが自動更新され、消費側アプリケーションとライブラリ間に依存関係が追加されます。

環境固有の変数はsrc/env/*.tfvarsファイルで設定します。

新しい環境を追加するには、src/env/<environment>.tfvarsファイルを作成し、project.jsonapply, destroy, init, planに新しい環境設定を追加します。例としてprod環境を追加する場合:

# 本番環境用変数
environment = "prod"
region = "us-west-2"

リモートステートブートストラップ(アプリケーション限定)

Section titled “リモートステートブートストラップ(アプリケーション限定)”

アプリケーションプロジェクトでは、インフラをデプロイする前にリモートステートバックエンドのブートストラップが必要です。これによりTerraformステートファイルを保存するS3バケットが作成されます:

Terminal window
pnpm nx run tf-infra:bootstrap

利用可能なターゲットはプロジェクトタイプによって異なります:

共通ターゲット(アプリケーション/ライブラリ共通)

Section titled “共通ターゲット(アプリケーション/ライブラリ共通)”

validateターゲットでTerraform設定を検証できます:

Terminal window
pnpm nx run tf-infra:validate

fmtターゲットでTerraformコードをフォーマット:

Terminal window
pnpm nx run tf-infra:fmt

testターゲットでCheckovを使用したセキュリティチェックを実行:

Terminal window
pnpm nx run tf-infra:test

セキュリティテスト結果はルートdistフォルダのdist/packages/<my-terraform-project>/checkovに出力されます。

アプリケーション限定ターゲット

Section titled “アプリケーション限定ターゲット”

以下のターゲットはアプリケーションタイププロジェクトでのみ利用可能です:

変更を適用する前にplanターゲットでTerraformの実行計画を確認:

Terminal window
pnpm nx run tf-infra:plan

これによりdist/packages/<my-terraform-project>/terraform/dev.tfplanにプランファイルが生成されます。

initターゲットでTerraform作業ディレクトリを初期化:

Terminal window
pnpm nx run tf-infra:init

プラン作成後、applyターゲットでインフラをAWSにデプロイ:

Terminal window
pnpm nx run tf-infra:apply

Terraform設定から出力値を取得:

Terminal window
pnpm nx run tf-infra:output

インフラを削除するにはdestroyターゲットを使用:

Terminal window
pnpm nx run tf-infra:destroy

ブートストラップリソースの削除

Section titled “ブートストラップリソースの削除”

ステート保存用S3バケットなどのブートストラップリソースを削除:

Terminal window
pnpm nx run tf-infra:bootstrap-destroy

Terraformの詳細についてはTerraformドキュメントAWSプロバイダードキュメントを参照してください。