を使用して Terraform 設定を検証する CI/CD パイプラインを作成する AWS CodePipeline - AWS 規範ガイダンス

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

を使用して Terraform 設定を検証する CI/CD パイプラインを作成する AWS CodePipeline

作成者: Aromal Raj Jayarajan (AWS) と Vijesh Vijayakumaran Nair (AWS)

コードリポジトリ: aws-codepipeline-terraform-cicd-samples

環境:PoC またはパイロット

テクノロジー: DevOps

ワークロード:その他すべてのワークロード

AWS サービス: AWS CodeBuild、AWS CodeCommit、AWS CodePipeline、Amazon S3、AWSアイデンティティとアクセス管理

[概要]

注意: AWS CodeCommit は、新しいお客様では利用できなくなりました。の既存のお客様は、通常どおりサービスを AWS CodeCommit 引き続き使用できます。詳細はこちら

このパターンは、 によってデプロイされた継続的統合と継続的配信 (CI/CD) パイプラインを使用して HashiCorp Terraform 設定をテストする方法を示していますAWS CodePipeline。

Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理する上で役立つコマンドラインインターフェイスアプリケーションです。このパターンで提供されるソリューションは、次の 5 つのCodePipeline ステージを実行して Terraform 設定の整合性を検証するのに役立つ CI/CD パイプラインを作成します。

  1. “checkout” は、AWS CodeCommit リポジトリからテストする Terraform 設定をプルします。

  2. “validate” は、tfsec 、TFLintおよび checkov を含む Infrastructure as Code (IaC ) 検証ツールを実行します。このステージでは、次の Terraform IaC 検証コマンドも実行されます: terraform validate および terraform fmt

  3. “plan” は、Terraform 構成が適用された場合にインフラストラクチャにどのような変更が適用されるかを示します。

  4. “apply” は、生成された計画を使用して、必要なインフラストラクチャをテスト環境にプロビジョニングします。

  5. “destroy” は、“apply” ステージ中に作成されたテストインフラストラクチャを削除します。

前提条件と制限

前提条件

  • アクティブなAWSアカウント

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

  • ローカルマシンにインストールされて構成されている Git

  • ローカルマシンにインストールされ、構成済みの Terraform

制約事項

  • このパターンのアプローチはAWS CodePipeline 、1 つのAWSアカウントとAWSリージョンにのみデプロイされます。マルチアカウントおよびマルチリージョンデプロイには、構成の変更が必要です。

  • このパターンがプロビジョニングする AWS Identity and Access Management (IAM) ロール (codepipeline_iam_role ) は、最小権限の原則に従います。このIAMロールのアクセス許可は、パイプラインが作成する必要がある特定のリソースに基づいて更新する必要があります。

製品バージョン

  • AWS CLIバージョン 2.9.15 以降

  • Terraform バージョン 1.3.7 以降:

アーキテクチャ

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

  • AWS CodePipeline

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS IAM

  • Amazon Simple Storage Service (Amazon S3)

  • AWS キー管理サービス (AWS KMS)

  • Terraform

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

次の図は、 で Terraform 設定をテストするための CI/CD パイプラインワークフローの例を示しています CodePipeline。

AWS CI/CD パイプラインを使用して Terraform 設定をテストするアーキテクチャ。

この図表は、次のワークフローを示しています:

  1. では CodePipeline、AWSユーザーは で terraform apply コマンドを実行して Terraform プランで提案されたアクションを開始しますAWSCLI。

  2. AWS CodePipeline は、 CodeCommit、 CodeBuild、KMSおよび Amazon S3 AWS へのアクセスに必要なポリシーを含むIAMサービスロールを引き受けます。

  3. CodePipeline は“checkout”パイプラインステージを実行して、テスト用のAWS CodeCommit リポジトリから Terraform 設定をプルします。

  4. CodePipeline は“validate”ステージを実行して、IaC 検証ツールを実行し、 CodeBuild プロジェクトで Terraform IaC 検証コマンドを実行して Terraform 設定をテストします。

  5. CodePipeline は“plan”ステージを実行して、Terraform 設定に基づいて CodeBuild プロジェクトに計画を作成します。AWS ユーザーは、変更がテスト環境に適用される前に、この計画を確認できます。

  6. Code Pipeline は、 CodeBuild プロジェクトを使用してテスト環境で必要なインフラストラクチャをプロビジョニングすることで、“apply”ステージを実行して計画を実装します。

  7. CodePipeline は“destroy”ステージを実行します。これは、 CodeBuild を使用して、“apply”ステージ中に作成されたテストインフラストラクチャを削除します。

  8. Amazon S3 バケットにはパイプラインアーティファクトが格納されます。パイプラインアーティファクトは、AWSKMSカスタマーマネージドキー を使用して暗号化および復号されます。

ツール

ツール

AWS サービス

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

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

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

  • AWS Identity and Access Management (IAM) は、誰が認証され、誰に使用を許可されているかを制御することで、AWSリソースへのアクセスを安全に管理します。

  • AWS Key Management Service (AWS KMS) は、暗号化キーを作成および制御してデータを保護するのに役立ちます。

  • Amazon Simple Storage Service (Amazon S3) は、任意のデータ量を保存、保護、取得する際に役立つクラウドベースのオブジェクトストレージサービスです。

その他のサービス

  • HashiCorp Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理するためのコマンドラインインターフェイスアプリケーションです。

コード

このパターンのコードは、 リポジトリで GitHub aws-codepipeline-terraform-cicdsamples使用できます。リポジトリには、このパターンで概説されているターゲットアーキテクチャの作成に必要な Terraform 構成が含まれています。

エピック

タスク説明必要なスキル

GitHub リポジトリをクローンします。

ターミナルウィンドウで次のコマンドを実行して、 GitHubaws-codepipeline-terraform-cicdsamplesリポジトリをクローンします。

git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git

詳細については、 GitHub ドキュメントの「リポジトリのクローン作成」を参照してください。

DevOps エンジニア

Terraform 変数定義ファイルを作成する。

ユースケース要件に基づいて terraform.tfvars ファイルを作成します。クローン作成したリポジトリにある examples/terraform.tfvars ファイル内の変数を更新できます。

詳細については、Terraform ドキュメントの「ルートモジュール変数への値の割り当て」を参照してください。

注: リポジトリの Readme.md ファイルには、必要な変数に関する詳細情報が含まれています。

DevOps エンジニア

を Terraform プロバイダーAWSとして設定します。

  1. コードエディタで、クローン作成したリポジトリの main.tf ファイルを開きます。

  2. ターゲットAWSアカウントへの接続を確立するために必要な設定を追加します。

詳細については、Terraform ドキュメントのAWS「プロバイダー」を参照してください。

DevOps エンジニア

Amazon S3 レプリケーションバケットを作成するための Terraform プロバイダー構成を更新する。

  1. 次のコマンドを実行して、リポジトリの S3 ディレクトリを開きます。

    cd ./modules/s3
  2. tf ファイル内の region 値を更新して、Amazon S3 レプリケーションバケットを作成するための Terraform プロバイダー構成を更新します。Amazon S3 がオブジェクトをクローンするリージョンを必ず入力してください。

  3. (オプション) デフォルトでは、Terraform はローカル状態のファイルを使用して状態管理を行います。Amazon S3 をリモートバックエンドとして追加する場合は、Terraform 構成を更新する必要があります。詳細については、Terraform ドキュメントの「バックエンドの構成」を参照してください。

注: レプリケーションを使用すると、Amazon S3 バケット間でオブジェクトを自動で非同期的にコピーできます。

DevOps エンジニア

Terraform 構成を初期化します。

Terraform 構成ファイルを含む作業ディレクトリを初期化するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。

terraform init
DevOps エンジニア

Terraform プランを作成します。

Terraform プランを作成するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。

terraform plan --var-file=terraform.tfvars -out=tfplan

注: Terraform は構成ファイルを評価して、宣言されたリソースのターゲット状態を判断します。次に、ターゲットの状態を現在の状態と比較し、プランを作成します。

DevOps エンジニア

Terraform プランを検証します。

Terraform プランを確認し、ターゲットAWSアカウントで必要なアーキテクチャが設定されていることを確認します。

DevOps エンジニア

ソリューションをデプロイします。

  1. Terraform プランを適用するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。

    terraform apply "tfplan"
  2. yes」と入力して、リソースをデプロイすることを確認します。

注: Terraform は、構成ファイルに宣言されているターゲット状態を達成するために、インフラストラクチャを作成、更新、または破棄します。

DevOps エンジニア
タスク説明必要なスキル

ソースコードリポジトリをセットアップします。

  1. Terraform の出力から、検証したい Terraform 構成を含むリポジトリのソースリポジトリの詳細を取得します。

  2. AWS マネジメントコンソールにサインインします。次に、CodeCommit コンソール を開きます。

  3. main という名前のソースリポジトリに、新しいブランチを作成します。手順については、 CodeCommit ドキュメントの「 でブランチを作成するAWS CodeCommit」を参照してください。

  4. ソースリポジトリmain ブランチをローカルワークステーションにクローン作成します。手順については、 CodeCommit ドキュメントのAWSCLI「認証情報ヘルパーを使用した Windows 上のAWS CodeCommit リポジトリHTTPSへの接続のセットアップ手順」を参照してください。

  5. 次のコマンドを実行して、 GitHubaws-codepipeline-terraform-cicdsamplesリポジトリから フォルダをコピー templatesします。

    cp -r templates $YOUR_CODECOMMIT_REPO_ROOT

    注:templates このフォルダには、ソースリポジトリのルートディレクトリのビルド仕様ファイルと検証スクリプトが含まれています

  6. 必要な Terraform IaC 構成をソースリポジトリのルートフォルダに追加します。

  7. リモートバックエンドの詳細をプロジェクトの Terraform 構成に追加します。詳細については、「Terraform ドキュメント」の S3 を参照してください。

  8. (オプション) templates フォルダ内の変数を更新して、構成済みのスキャンやツール変更バージョンを有効または無効にしたり、カスタムスクリプトファイルでディレクトリを指定したりします。詳細については、このパターンの「追加情報」セクションを参照してください。

  9. 変更をソースリポジトリmain ブランチにプッシュします。

DevOps エンジニア

パイプラインのステージを検証します。

  1. AWS マネジメントコンソールにサインインし、CodePipeline コンソール を開きます。

  2. 前の Epic セクションの terraform apply "tfplan" コマンドから生成された出力で、生成された の名前を見つけますCodePipeline

  3. CodePipeline コンソールでパイプラインを開き、変更のリリース を選択します。

  4. パイプラインの各ステージを確認し、予測どおりに機能していることを確認します。

詳細については、「 ユーザーガイド」の「パイプラインの詳細と履歴の表示 (コンソール)」を参照してください。 AWS CodePipeline

重要: ソースリポジトリのメインブランチに変更がコミットされると、テストパイプラインは自動的に有効になります。

DevOps エンジニア

レポート出力を確認します。

  1. CodePipeline コンソール の左側のナビゲーションペインで、ビルド を選択します。次に、[レポート履歴] を選択します。

  2. パイプラインが生成する tfsec と checkov のスキャンレポートを確認します。このレポートは、視覚化とグラフィックにより問題を特定するのに役立ちます。

注: <project_name>-validate CodeBuild プロジェクトは“validate”、ステージ中にコードの脆弱性レポートを生成します。

DevOps エンジニア
タスク説明必要なスキル

パイプラインと関連リソースをクリーンアップします。

AWS アカウントからテストリソースを削除するには、クローンされたリポジトリのルートフォルダで次のコマンドを実行します。

terraform destroy --var-file=terraform.tfvars
DevOps エンジニア

トラブルシューティング

問題ソリューション

“apply” ステージ中にAccessDenied エラーが表示されます。

  1. “apply” ステージに関連付けられた CodeBuild プロジェクトの実行ログを確認して、アクセスIAM許可が欠落しているかどうかを確認します。詳細については、AWS CodeBuild 「 ユーザーガイド」の「 でビルドの詳細を表示するAWS CodeBuild」を参照してください。

  2. コードエディタで、クローン作成したリポジトリのmodules フォルダを開きます。次に、iam-role フォルダに移動し、そのフォルダにある main.tf ファイルを開きます。

  3. codepipeline_policy ステートメントに、 AWS アカウントのリソースのプロビジョニングに必要なIAMポリシーを追加します。

関連リソース

追加情報

カスタム Terraform モジュール

以下は、このパターンで使用されるカスタム Terraform モジュールのリストです。

  • codebuild_terraform は、パイプラインの各ステージを形成する CodeBuild プロジェクトを作成します。

  • codecommit_infrastructure_source_repo はソース CodeCommit リポジトリをキャプチャして作成します。

  • codepipeline_iam_role はパイプラインに必要なIAMロールを作成します。

  • codepipeline_kms は、Amazon S3 オブジェクトの暗号化と復号に必要なAWSKMSキーを作成します。

  • codepipeline_terraform はソース CodeCommit リポジトリのテストパイプラインを作成します。

  • s3_artifacts_bucket は、Amazon S3 バケットを作成して、パイプラインアーティファクトを管理します。

ビルド仕様ファイル

以下は、このパターンが各パイプラインステージを実行するために使用するビルド仕様 (buildspec) ファイルのリストです。

  • buildspec_validate.yml は、“validate” ステージを実行します。

  • buildspec_plan.yml は、“plan” ステージを実行します。

  • buildspec_apply.yml は、“apply” ステージを実行します。

  • buildspec_destroy.yml は、“destroy” ステージを実行します。

ビルド仕様ファイル変数

各 buildspec ファイルは次の変数を使用して異なるビルド固有の設定を有効にします。

変数

デフォルト値

説明

CODE_SRC_DIR

"."

ソース CodeCommit ディレクトリを定義します。

TF_VERSION

「1.3.7」

ビルド環境の Terraform バージョンを定義します。

buildspec_validate.yml ファイルでは、さまざまなビルド固有の設定を有効にする以下の変数もサポートしています。

変数

デフォルト値

説明

SCRIPT_DIR

「./templates/scripts」

スクリプトディレクトリを定義します。

ENVIRONMENT

「dev」

環境名を定義します

SKIPVALIDATIONFAILURE

「Y」

障害発生時の検証をスキップします

ENABLE_TFVALIDATE

「Y」

Terraform 検証を有効にします 

ENABLE_TFFORMAT

「Y」

Terraform フォーマットを有効にします

ENABLE_TFCHECKOV

「Y」

checkovスキャンを有効にします

ENABLE_TFSEC

「Y」

tfsec スキャンを有効にします

TFSEC_VERSION

「v1.28.1」

tfsec バージョンを定義します。