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

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

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

アレクサンドル・ポップ (AWS) とミハル・ゴーニアック (AWS) が制作

環境:本稼働

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

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

AWS サービス: AWS Control Tower

[概要]

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

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

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

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

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

前提条件と制限

前提条件

  • AWS Control Tower」を使用するアクティブな AWS マルチアカウント環境

  • 完全にデプロイされた AFT 環境

  • AWS コマンドラインインターフェイス (AWS CLI)、「インストール」および「設定

  • Code Commit 用の AWS CLI 認証情報ヘルパー」、インストールおよび設定

  • Python 3.x

  • Git ローカルマシンにインストールされて設定されている 。

  • git-remote-commit ユーティリティ、インストールおよび設定済み

  • Terraform」がインストールされ、構成されている (ローカルの Terraform パッケージのバージョンは AFT デプロイメントで使用されているバージョンと一致している必要がある)

制約事項

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

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

アーキテクチャ

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

  • AWS Control Tower Deployment でデプロイされた AFT インフラ

  • Terraform

  • Git

  • AWS CLI バージョン 2

自動化とスケール

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

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

ツール

サービス

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

  • AWS コマンドラインインターフェイス (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. 次のコマンドを実行して、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 設定ファイルをローカルフォルダーにコピーします。

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

  1. AWS Control Tower のマネジメントアカウント認証情報を使用して、AWS マネジメントコンソール (AWS マネジメントコンソール) にサインインします。次に、AWS CodePipeline コンソール を開きます。Fluent Bit をデプロイしたのと同様の 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 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-global-customizationsリポジトリとaft-account-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. 変更をコミットして AWS のリモート AFT リポジトリにプッシュするには CodeCommit、次のコマンドを実行します。

    git commit -a git push

重要:これまでにこの手順に従って導入したコード変更は、1 つの AWS アカウントにのみ適用されます。

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

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

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

AWS 管理者