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

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

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

作成者: Vinicius Elias (AWS) と Edgar Costa Filho (AWS)

コードリポジトリ: aft-bootstrap-pipeline

環境:本稼働

テクノロジー: 管理とガバナンス、インフラストラクチャ

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

AWS サービス: AWS CodeBuild、AWS CodeCommit、AWS CodePipeline、AWS Control Tower、AWS Organizations

[概要]

このパターンは、 の管理アカウントから AWS Control Tower Account Factory for Terraform (AFT) をデプロイするためのシンプルで安全な方法を提供します AWS Organizations。このソリューションの中核となるのは、Terraform パイプラインを作成して AFT 設定を自動化する AWS 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 のサービス。バージョンのアップグレードまたは変更には、テンプレートの変更が必要になる場合があります。

製品バージョン

  • Terraform バージョン 1.5.7 以降

  • AFT バージョン 1.11.1 以降

アーキテクチャ

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

  • AWS CloudFormation

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • Amazon EventBridge

  • IAM

  • AWS Lambda

  • Amazon S3

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

次の図は、このパターンで説明されている実装を示しています。

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

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

リソースの作成

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

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

  • AFT 実装に関連付けられている Terraform 状態ファイルを保存する S3 バケット

  • CodePipeline パイプライン

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

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

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

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

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

さらに、 CloudFormation テンプレートの Generate AFT Filesパラメータを に設定するとtrue、テンプレートはこれらの追加リソースを作成してコンテンツを生成します。

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

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

  • Lambda 関数を実行する IAM 関数

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

コンテンツの生成

AFT ブートストラップファイルとそのコンテンツを生成するために、ソリューションは Lambda 関数と S3 バケットを使用します。この関数はバケットにフォルダを作成し、フォルダ内に main.tfと の 2 つのファイルを作成しますbackend.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>" }

backend.tf

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

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

パイプラインの実行

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

ツール

AWS サービス

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

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

  • AWS CodeCommit は、独自のソース管理システムを管理することなく、Git リポジトリをプライベートに保存および管理できるようにするバージョン管理サービスです。

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

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

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

その他のツール

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

  • Python は、学習しやすく強力なプログラミング言語です。効率的な高レベルのデータ構造を持ち、オブジェクト指向プログラミングに対してシンプルかつ効果的なアプローチを提供します。

コードリポジトリ

このパターンのコードは、 GitHub AFT ブートストラップパイプラインリポジトリ にあります。

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

ベストプラクティス

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

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

  • テンプレートの定期的な更新: テンプレートを最新の AWS 機能と Terraform バージョンで更新しておいてください。定期的に更新することで、新機能を活用してセキュリティを維持できます。

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

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

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

  • 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 ドキュメントの「Account Factory で AWS Service Catalog アカウントをプロビジョニングする」を参照してください。

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

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

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

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

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

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

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

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

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

  • Repository Name: AFT ブートストラップモジュールを保存するためのリポジトリ名を指定します。

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

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

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

  • Generate AFT Files パラメータは、デフォルトの AFT デプロイファイルを生成するかどうかを制御します。このパラメータを次のように設定します。

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

    • false ファイルの作成を手動で処理する場合、またはファイルが既にある場合。

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

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

  • 入力 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 管理アカウントのすべての VPCs のみを削除します。詳細については、 AWS Control Tower ドキュメントの AWS 「デフォルト VPC の削除」を参照してください。

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

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

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

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

  • すべてのパラメータと設定を確認します。すべてが順不同の場合は、スタックの作成に進みます。

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

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

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

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

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

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

AFT ブートストラップリポジトリを入力します。

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

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

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

  1. AWS CodeCommit コンソールを開き、新しく作成されたリポジトリを選択します。デフォルト名を保持した場合、リポジトリは と呼ばれますaft-setup

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

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

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

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

    ファイルで:

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

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

  5. main.tf ファイルを開き、AFT リポジトリで利用可能な例のいずれかを使用して AFT をデプロイします。例えば、任意のバージョン管理システム (VCS) プロバイダー (CodeCommit、、または Bitbucket) を使用したり GitHub、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 ログをチェックして、エラーを特定します。ログには詳細情報が表示され、特定の問題を特定するのに役立ちます。Lambda 関数に必要なアクセス許可があり、環境変数が正しく設定されていることを確認します。

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

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

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

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

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

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

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

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

関連リソース

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

AWS ドキュメント:

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

の Terraform AWS:

AWS のサービス クォータ:

  • AWS のサービス クォータには、 AWS のサービス クォータの表示方法と引き上げをリクエストする方法に関する情報が記載されています。