View a markdown version of this page

Account Factory for Terraform (AFT) のコードをローカルで検証する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Account Factory for Terraform (AFT) のコードをローカルで検証する

Amazon Web Services、Alexandru Pop と Michal Gorniak

概要

このパターンは、 AWS Control Tower Account Factory for Terraform (AFT) によって管理される HashiCorp Terraform コードをローカルでテストする方法を示しています。Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのに役立つ Infrastructure as Code (IaC) ツールです。AFT は、複数の AWS アカウント をプロビジョニングおよびカスタマイズするのに役立つ Terraform パイプラインを設定します AWS Control Tower。

コード開発時には、Terraform Infrastructure as Code (IaC) を AFT パイプラインの外部でローカルでテストすると役立つ場合があります。このパターンは、次を実行する方法を説明しています。

  • AFT 管理アカウントの AWS CodeCommit リポジトリに保存されている Terraform コードのローカルコピーを取得します。

  • 取得したコードを使用して AFT パイプラインをローカルでシミュレートします。

このプロシージャは、通常の AFT パイプラインに含まれていない Terraform コマンドを実行する場合にも使用できます。たとえば、このメソッドを使用して、terraform validateterraform planterraform destroyterraform importなどのコマンドを実行できます。

前提条件と制限事項

前提条件

制限事項

  • このパターンは、、AFT AWS Control Tower、または特定の Terraform モジュールに必要なデプロイ手順には適用されません。

  • この手順でローカルに生成された出力は、AFT パイプラインのランタイムログには保存されません。

アーキテクチャ

ターゲットテクノロジースタック

  • デプロイ内に AWS Control Tower デプロイされた AFT インフラストラクチャ

  • Terraform

  • Git

  • AWS CLI バージョン 2

自動化とスケール

このパターンは、単一の AFT 管理の AFT グローバルアカウントカスタマイズのために Terraform コードをローカルで呼び出す方法を示しています AWS アカウント。Terraform コードを検証したら、マルチアカウント環境の残りのアカウントにも適用できます。詳細については、 AWS Control Tower ドキュメントの「カスタマイズの再呼び出し」を参照してください。

同様のプロセスを使用して、ローカルターミナルで AFT アカウントのカスタマイズを実行することもできます。AFT アカウントのカスタマイズから Terraform コードをローカルで呼び出すには、AFT 管理アカウントの CodeCommit から 「aft-グローバル-アカウント-カスタマイズ リポジトリ」の代わりに「aft-アカウント-カスタマイズ」リポジトリを複製します。

ツール

AWS サービス

  • AWS Control Tower は、規範的なベストプラクティスに従って、 AWS マルチアカウント環境のセットアップと管理に役立ちます。

  • AWS Command Line Interface (AWS CLI) は、コマンドラインシェルのコマンド AWS のサービス を通じて を操作するのに役立つオープンソースツールです。

その他のサービス

  • HashiCorp Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのを支援する Infrastructure as Code (IaC) ツールです。

  • Git」はオープンソースの分散型バージョン管理システムです。

コード

以下は、AFT が管理する Terraform コードをローカルで実行するために使用できる bash スクリプトの例です。このスクリプトを使用するには、このパターンの「エピック」セクションの手順に従ってください。

#! /bin/bash # Version: 1.1 2022-06-24 Unsetting AWS_PROFILE since, when set, it interferes with script operation # 1.0 2022-02-02 Initial Version # # Purpose: For use with AFT: This script runs the local copy of TF code as if it were running within AFT pipeline. # * Facilitates testing of what the AFT pipline will do # * Provides the ability to run terraform with custom arguments (like 'plan' or 'move') which are currently not supported within the pipeline. # # © 2021 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This AWS Content is provided subject to the terms of the AWS Customer Agreement # available at http://aws.amazon.com/agreement or other written agreement between # Customer and either Amazon Web Services, Inc. or Amazon Web Services EMEA SARL or both. # # Note: Arguments to this script are passed directly to 'terraform' without parsing nor validation by this script. # # Prerequisites: # 1. local copy of ct GIT repositories # 2. local backend.tf and aft-providers.tf filled with data for the target account on which terraform is to be run # Hint: The contents of above files can be obtain from the logs of a previous execution of the AFT pipeline for the target account. # 3. 'terraform' binary is available in local PATH # 4. Recommended: .gitignore file containing 'backend.tf', 'aft_providers.tf' so the local copy of these files are not pushed back to git readonly credentials=$(aws sts assume-role \ --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text ):role/AWSAFTAdmin \ --role-session-name AWSAFT-Session \ --query Credentials ) unset AWS_PROFILE export AWS_ACCESS_KEY_ID=$(echo $credentials | jq -r '.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $credentials | jq -r '.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $credentials | jq -r '.SessionToken') terraform "$@"

エピック

タスク説明必要なスキル

サンプルコードをローカルファイルとして保存します。

  1. このパターンの「コード」「 」セクションにある bash スクリプトの例をコピーして、コードエディターに貼り付けます。

  2. ファイルに ct_terraform.sh という名前を付けて、~/scripts~/bin などの専用フォルダ内にローカルに保存します。

AWS 管理者

サンプルコードを実行可能にします。

ターミナルウィンドウを開き、次のいずれかを実行して AWS AFT 管理アカウントを認証します。

  • AFT 管理アカウントへのアクセスに必要な権限が設定された既存の AWS CLI プロファイルを使用します。プロファイルを使用するには、次のコマンドを実行します。

    export AWS_PROFILE=<aft account profile name>
  • 組織が SSO を使用して にアクセスする場合は AWS、組織の SSO ページで AFT 管理アカウントの認証情報を入力します。

注記

組織に、 AWS 環境に認証情報を提供するカスタムツールがある場合もあります。

AWS 管理者

正しい AWS リージョンの AFT 管理アカウントへのアクセスを確認します。

重要

AFT 管理アカウントへの認証に使用したのと同じターミナルセッションを使用していることを確認してください。

  1. 次のコマンドを実行して AWS リージョン 、AFT デプロイの に移動します。

    export AWS_REGION=<aft_region>
  2. 正しいアカウントであることを確認します。

    1. 次のコマンドを実行します。

      aws code-commit list-repositories
    2. 出力に表示されるリポジトリが AFT 管理アカウントにあるリポジトリの名前と一致することを確認します。

AWS 管理者

AFT リポジトリコードを保存する新しいローカルディレクトリを作成します。

同じターミナルセッションから、次のコマンドを実行します。

mkdir my_aft cd my_aft
AWS 管理者

リモート AFT リポジトリコードを複製します。

  1. ローカルターミナルから次のコマンドを実行します。

    git clone codecommit::$AWS_REGION://aft-global-customizations
    注記

    わかりやすくするため、この手順と AFT ではメインのコードブランチのみを使用します。コード分岐を使用するには、ここにもコード分岐コマンドを入力します。しかし、AFT オートメーションがメインブランチからのコードを適用すると、メインブランチ以外から適用された変更はすべてロールバックされます。

  2. クローンされたディレクトリに移動します。

    cd aft-global-customizations/terraform
AWS 管理者
タスク説明必要なスキル

以前に実行した AFT パイプラインを開き、Terraform 設定ファイルをローカルフォルダーにコピーします。

注記

AFT パイプラインをローカルで実行するには、このエピックで作成された「backend.tf」と「aft-providers.tf」設定ファイルが必要です。これらのファイルはクラウドベースの AFT パイプライン内で自動的に作成されますが、パイプラインをローカルで実行するには手動で作成する必要があります。AFT パイプラインをローカルで実行するには、単一の AWS アカウント内でのパイプラインの実行を表す 1 つのファイルセットが必要です。

  1. AWS Control Tower 管理アカウントの認証情報を使用して にサインインし AWS マネジメントコンソール、 AWS CodePipeline コンソールを開きます。AFT をデプロイした AWS リージョン のと同じ にいることを確認します。

  2. 左のナビゲーションペインの [パイプライン] を選択します。

  3. #########-カスタマイズ-パイプラインを選択します。(########## は、Terraform コードをローカルで実行するために使用する AWS アカウント ID です)。

  4. 最後にマークされた実行」に「成功」の値が表示されていることを確認します。値が異なる場合は、AFT パイプラインでカスタマイズを再呼び出しする必要があります。詳細については、 AWS Control Tower ドキュメントの「カスタマイズの再呼び出し」を参照してください。

  5. 最新のランタイムを選択すると、詳細が表示されます。

  6. Apply-AFT-グローバルカスタマイズ」セクションで「Apply-Terraform」ステージを見つけてください。

  7. Apply-Terraform」ステージの「詳細」セクションを選択します。

  8. Apply-Terraform」ステージのランタイムログを検索してください。

  9. ランタイムログで、最初と最後の行が次のようになっているセクションを探してください。

    "\n\n aft-providers.tf ... "\n \n backend.tf"  
  10. これら2つのラベル間の出力をコピーし、ローカルTerraformフォルダ(ターミナルセッションのカレントワーキングディレクトリ)内にaft-providers.tf という名前のローカルファイルとして保存します。

    自動的に生成された providers.tf ステートメントの例

    ## Autogenerated providers.tf ## ## Updated on: 2022-05-31 16:27:45 ## provider "aws" { region = "us-east-2" assume_role { role_arn = "arn:aws:iam::############:role/AWSAFTExecution" } default_tags { tags = { managed_by = "AFT" } } }
  11. ランタイムログで、最初と最後の行が次のようになっているセクションを探してください。

    "\n\n tf ... "\n \n backend.tf"
  12. これら2つのラベル間の出力をコピーし、ローカルTerraformフォルダ(ターミナルセッションのカレントワーキングディレクトリ)内にtf という名前のローカルファイルとして保存します。

自動生成された backend.tf ステートメントの例

## Autogenerated backend.tf ## ## Updated on: 2022-05-31 16:27:45 ## terraform { required_version = ">= 0.15.0" backend "s3" { region = "us-east-2" bucket = "aft-backend-############-primary-region" key = "############-aft-global-customizations/terraform.tfstate" dynamodb_table = "aft-backend-############" encrypt = "true" kms_key_id = "########-####-####-####-############" role_arn = "arn:aws:iam::#############:role/AWSAFTExecution" } }
注記

backend.tfおよび aft-providers.tfファイルは AWS アカウント、特定の、AFT デプロイ、およびフォルダに関連付けられます。これらのファイルは、同じ AFT デプロイ内の「aft-global-customizations」リポジトリと「aft-account-customizations」リポジトリにあるかどうかによっても異なります。必ず、同じランタイムリストから両方のファイルを生成してください。

AWS 管理者
タスク説明必要なスキル

検証したい Terraform の設定の変更を実装します。

  1. 以下のコマンドを実行して、複製された「aft-グローバル-カスタマイズ」リポジトリに移動します。

    cd aft-global-customizations/terraform
    注記

    ファイル backend.tfaft-providers.tf は、このディレクトリにあります。このディレクトリには、「aft-グローバル-カスタマイズ」リポジトリの Terraform ファイルも含まれています。

  2. ローカルでテストしたい Terraform コードの変更を設定ファイルに組み込みます。

AWS 管理者

ct_terraform.sh スクリプトを実行し、出力を確認します。

  1. sh」スクリプトを含むローカルフォルダに移動します。

  2. 変更した Terraform コードを検証するには、以下のコマンドを実行してct_terraform.shスクリプトを実行します。

    ~/scripts/ct_terraform.sh apply
    terraform --help
    注記

    このステップでは、どの Terraform コマンドも実行できます。次のコマンドを実行して、Terraform コマンドの全リストを表示します。

  3. 変更をコミットして AFT リポジトリにプッシュバックする前に、コマンドの出力を確認し、コードの変更をローカルでデバッグします。

重要

 

  • ローカルで行われ、リモートリポジトリにプッシュバックされない変更は一時的なものであり、実行中の AFT パイプラインオートメーションによっていつでも元に戻される可能性があります。

  • AFT オートメーションは他のユーザーや AFT オートメーショントリガーによって呼び出される可能性があるため、いつでも実行できます。

  • AFT は常にリポジトリのメインブランチからコードを適用し、コミットされていない変更はすべて元に戻します。

AWS 管理者
タスク説明必要なスキル

.gitignore ファイルに backend.tf ファイルおよび aft-providers.tf ファイルへの参照を追加します。

以下のコマンドを実行して、作成したbackend.tf aft-providers.tfファイルを.gitignoreファイルに追加します。

echo backend.tf >> .gitignore echo aft-providers.tf >>.gitignore
注記

ファイルを .gitignore ファイルに移動することで、ファイルがコミットされてリモート AFT リポジトリにプッシュバックされることがなくなります。

AWS 管理者

コード変更をリモート AFT リポジトリにコミットしてプッシュします。

  1. 新しい Terraform 設定ファイルをリポジトリに追加するには、次のコマンドを実行します。

    git add <filename>
  2. 変更をコミットして CodeCommit のリモート AFT リポジトリにプッシュするには、次のコマンドを実行します。

    git commit -a git push
重要

この時点で 1 つの AWS アカウント みに適用されるまで、この手順に従うことで導入するコードが変更されます。

AWS 管理者
タスク説明必要なスキル

AFT が管理するすべてのアカウントに変更を適用します。

AFT によって管理 AWS アカウント される複数の に変更をロールアウトするには、 AWS Control Tower ドキュメントの「カスタマイズの再呼び出し」の手順に従います。

AWS 管理者