ブートストラップパイプラインを使用して Account Factory for Terraform (AFT) を実装する - AWS 規範ガイダンス

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

ブートストラップパイプラインを使用して Account Factory for Terraform (AFT) を実装する

Amazon Web Services、Vinicius Elias と Edgar Costa Filho

概要

このパターンは、 の管理アカウントから AWS Control Tower Account Factory for Terraform (AFT) をデプロイするためのシンプルで安全な方法を提供します AWS Organizations。このソリューションの中核となるのは、Terraform パイプラインを作成して AFT 設定を自動化する CloudFormation テンプレートです。このパイプラインは、最初のデプロイやその後の更新に簡単に適応できるように設計されています。

セキュリティとデータの整合性が最優先事項であるため AWS、マネージドインフラストラクチャと設定の状態を追跡する重要なコンポーネントである Terraform 状態ファイルは、Amazon Simple Storage Service (Amazon S3) バケットに安全に保存されます。このバケットには、サーバー側の暗号化やパブリックアクセスをブロックするポリシーなど、いくつかのセキュリティ対策が設定されており、Terraform の状態を不正アクセスやデータ侵害から保護するのに役立ちます。

管理アカウントは環境全体をオーケストレーションおよび監視するため、重要なリソースです AWS Control Tower。このパターンは AWS ベストプラクティスに従っており、デプロイプロセスが効率的であるだけでなく、セキュリティとガバナンスの標準にも準拠し、 AWS 環境に AFT をデプロイするための包括的で安全で効率的な方法を提供します。

AFT の詳細については、AWS Control Tower のドキュメントを参照してください。

前提条件と制限

前提条件

  • 少なくとも管理アカウント、ログアーカイブアカウント、監査アカウント、および AFT 管理用の 1 つの追加アカウントを持つ基本的な AWS マルチアカウント環境。

  • 確立された AWS Control Tower 環境。CloudFormation テンプレートが管理アカウント内にデプロイされるため、管理アカウントが適切に設定されている必要があります。

  • AWS 管理アカウントに必要なアクセス許可。S3 バケット、 AWS Lambda 関数、 AWS Identity and Access Management (IAM) ロール、 AWS CodePipeline プロジェクトなどのリソースを作成および管理するには、十分なアクセス許可が必要です。

  • Terraform に精通していること。デプロイには Terraform 設定の生成と管理が含まれるため、Terraform の主要な概念とワークフローを理解していることが重要です。

制限事項

  • アカウントの AWS リソースクォータに注意してください。デプロイでは複数のリソースが作成され、サービスクォータに達するとデプロイプロセスが妨げられる可能性があります。

  • テンプレートは、Terraform および AWS のサービスの特定のバージョン用に設計されています。バージョンのアップグレードまたは変更のために、テンプレートの変更が必要になる場合があります。

  • テンプレートは、GitHub Enterprise などのセルフマネージド型バージョン管理システム (VCS) サービスには対応していません。

製品バージョン

  • Terraform バージョン 1.6.6 以降

  • AFT バージョン 1.11 以降

アーキテクチャ

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

  • CloudFormation

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon EventBridge

  • IAM

  • AWS Lambda

  • Amazon S3

ターゲットアーキテクチャ

以下の図に、このパターンで説明する実装を示します。

ブートストラップパイプラインを使用して AFT を実装するためのワークフロー。

ワークフローを構成する 3 つの主要なタスクは、リソースの作成、コンテンツの生成、パイプラインの実行です。

リソースの作成

このパターンで提供する CloudFormation テンプレートは、テンプレートのデプロイ時に選択するパラメータに応じて、必要なすべてのリソースを作成してセットアップします。少なくとも、このテンプレートは次のリソースを作成します。

  • AFT を実装するための CodePipeline パイプライン

  • AFT 実装に関連付けられている Terraform ステートファイルを保存するための S3 バケット

  • Terraform プランを実装し、パイプラインのさまざまな段階でコマンドを適用するための 2 つの CodeBuild プロジェクト

  • CodeBuild および CodePipeline サービスのための IAM ロール

  • パイプラインランタイムアーティファクトを保存するための 2 番目の S3 バケット

選択した VCS プロバイダー (CodeCommit または外部 VCS) に応じて、テンプレートは次のリソースを作成します。

  • CodeCommit の場合:

    • AFT Terraform ブートストラップコードを保存するための CodeCommit リポジトリ

    • main ブランチで CodeCommit リポジトリの変更をキャプチャするための EventBridge ルール

    • EventBridge ルール用の別の IAM ロール

  • GitHub といった他の外部 VCS プロバイダーの場合:

    • AWS CodeConnections 接続

また、VCS プロバイダーとして CodeCommit を選択した場合、Generate AFT Files パラメータに true を設定すると、テンプレートは次のコンテンツを生成するためにこれらの追加リソースを作成します。

  • 生成されたコンテンツを保存し、CodeCommit リポジトリのソースとして使用するための S3 バケット

  • 指定されたパラメータを処理し、適切なコンテンツを生成するための Lambda 関数

  • Lambda 関数を実行するための IAM 関数

  • テンプレートがデプロイされたときに Lambda 関数を実行する CloudFormation カスタムリソース

コンテンツの生成

AFT ブートストラップファイルとそのコンテンツを生成するために、ソリューションは Lambda 関数と S3 バケットを使用します。関数はバケット内にフォルダを作成し、フォルダ内に 2 つのファイル、つまり main.tfbackend.tf を作成します。関数は、提供された CloudFormation パラメータも処理し、これらのファイルに事前定義されたコードを入力し、それぞれのパラメータ値を置き換えます。

ファイルを生成するためのテンプレートとして使用されるコードを表示するには、ソリューションの GitHub リポジトリを参照してください。基本的に、ファイルは次のように生成されます。

main.tf

module "aft" { source = "github.com/aws-ia/terraform-aws-control_tower_account_factory?ref=<aft_version>" # Required variables ct_management_account_id = "<ct_management_account_id>" log_archive_account_id = "<log_archive_account_id>" audit_account_id = "<audit_account_id>" aft_management_account_id = "<aft_management_account_id>" ct_home_region = "<ct_home_region>" # Optional variables tf_backend_secondary_region = "<tf_backend_secondary_region>" aft_metrics_reporting = "<false|true>" # AFT Feature flags aft_feature_cloudtrail_data_events = "<false|true>" aft_feature_enterprise_support = "<false|true>" aft_feature_delete_default_vpcs_enabled = "<false|true>" # Terraform variables terraform_version = "<terraform_version>" terraform_distribution = "<terraform_distribution>" # VCS variables (if you have chosen an external VCS) vcs_provider = "<github|githubenterprise|gitlab|gitlabselfmanaged|bitbucket>" account_request_repo_name = "<org-name>/aft-account-request" account_customizations_repo_name = "<org-name>/aft-account-customizations" account_provisioning_customizations_repo_name = "<org-name>/aft-account-provisioning-customizations" global_customizations_repo_name = "<org-name>/aft-global-customizations" }

backend.tf

terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup.tfstate" } }

CodeCommit リポジトリの作成中に Generate AFT Files パラメータを true に設定すると、テンプレートは、生成されたコンテンツを格納する S3 バケットを main ブランチのソースとして使用し、リポジトリを自動的に入力します。

パイプラインの実行

リソースが作成され、ブートストラップファイルが設定されると、パイプラインが実行されます。最初のステージ (ソース) ではリポジトリのメインブランチからソースコードを取得し、2 番目のステージ (ビルド) では Terraform plan コマンドの実行と、確認すべき結果の生成を行います。3 番目のステージ (承認) では、パイプラインは手動アクションが最後のステージ (デプロイ) を承認または拒否するまで待機します。最後のステージでは、パイプラインは前の Terraform apply コマンドの結果を入力として使用して Terraform plan コマンドを実行します。最後に、クロスアカウントロールと管理アカウントのアクセス許可を使用して、AFT 管理アカウントで AFT リソースを作成します。

注記

外部 VCS プロバイダーを選択する場合は、VCS プロバイダー認証情報との接続を承認する必要があります。セットアップを完了するには、 AWS 「 デベロッパーツールコンソールドキュメント」の「保留中の接続の更新」のステップに従います。

ツール

AWS サービス

  • CloudFormation は、AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および リージョン全体のライフサイクルを通じて管理するために役立ちます。

  • AWS CodeBuild は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。 

  • AWS CodeCommit は、独自のソースコントロールシステムを管理することなく、Git リポジトリを非公開で保存および管理できるバージョン管理サービスです。

  • AWS CodePipeline は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。

  • AWS CodeConnections では、CodePipeline などの AWS リソースとサービスが GitHub などの外部コードリポジトリに接続できます。

  • AWS Lambda は、イベントに応じてコードを実行し、コンピューティングリソースを自動的に管理するコンピューティングサービスであり、本番稼働用の最新のサーバーレスアプリケーションをすばやく作成できます。

  • AWS SDK for Python (Boto3) は、Python アプリケーション、ライブラリ、またはスクリプトを と統合するのに役立つソフトウェア開発キットです AWS のサービス。

その他のツール

  • Terraform は、インフラストラクチャを安全かつ効率的に構築、変更、およびバージョニングできる Infrastructure as Code (IaC) ツールです。このツールには、コンピューティングインスタンス、ストレージ、ネットワークなどの下位レベルのコンポーネントと、DNS エントリや SaaS 機能などの上位レベルのコンポーネントが含まれます。

  • Python は、学習しやすく強力なプログラミング言語です。効率的な高レベルのデータ構造を備え、シンプルで効果的なアプローチによるオブジェクト指向プログラミングが可能です。

コードリポジトリ

このパターンのコードは GitHub 内の AFT bootstrap pipeline リポジトリで入手できます。

公式 AFT リポジトリについては、GitHub の「AWS Control Tower Account Factory for Terraform」を参照してください。

ベストプラクティス

提供された CloudFormation テンプレートを使用して AFT をデプロイする場合は、安全かつ効率的に実装を完了するために、ベストプラクティスに従うことが推奨されます。AFT の実装と運用に関する主要なガイドラインおよび推奨事項は次のとおりです。

  • パラメータの詳細な確認: CloudFormation テンプレートの各パラメータを慎重に確認し、理解します。AFT が正しくセットアップされ、機能するには、正確なパラメータ設定が不可欠です。

  • テンプレートの定期的な更新: テンプレートを最新の AWS 機能と Terraform バージョンで更新します。定期的に更新することで、新機能の活用やセキュリティの維持が可能になります。

  • バージョニング: AFT モジュールのバージョンを固定し、可能であれば別の AFT デプロイを使用してテストします。

  • スコープ: AFT は、インフラストラクチャのガードレールとカスタマイズをデプロイするためにのみ使用します。アプリケーションのデプロイには使用しないでください。

  • リンティングと検証: AFT パイプラインには、リンティングされ検証された Terraform 設定が必要です。この設定を AFT リポジトリにプッシュする前に、リンティング、検証、テストを実行します。

  • Terraform モジュール: 再利用可能な Terraform コードをモジュールとして構築し、常に組織の要件に合わせて Terraform と AWS プロバイダーのバージョンを指定します。

エピック

タスク説明必要なスキル

AWS Control Tower 環境を準備します。

AWS Control Tower AWS 環境で をセットアップして設定し、 の一元化された管理とガバナンスを確保します AWS アカウント。詳細については、 AWS Control Tower ドキュメントの「 の開始方法 AWS Control Tower」を参照してください。

クラウド管理者

AFT 管理アカウントを作成します。

AWS Control Tower Account Factory を使用して、AFT 管理アカウント AWS アカウント として機能する新しい を起動します。詳細については、 AWS Control Tower ドキュメントのAWS Service Catalog 「Account Factory でアカウントをプロビジョニングする」を参照してください。

クラウド管理者
タスク説明必要なスキル

CloudFormation のテンプレートを起動します。

このエピックでは、このソリューションに付属の CloudFormation テンプレートをデプロイして、 AWS 管理アカウントに AFT ブートストラップパイプラインを設定します。パイプラインは、前のエピックで設定した AFT 管理アカウントに AFT ソリューションをデプロイします。

ステップ 1: CloudFormation コンソールを開く

  • にサインイン AWS マネジメントコンソール し、 CloudFormation コンソールを開きます。正しい AWS Control Tower メインリージョン内で動作していることを確認します。

ステップ 2: 新しいスタックを作成する

  1. 新しいスタックを作成することを選択します。

  2. テンプレートファイルをアップロードするオプションを選択し、このパターンに付属している CloudFormation テンプレートをアップロードします。

ステップ 3: スタックパラメータを設定する

  • VCS Provider: 使用するバージョン管理システム (VCS) のプロバイダーを選択します。GitHub などの外部 VCS を選択できます。または、アカウントでサービスの使用が許可されている場合は CodeCommit を使用できます。

  • Repository Name: AFT ブートストラップモジュールを保存するためのリポジトリ名を指定します。外部 VCS プロバイダーの場合は、組織名を含むフルパスを使用します (例: my-github-org/my-repo)。

  • Branch Name: ソースリポジトリブランチを指定します。

  • CodeBuild Docker Image: CodeBuild Docker ベースイメージとして使用するファイルを選択します。

  • VCS プロバイダーに CodeCommit 以外のオプションを設定する場合は、ステップ 8 に進みます。

ステップ 4: ファイル生成設定を決定する

  • VCS プロバイダーとして CodeCommit を選択した場合は、デフォルトの AFT デプロイファイルの生成を制御するために Generate AFT Files パラメータを使用できます。このパラメータは次のように設定します。

    • AFT デプロイファイルを自動的に作成し、指定したリポジトリに保存するには、true に設定します。

    • ファイルの作成を手動で処理する場合、またはファイルが既に配置されている場合は、false に設定します。

  • false を選択した場合は、ステップ 8 に進みます。それ以外の場合は、まずステップ 5~7 を実行します。

ステップ 5: アカウント AWS Control Tower の詳細と AFT アカウントの詳細を入力する

  • Generate AFT Files パラメータを に設定する場合はtrue、次の AWS Control Tower および AFT アカウント固有の情報を指定します。

    • Log Archive Account ID: のログアーカイブアカウント ID の ID AWS Control Tower。

    • Audit Account ID: の監査アカウントの ID AWS Control Tower。

    • AFT Management Account ID: 最初のエピックで作成した AFT 管理アカウントの ID。

    • AFT Main Region および AFT Secondary Region: AFT デプロイ AWS リージョン のメインとセカンダリ。

ステップ 6: AFT オプションを設定する

  • メトリクスレポートをセットアップします。

    • AFT Enable Metrics Reporting: AFT メトリクスレポートを有効または無効にします。詳細については、 AWS Control Tower ドキュメントの「運用メトリクス」を参照してください。

  • AFT 機能のオプションを設定します。

    • Enable AFT CloudTrail Data Events: すべての AFT マネージドアカウントで CloudTrail データイベントを有効にします。詳細については、 AWS Control Tower ドキュメントAWS CloudTrail のデータイベントを参照してください。

    • Enable AFT Enterprise Support: すべての AFT マネージドアカウントでエンタープライズサポートを有効にします。詳細については、 AWS Control Tower ドキュメントのAWS 「エンタープライズサポートプラン」を参照してください。

    • Enable AFT Delete Default VPC: AFT 管理アカウントのすべての VPC のみを削除します。詳細については、 AWS Control Tower ドキュメントの AWS 「デフォルトの VPC を削除する」を参照してください。

ステップ 7: バージョンを指定する

  • AFT Terraform Version: AFT パイプラインで使用する Terraform のバージョンを選択します。

  • AFT Version: デプロイする AFT バージョンを定義します。最新の AFT バージョンを使用するには、デフォルト設定 (latest) のままにします。

ステップ 8: スタックを確認して作成する

  • すべてのパラメータと設定を確認します。すべてが整ったら、スタックの作成に進みます。

ステップ 9: スタックの作成をモニタリングする

  • CloudFormation は、定義したリソースをプロビジョニングして設定します。CloudFormation コンソールでスタック作成プロセスをモニタリングします。このプロセスには数分かかることがあります。

ステップ 10: デプロイを検証する

  • スタックのステータスが CREATE_COMPLETE と表示されたら、すべてのリソースが正しく作成されていることを検証します。

  • [出力] セクションで、TerraformBackendBucketName の値を書き留めます。

クラウド管理者
タスク説明必要なスキル

オプション 1: 外部 VCS の AFT ブートストラップリポジトリを設定します。

VCS プロバイダーを外部 VCS (CodeCommit ではなく) に設定する場合は、以下の手順に従います。

(オプション) CloudFormation テンプレートをデプロイした後、新しく作成した AFT ブートストラップリポジトリの内容を設定または検証し、パイプラインが正常に実行されたかどうかをテストできます。

ステップ 1: 接続を更新する

  1. CodePipeline コンソールのナビゲーションペインで、[設定][接続] の順に選択します。

  2. aft-vcs-connection 接続を選択します。ステータスは Pending である必要があります。

  3. [保留中の接続を更新] を選択します。開発者用ツールコンソールドキュメントの「Update a pending connection」の指示に従ってください。

  4. 接続のステータスが Available の場合、次のステップに進みます。

ステップ 2: リポジトリに入力する

  1. 外部 VCS 認証情報を使用して、テンプレートで指定したリポジトリをローカルマシンにクローンします。デフォルト名のままにした場合、リポジトリの名前は aft-setup となります。

  2. リポジトリで terraform という名前のフォルダを作成し、そこに 2 つの空のファイル、つまり backend.tf および main.tf を格納します。

  3. backend.tf ファイルを開き、次のコードスニペットを追加します。

    terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup" } }

    ファイルを次のように編集します。

    • <aft-main-region> はメイン AFT リージョンに置き換えてください。これは AWS Control Tower メインリージョンと一致する必要があります。

    • <s3-bucket-name> は Terraform バックエンドバケットの名前に置き換えてください。これは、前にデプロイした CloudFormation テンプレートによって生成された TerraformBackendBucketName 出力で確認できます。

  4. main.tf ファイルを開き、AFT リポジトリで利用可能ないずれかの例を使用して、AFT をデプロイします。例えば、推奨 VCS プロバイダー (CodeCommit、GitHub、または Bitbucket) を使用するか、AFT VPC をカスタマイズすることができます。その他の AFT 入力オプションについては、AFT リポジトリの README ファイルを参照してください。

ステップ 2: 変更をコミットおよびプッシュする

  • フォルダとファイルを作成して入力を完了したら、変更を確認し、コードをリポジトリにアップロードします。パイプラインは自動的に開始され、ソースステージとビルドステージを実行し、デプロイステージの前に承認アクションを待機します。

クラウド管理者

オプション 2: CodeCommit の AFT ブートストラップリポジトリを設定します。

VCS プロバイダーに CodeCommit を設定する場合は、以下の手順に従います。

(オプション) CloudFormation テンプレートをデプロイした後、新しく作成した AFT ブートストラップリポジトリの内容を設定または検証し、パイプラインが正常に実行されたかどうかをテストできます。

Generate AFT Files パラメータを true に設定した場合は、次のストーリー (パイプラインの検証) に進みます。

ステップ 1: リポジトリに入力する

  1. AWS CodeCommit コンソールを開き、新しく作成したリポジトリを選択します。デフォルト名のままにした場合、リポジトリ名は aft-setup である必要があります。

  2. SSH、HTTPS、または HTTPS (GRC) を使用してリポジトリをローカルマシンにクローンし、エディタで開きます。

  3. terraform という名前のフォルダを作成し、その中に 2 つの空のファイル、つまり backend.tf および main.tf を格納します。

  4. backend.tf ファイルを開き、次のコードスニペットを追加します。

    terraform { backend "s3" { region = "<aft-main-region>" bucket = "<s3-bucket-name>" key = "aft-setup" } }

    ファイルを次のように編集します。

    • <aft-main-region> はメイン AFT リージョンに置き換えてください。これは AWS Control Tower メインリージョンと一致する必要があります。

    • <s3-bucket-name> は Terraform バックエンドバケットの名前に置き換えてください。これは、前にデプロイした CloudFormation テンプレートによって生成された TerraformBackendBucketName 出力で確認できます。

  5. main.tf ファイルを開き、AFT リポジトリで利用可能ないずれかの例を使用して、AFT をデプロイします。例えば、推奨のバージョン管理システム (VCS) プロバイダー (CodeCommit、GitHub、または Bitbucket) を使用するか、AFT VPC をカスタマイズすることができます。その他の AFT 入力オプションについては、AFT リポジトリの README ファイルを参照してください。

ステップ 2: 変更をコミットおよびプッシュする

  • フォルダとファイルを作成して入力を完了したら、変更を確認し、コードをリポジトリにアップロードします。パイプラインは自動的に開始され、ソースステージとビルドステージを実行し、デプロイステージの前に承認アクションを待機します。

クラウド管理者

AFT ブートストラップパイプラインを検証します。

ステップ 1: パイプラインを表示する

  • CodePipeline コンソールを開き、aft-bootstrap-pipeline パイプラインが正常に開始されたかどうかを確認します。Terraform プランを実行しているか、手動承認アクションを待機している必要があります。

ステップ 2: Terraform プランの結果を承認する

  • ビルドステージの実行ログを確認して Terraform プランの結果を確認し、承認ステージで実行を承認または拒否することができます。承認すると、パイプラインは指定された AFT 管理アカウントでの AFT リソースのデプロイを開始します。

ステップ 3: デプロイを待機する

  • パイプラインが正常に実行されるまで待機します。処理には約 30 分かかります。発生する可能性のある障害は、多くの場合 API クォータが原因で発生します。このような場合は、パイプラインを再実行してデプロイを続行できます。

ステップ 4: 作成されたリソースを確認する

  • AFT 管理アカウントにアクセスし、リソースが作成されていることを確認します。

クラウド管理者

トラブルシューティング

問題ソリューション

CloudFormation テンプレートに含まれるカスタム Lambda 関数がデプロイ中に失敗します。

Lambda 関数の Amazon CloudWatch Logs をチェックして、エラーを特定します。ログは詳細情報を提供し、問題を特定するのに役立ちます。Lambda 関数に必要なアクセス許可が付与されていて、環境変数が正しく設定されていることを確認してください。

アクセス許可が不十分であることが原因で、リソースの作成または管理で障害が発生します。

Lambda 関数、CodeBuild、およびデプロイに関連するその他のサービスにアタッチされている IAM ロールとポリシーを確認します。必要なアクセス許可が付与されていることを確認します。アクセス権限に問題がある場合は、IAM ポリシーを調整して必要なアクセス許可を付与します。

CloudFormation テンプレートの古いバージョンを新しいバージョン AWS のサービス または Terraform バージョンで使用している。

CloudFormation テンプレートを定期的に更新して、最新の AWS および Terraform リリースと互換性を持たせます。バージョン固有の変更や要件については、リリースノートまたはドキュメントを確認してください。

デプロイ中に AWS のサービス クォータに達します。

パイプラインをデプロイする前に、S3 AWS のサービス バケット、IAM ロール、Lambda 関数などのリソースのクォータを確認します。必要に応じてクォータの引上げをリクエストします。詳細については、 AWS ウェブサイトのAWS のサービス 「クォータ」を参照してください。

CloudFormation テンプレートの入力パラメータが正しくないためにエラーが発生します。

タイプミスや値の誤りがないか、すべての入力パラメータを再確認します。アカウント ID やリージョン名などのリソース識別子が正確であることを確認してください。

関連リソース

このパターンを正常に実装するには、次のリソースを確認してください。これらのリソースは、 CloudFormationを使用して AFT をセットアップおよび管理する際の貴重な追加情報とガイダンスを提供します。

AWS ドキュメント:

IAM ポリシーとベストプラクティス:

Terraform オン AWS:

AWS のサービス クォータ:

  • AWS のサービス クォータは、 AWS のサービス クォータの表示方法と引き上げをリクエストする方法に関する情報を提供します。