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

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

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

作成者: Alexandru Pop (AWS) と Michal Gorniak (AWS)

環境:本稼働

テクノロジー: インフラストラクチャ; DevOps; モダナイゼーション; DevelopmentAndTesting

ワークロード: オープンソース

AWS サービス: AWS Control Tower

[概要]

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

コード開発中、Terraform インフラストラクチャをローカルでAFTパイプラインの外部でコード (IaC ) としてテストすると便利です。このパターンは、次を実行する方法を説明しています。

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

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

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

前提条件と制限

前提条件

機能制限

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

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

アーキテクチャ

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

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

  • Terraform

  • Git

  • AWS CLI バージョン 2

自動化とスケール

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

同様のプロセスを使用して、ローカルターミナルでAFTアカウントのカスタマイズを実行することもできます。AFT アカウントのカスタマイズから Terraform コードをローカルで呼び出すには、 AFT管理アカウントの CodeCommit からaft-account-customizations リポジトリではなくaft-global-account-customizationsリポジトリをクローンします。

ツール

AWS サービス

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

  • AWS コマンドラインインターフェイス (AWS CLI) は、コマンドラインシェル内のコマンドを介してAWSサービスとやり取りするのに役立つオープンソースツールです。

その他のサービス

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

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

コード

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

#! /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 管理者

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

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

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

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

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

AWS 管理者

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

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

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

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

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

    aws code-commit list-repositories
    • 次に、出力にリストされているリポジトリが、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 設定ファイルをローカルフォルダにコピーします。

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

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

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

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

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

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

  6. Apply-AFT-Global-Customizations セクションで、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 backup.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 = "cbdc21d6-e04d-4c37-854f-51e199cfcb7c" kms_key_id = "########-####-####-####-############" role_arn = "arn:aws:iam::#############:role/AWSAFTExecution" } }

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

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

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

  1. 次のコマンドを実行して、クローンされたaft-global-customizationsリポジトリに移動します。

    cd aft-global-customizations/terraform

    注:ファイルbackend.tf aft-providers.tf は、このディレクトリにあります。ディレクトリには、aft-global-customizations リポジトリからの Terraform ファイルも含まれます。

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

AWS 管理者

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

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

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

    ~/scripts/ct_terraform.sh apply

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

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

重要:

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

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

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

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

バックエンドの.tf ファイルと aft-providers.tf ファイルへの参照を.gitignore ファイルに追加します。

以下のコマンドを実行して、作成した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. 変更をコミットして のリモートAFTリポジトリにプッシュするにはAWS CodeCommit、次のコマンドを実行します。

    git commit -a git push

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

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

によって管理されるすべてのアカウントに変更をロールアウトしますAFT。

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

AWS 管理者