CodePipeline を使用して Terraform テンプレートと CloudFormation テンプレートをデプロイする - AWS 規範ガイダンス

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

CodePipeline を使用して Terraform テンプレートと CloudFormation テンプレートをデプロイする

注意

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

DPA では、 の構成要素を使用して AWS CodePipeline Terraform および CloudFormation IaC のアクセラレーターを作成します。このセクションでは、このユースケースについて以下について説明します。

  • 標準化されたパイプライン構造

  • 再利用可能なステージとジョブ

  • セキュリティスキャン用の統合ツール

DPA リポジトリには、TerraformCloudFormation のフォルダが含まれています。これらの各フォルダには、次の 2 つのサブフォルダが含まれています。

  • pipeline-modules – このフォルダには、標準化されたパイプライン構造をデプロイするためのコードが含まれています。

  • shared – このフォルダにはready-to-use buildspec ファイルが含まれています。

前提条件

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

  • IaC テンプレートを使用してリソースをプロビジョニングするアクセス許可

  • AWS CodeCommit リポジトリと CodePipeline コンポーネントを作成するアクセス許可

ツール

  • cfn-lint は、CloudFormation YAML または JSON テンプレートをAWS CloudFormation リソース仕様と照合する linter です。また、リソースプロパティの有効な値の確認やベストプラクティスの遵守など、他のチェックも実行します。

  • cfn_nag は、パターンを検索して CloudFormation テンプレートで潜在的なセキュリティ問題を識別するオープンソースツールです。

  • Checkov は、IaC のセキュリティとコンプライアンスの設定ミスをチェックする静的コード分析ツールです。

  • TFLint は、Terraform コードで潜在的なエラーやベストプラクティスへの準拠をチェックする linter です。

  • tfsec は、Terraform コードで設定ミスの可能性をチェックする静的コード分析ツールです。

指示

CodeCommit リポジトリを作成する

  1. 次のように 2 つの個別の CodeCommit リポジトリを作成します。

    • common-repo – このリポジトリには、共有ライブラリ、buildspec ファイル、依存関係が含まれています。

    • app-repo – このリポジトリには、インフラストラクチャをデプロイするための Terraform テンプレートまたは CloudFormation テンプレートが含まれています。

    手順については、「 AWS CodeCommit リポジトリの作成」を参照してください。

  2. common-repo リポジトリで、 という名前のフォルダを作成しますshared。buildspec ファイルを GitHub DPA リポジトリの Terraform または CloudFormation 共有フォルダから新しいフォルダにコピーします。手順については、「 AWS CodeCommit リポジトリへのファイルの作成または追加」を参照してください。

  3. app-repo リポジトリで、 という名前のフォルダを作成しますentrypoint。GitHub DPA リポジトリの Terraform または CloudFormation エントリポイントフォルダから新しいフォルダにファイルをコピーします。これらのファイルの詳細については、「」を参照してくださいエントリポイント JSON ファイルについて

  4. Terraform または CloudFormation サンプルディレクトリを確認し、これらの例に従ってapp-repoフォルダを構造化します。これらのディレクトリには、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスまたは Amazon Simple Storage Service (Amazon S3) バケットをデプロイする例が含まれています。

  5. 次の 2 つのセクションのいずれかに進みます。

パイプラインを作成してステージを定義する (Terraform)

  1. DevOps Pipeline Accelerator (DPA) リポジトリを GitHub からローカルワークステーションにクローンします。

  2. クローンされたリポジトリで、 aws-codepipeline/terraform/pipeline-modulesフォルダに移動します。

  3. terraform.tfvars ファイルで、Terraform 状態と AWS Identity and Access Management (IAM) ロール固有の変数を更新して検証します。

  4. Docker イメージを作成します。手順については、CodeBuild (GitHub) で を使用するための Docker イメージの作成」を参照してください。 GitHub

  5. terraform.tfvars ファイルで定義されているbuilder_image変数を更新します。

  6. 次のコマンドを入力します。これにより、Terraform を通じてインフラストラクチャが初期化、プレビュー、デプロイされます。

    terraform init terraform plan terraform apply
  7. AWS アカウントにサインインします。CodePipeline コンソールで、新しいパイプラインが作成されていることを確認します。

    : 最初の実行が failed状態にある場合は、前のステップを繰り返します。

  8. 新しい CodePipeline パイプラインが作成されると、 AWS CodeBuild の新しい IAM ロールが自動的に作成されます。この自動的に作成されたロールの名前は で終わります-codebuild-role。インフラストラクチャのデプロイに必要なアクセス許可でこのロールを更新します。

パイプラインを作成してステージを定義する (CloudFormation)

  1. DevOps Pipeline Accelerator (DPA) リポジトリを GitHub からローカルワークステーションにクローンします。

  2. クローンされたリポジトリで、 aws-codepipeline/cloudformation/pipeline-modulesフォルダに移動します。

  3. pipeline-cft.yaml CloudFormation テンプレートをデプロイします。以下は、スタックに渡す必要がある必須パラメータです。

    • ArtifactsBucket – 更新するパイプラインアーティファクトを含むリポジトリの名前

    • EcrDockerRepositoryimage タグ付きの Amazon ECR リポジトリの Uniform Resource Identifier (URI)

    • CodeCommitAppRepo – テンプレートを含む CodeCommit リポジトリの名前

    • CodeCommitBaseRepo – 共有ファイルを含む CodeCommit リポジトリの名前

    • CodeCommitRepoBranch – CodeCommit リポジトリブランチの名前

    • SNSMailAddress – パイプラインのステータスに関する Amazon Simple Notification Service (Amazon SNS) 通知を受け取る E メールアドレス

    手順については、CloudFormation ドキュメントの「スタックの使用」を参照してください。

  4. AWS アカウントにサインインします。CodePipeline コンソールで、新しいパイプラインが作成されていることを確認します。 

  5. 新しい CodePipeline パイプラインが作成されると、 AWS CodeBuild の新しい IAM ロールが自動的に作成されます。この自動的に作成されたロールの名前は で終わります-codebuild-role。インフラストラクチャのデプロイに必要なアクセス許可でこのロールを更新します。

エントリポイント JSON ファイルについて

Terraform エントリポイントファイル

これはメインの設定ファイルです。このファイルでは、ステージをカスタマイズおよび有効化または無効化できます。ステージを無効にしても、ステージはパイプラインから削除または削除されません。代わりに、ランタイム中にステージがスキップされます。

{ "build_stage_required" : "true", "test_stage_required" : "true", "predeploy_stage_required": "true", "deploy_stage_required": "true", "postdeploy_stage_required": "true", "destroy_stage_required": "true", "bucket":"tf-state-dpa", # S3 bucket used for Terraform backend "key":"terraform_test.tfstate", # S3 key to be used "region":"us-east-1", "dynamodb_table":"tf-state-dpa" # DynamoDB Table for Terraform backend }

CloudFormation エントリポイントファイル

これはメインの設定ファイルです。このファイルでは、ステージをカスタマイズし、有効または無効にします。ステージを無効にしても、ステージはパイプラインから削除または削除されません。代わりに、パイプラインはランタイム中にステージをスキップします。

{ "init_stage_required" : "true", "test_stage_required" : "true", "createinfra_stage_required": "true", "envType" : "cloudformation", "stage_required" : "true", "cft_s3_bucket" : "pipeline-bucket", #S3 bucket from the destination account to keep CFT templates "stack_name" : "aws-cft-poc", #CloudFormation stack name "account" : "************", #Destination AWS account to deploy stack "roleName" : "codestack-poc-cross-account-role", #Cross-account IAM role name "region" : "us-east-1", "destroy_stack" : "false" #To destroy the provisioned stack, set this value to "true" }