

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

# AWS CodePipeline を使用して Terraform の構成を検証するための CI/CD パイプラインを作成する
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline"></a>

*Aromal Raj Jayarajan、Vijesh Vijayakumaran Nair (Amazon Web Services)*

## 概要
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-summary"></a>

このパターンは、AWS CodePipeline がデプロイした継続的インテグレーションおよび継続的デリバリー (CI/CD) パイプラインを使用して HashiCorp Terraform の構成をテストする方法を説明しています。

Terraform は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理する上で役立つコマンドラインインターフェイスアプリケーションです。このパターンで提供されるソリューションは、[CodePipeline の 5 つのステージ](https://docs.aws.amazon.com/codepipeline/latest/userguide/concepts.html#concepts-stages)を実行して Terraform 構成の整合性を検証する際に役立つ CI/CD パイプラインを作成します。

1. `"checkout"` は、テスト中の Terraform 構成を AWS CodeCommit リポジトリから取得します。

1. `"validate"` は、[tfsec](https://github.com/aquasecurity/tfsec)、[TFLint](https://github.com/terraform-linters/tflint)、[checkov](https://www.checkov.io/) などの Infrastructure as Code (IaC) 検証ツールを実行します。このステージでは、Terraform の IaC 検証コマンド `terraform validate` および `terraform fmt` も実行されます。

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

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

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

## 前提条件と制限事項
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ [インストールされ](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)、[構成済み](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)の AWS コマンドラインインターフェイス (AWS CLI)
+ ローカルマシンにインストールされて構成されている [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ ローカルマシンにインストールされ、構成済みの [Terraform](https://learn.hashicorp.com/collections/terraform/aws-get-started?utm_source=WEBSITE&utm_medium=WEB_IO&utm_offer=ARTICLE_PAGE&utm_content=DOCS)

**制限事項**
+ このパターンのアプローチでは、AWS CodePipeline を 1 つの AWS アカウントと AWS リージョンのみにデプロイします。マルチアカウントおよびマルチリージョンデプロイには、構成の変更が必要です。
+ このパターンでプロビジョニングされる AWS Identity and Access Management (IAM) ロール (**codepipeline\_iam\_role**) は、最小特権の原則に従います。IAM ロールの権限は、パイプラインが作成する必要のある特定のリソースに基づいて更新する必要があります。****

**製品バージョン**
+ AWS CLI バージョン 2.9.15 以降
+ Terraform バージョン 1.3.7 以降:

## アーキテクチャ
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-architecture"></a>

**ターゲットテクノロジースタック**
+ AWS CodePipeline
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS IAM
+ Amazon Simple Storage Service (Amazon S3)
+ AWS Key Management Service (AWS KMS)
+ Terraform

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

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

![AWS CI/CD パイプラインを使用して Terraform 設定をテストするアーキテクチャ。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/4df7b1f8-8eef-4d85-a971-a7f158be9691/images/90b931c8-e745-4b52-92de-a367fb0f1f51.png)


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

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

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

1. CodePipelineは、`"checkout"` パイプラインステージを実行して、テスト用に AWS CodeCommit リポジトリから Terraform 構成を取得します。

1. CodePipeline は、CodeBuild プロジェクトで IaC 検証ツールを実行し、Terraform IaC 検証コマンドを実行して Terraform 構成をテストする `"validate"` ステージを実行します。

1. CodePipeline は `"plan"` ステージを実行し、Terraform 構成に基づいて CodeBuild プロジェクトでプランを作成します。AWS ユーザーは、変更をテスト環境に適用する前にこのプランを確認できます。

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

1. CodePipeline は、`"destroy"` ステージを実行することで、`"apply"` ステージ中に作成されたテストインフラストラクチャを CodeBuild で削除します。

1. Amazon S3 バケットには、AWS KMS [カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)を使用して暗号化および復号化されたパイプラインアーティファクトが格納されます。

## ツール
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-tools"></a>

**ツール**

*AWS サービス*
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) は、ソフトウェアリリースのさまざまな段階を迅速にモデル化および設定し、ソフトウェアの変更を継続的にリリースするために必要なステップを自動化するのに役立ちます。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) はフルマネージドの構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) は、独自のソースコントロールシステムを管理しなくても、Git リポジトリを非公開で保存および管理できるバージョン管理サービスです。
+ 「[AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) は、データの保護に役立つ暗号キーを作成および管理する上で役立ちます。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) は、任意のデータ量を保存、保護、取得する際に役立つクラウドベースのオブジェクトストレージサービスです。

*その他のサービス*
+ [HashiCorp Terraform](https://www.terraform.io/docs) は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングおよび管理するのに役立つコマンドラインインターフェイスアプリケーションです。

**コード**

このパターンのコードは、GitHub 内の「[aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples)」リポジトリで利用できます。リポジトリには、このパターンで概説されているターゲットアーキテクチャの作成に必要な Terraform 構成が含まれています。

## エピック
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-epics"></a>

### ソリューションコンポーネントのプロビジョニング
<a name="provision-the-solution-components"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| GitHub リポジトリのクローン作成 | ターミナルウィンドウで以下のコマンドを実行して GitHub の [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples) リポジトリをクローン作成します。<pre>git clone https://github.com/aws-samples/aws-codepipeline-terraform-cicd-samples.git</pre><br />詳細については、GitHub ドキュメントの「[リポジトリのクローン作成](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)」を参照してください。 | DevOps エンジニア | 
| Terraform 変数定義ファイルを作成する。 | ユースケース要件に基づいて `terraform.tfvars` ファイルを作成します。クローン作成したリポジトリにある `examples/terraform.tfvars` ファイル内の変数を更新できます。<br />詳細については、Terraform ドキュメントの「[ルートモジュール変数への値の割り当て](https://developer.hashicorp.com/terraform/language/values/variables#assigning-values-to-root-module-variables)」を参照してください。リポジトリの `Readme.md` ファイルには、必要な変数に関する詳細情報が含まれています。 | DevOps エンジニア | 
| AWS を Terraform プロバイダーとして構成する。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)詳細については、[ のプロバイダー](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)を参照してください。 | DevOps エンジニア | 
| Amazon S3 レプリケーションバケットを作成するための Terraform プロバイダー構成を更新する。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)レプリケーションを使用すると、Amazon S3 バケット間でオブジェクトを自動で非同期的にコピーできます。 | DevOps エンジニア | 
| Terraform 構成を初期化します。 | Terraform 構成ファイルを含む作業ディレクトリを初期化するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。<pre>terraform init</pre> | DevOps エンジニア | 
| Terraform プランを作成します。 | Terraform プランを作成するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。<pre>terraform plan --var-file=terraform.tfvars -out=tfplan</pre>Terraform は設定ファイルを評価して、宣言されたリソースのターゲット状態を判断します。次に、ターゲットの状態を現在の状態と比較し、プランを作成します。 | DevOps エンジニア | 
| Terraform プランを検証します。 | Terraform プランを確認し、ターゲット AWS アカウントで必要なアーキテクチャが構成されていることを確認します。 | DevOps エンジニア | 
| ソリューションのデプロイ | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)Terraform は、構成ファイルに宣言されている目標状態を達成するために、インフラストラクチャを作成、更新、または破棄します。 | DevOps エンジニア | 

### パイプラインを実行して Terraform の構成を検証します。
<a name="validate-terraform-configurations-by-running-the-pipeline"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ソースコードリポジトリをセットアップします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | DevOps エンジニア | 
| パイプラインのステージを検証します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)詳細については、*AWS CodePipeline ユーザーガイド*の「[パイプラインの詳細と履歴を表示する (コンソール)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-view-console.html)」を参照してください。ソースリポジトリのメインブランチに変更がコミットされると、テストパイプラインは自動的に有効になります。 | DevOps エンジニア | 
| レポート出力を確認します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html)`<project_name>-validate` CodeBuild プロジェクトは、`"validate"` ステージ中にコードの脆弱性レポートを生成します。 | DevOps エンジニア | 

### リソースのクリーンアップ
<a name="clean-up-your-resources"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| パイプラインと関連リソースをクリーンアップします。 | AWS アカウントからテストリソースを削除するには、クローン作成したリポジトリのルートフォルダで次のコマンドを実行します。<pre>terraform destroy --var-file=terraform.tfvars</pre> | DevOps エンジニア | 

## トラブルシューティング
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| `"apply"` ステージ中に **AccessDenied** エラーが表示される。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline.html) | 

## 関連リソース
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-resources"></a>
+ [Module blocks](https://developer.hashicorp.com/terraform/language/modules/syntax) (Terraform ドキュメント)
+ [How to use CI/CD to deploy and configure AWS security services with Terraform](https://aws.amazon.com/blogs/security/how-use-ci-cd-deploy-configure-aws-security-services-terraform/) (AWS ブログ投稿)
+ [サービスにリンクされたロールの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html) (IAM ドキュメント)
+ [create-pipeline](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/codepipeline/create-pipeline.html) (AWS CLI ドキュメント)
+ [Configure server-side encryption for artifacts stored in Amazon S3 for CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html) (AWS CodePipeline ドキュメント)
+ [Quotas for AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/limits.html) (AWS CodeBuild ドキュメント)
+ [Data protection in AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/data-protection.html) (AWS CodePipeline ドキュメント)

## 追加情報
<a name="create-a-ci-cd-pipeline-to-validate-terraform-configurations-by-using-aws-codepipeline-additional"></a>

**カスタム Terraform モジュール**

以下は、このパターンで使用されるカスタム Terraform モジュールのリストです。
+ `codebuild_terraform` は、パイプラインの各ステージを形成する CodeBuild プロジェクトを作成します。
+ `codecommit_infrastructure_source_repo` は、ソース CodeCommit リポジトリをキャプチャして作成します。
+ `codepipeline_iam_role` は、パイプラインに必要な IAM ロールを作成します。
+ `codepipeline_kms` は、Amazon S3 オブジェクトの暗号化と復号化に必要な AWS KMS キーを作成します。
+ `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 バージョンを定義します。 | 