翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
を使用して 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 パイプラインを作成します。
“checkout”
は、AWS CodeCommit リポジトリからテストする Terraform 設定をプルします。“validate”
は、tfsec 、、TFLint および checkov を含む Infrastructure as Code (IaC ) 検証ツールを実行します。このステージでは、次の Terraform IaC 検証コマンドも実行されます: terraform validate
およびterraform fmt
“plan”
は、Terraform 構成が適用された場合にインフラストラクチャにどのような変更が適用されるかを示します。“apply”
は、生成された計画を使用して、必要なインフラストラクチャをテスト環境にプロビジョニングします。“destroy”
は、“apply”
ステージ中に作成されたテストインフラストラクチャを削除します。
前提条件と制限
前提条件
制約事項
このパターンのアプローチは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。
この図表は、次のワークフローを示しています:
では CodePipeline、AWSユーザーは で
terraform apply
コマンドを実行して Terraform プランで提案されたアクションを開始しますAWSCLI。AWS CodePipeline は、 CodeCommit、 CodeBuild、KMSおよび Amazon S3 AWS へのアクセスに必要なポリシーを含むIAMサービスロールを引き受けます。
CodePipeline は
“checkout”
パイプラインステージを実行して、テスト用のAWS CodeCommit リポジトリから Terraform 設定をプルします。CodePipeline は
“validate”
ステージを実行して、IaC 検証ツールを実行し、 CodeBuild プロジェクトで Terraform IaC 検証コマンドを実行して Terraform 設定をテストします。CodePipeline は
“plan”
ステージを実行して、Terraform 設定に基づいて CodeBuild プロジェクトに計画を作成します。AWS ユーザーは、変更がテスト環境に適用される前に、この計画を確認できます。Code Pipeline は、 CodeBuild プロジェクトを使用してテスト環境で必要なインフラストラクチャをプロビジョニングすることで、
“apply”
ステージを実行して計画を実装します。CodePipeline は
“destroy”
ステージを実行します。これは、 CodeBuild を使用して、“apply”
ステージ中に作成されたテストインフラストラクチャを削除します。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
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
GitHub リポジトリをクローンします。 | ターミナルウィンドウで次のコマンドを実行して、 GitHubaws-codepipeline-terraform-cicdsamples
詳細については、 GitHub ドキュメントの「リポジトリのクローン作成 | DevOps エンジニア |
Terraform 変数定義ファイルを作成する。 | ユースケース要件に基づいて 詳細については、Terraform ドキュメントの「ルートモジュール変数への値の割り当て 注: リポジトリの | DevOps エンジニア |
を Terraform プロバイダーAWSとして設定します。 |
詳細については、Terraform ドキュメントのAWS「プロバイダー | DevOps エンジニア |
Amazon S3 レプリケーションバケットを作成するための Terraform プロバイダー構成を更新する。 |
注: レプリケーションを使用すると、Amazon S3 バケット間でオブジェクトを自動で非同期的にコピーできます。 | DevOps エンジニア |
Terraform 構成を初期化します。 | Terraform 構成ファイルを含む作業ディレクトリを初期化するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。
| DevOps エンジニア |
Terraform プランを作成します。 | Terraform プランを作成するには、クローン作成したリポジトリのルートフォルダで以下のコマンドを実行します。
注: Terraform は構成ファイルを評価して、宣言されたリソースのターゲット状態を判断します。次に、ターゲットの状態を現在の状態と比較し、プランを作成します。 | DevOps エンジニア |
Terraform プランを検証します。 | Terraform プランを確認し、ターゲットAWSアカウントで必要なアーキテクチャが設定されていることを確認します。 | DevOps エンジニア |
ソリューションをデプロイします。 |
注: Terraform は、構成ファイルに宣言されているターゲット状態を達成するために、インフラストラクチャを作成、更新、または破棄します。 | DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
ソースコードリポジトリをセットアップします。 |
| DevOps エンジニア |
パイプラインのステージを検証します。 |
詳細については、「 ユーザーガイド」の「パイプラインの詳細と履歴の表示 (コンソール)」を参照してください。 AWS CodePipeline 重要: ソースリポジトリのメインブランチに変更がコミットされると、テストパイプラインは自動的に有効になります。 | DevOps エンジニア |
レポート出力を確認します。 |
注: | DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
パイプラインと関連リソースをクリーンアップします。 | AWS アカウントからテストリソースを削除するには、クローンされたリポジトリのルートフォルダで次のコマンドを実行します。
| DevOps エンジニア |
トラブルシューティング
問題 | ソリューション |
---|---|
|
|
関連リソース
モジュールブロック
(Terraform ドキュメント) CI/CD を使用して Terraform でAWSセキュリティサービスをデプロイおよび設定する方法
(AWS ブログ記事) サービスにリンクされたロールの使用 (IAM ドキュメント)
create-pipeline
(AWS CLIドキュメント) Amazon S3 に保存されているアーティファクトのサーバー側の暗号化を設定する CodePipeline (AWS CodePipeline ドキュメント)
(AWS CodeBuild ドキュメント) のクォAWS CodeBuildータ
でのデータ保護 AWS CodePipeline (AWS CodePipeline ドキュメント)
追加情報
カスタム 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 ファイルは次の変数を使用して異なるビルド固有の設定を有効にします。
変数 | デフォルト値 | 説明 |
---|---|---|
| "." | ソース CodeCommit ディレクトリを定義します。 |
| 「1.3.7」 | ビルド環境の Terraform バージョンを定義します。 |
buildspec_validate.yml
ファイルでは、さまざまなビルド固有の設定を有効にする以下の変数もサポートしています。
変数 | デフォルト値 | 説明 |
---|---|---|
| 「./templates/scripts」 | スクリプトディレクトリを定義します。 |
| 「dev」 | 環境名を定義します |
| 「Y」 | 障害発生時の検証をスキップします |
| 「Y」 | Terraform 検証を有効にします |
| 「Y」 | Terraform フォーマットを有効にします |
| 「Y」 | checkovスキャンを有効にします |
| 「Y」 | tfsec スキャンを有効にします |
| 「v1.28.1」 | tfsec バージョンを定義します。 |