aws-cdk で AWS CodePipeline を作って Terraform の CI/CD をしたい
やりたいこと
aws-cdk で AWS CodePipeline を作って Terraform の CI/CD をしたい
操作環境
> sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M2 Pro
> sw_vers
ProductName: macOS
ProductVersion: 13.2
BuildVersion: 22D49
> uname -m
arm64
> zsh --version
zsh 5.8.1 (x86_64-apple-darwin22.0)
> aws --version
aws-cli/2.9.21 Python/3.11.1 Darwin/22.3.0 source/arm64 prompt/off
> goenv --version
goenv 2.0.5
> nodenv -v
nodenv 1.4.0
> node -v
v16.3.0
> cdk --version
2.65.0 (build 5862f7a)
参考サイト
aws-cdk の理解
cf. AWS CDK とは - AWS Cloud Development Kit (AWS CDK) v2
cf. What Are AWS CDK Constructs, Stacks and How To Use Them - DEV Community 👩💻👨💻
インストール
> brew install goenv
> goenv --version
goenv 2.0.5
> brew nodenv
> nodenv install 16.3.0
> export PATH="$HOME/.nodenv/bin:$PATH"
> eval "$(nodenv init -)"
> nodenv local 16.3.0
> brew install aws-cdk
cdk --version
CDK 操作の基本的な流れ
# プロジェクトの作成
> mkdir sample-app && cd sample-app
> cdk init sample-app --language go
> go mod tidy
> cdk init sample-app --language go
> cdk bootstrap
> cdk deploy
> cdk destroy
参考
CDK で AWS CodePipeline の構築
cf. CDK Pipelinesのmodern APIを使ってCDKアプリケーションをデプロイする | Amazon Web Services ブログ
手順
- AWS CodeStar Connections を追加して GitHub を登録する。
GitHub connections - AWS CodePipeline
注意ポイントの
参考
Self Mutate のプロセスを経由すると、そこだけで時間が掛かる。
Self Mutate のプロセスを経由すると、そこだけで時間が掛かる。
Off にできる。
Stage の追加方法が分からない。
pipeline.AddStage(NewMultiRegionS3CrrKmsCmkStage(stack, jsii.String("PreProd"), awscdk.StageProps{Env: &awscdk.Environment{
Account: props.StackProps.Env.Account,
Region: jsii.String("us-east-1"),
}}), &pipelines.AddStageOpts{})
pipeline.AddStage(NewMultiRegionS3CrrKmsCmkStage(stack, jsii.String("Production"), awscdk.StageProps{Env: &awscdk.Environment{
Account: props.StackProps.Env.Account,
Region: jsii.String("us-east-1"),
}}), &pipelines.AddStageOpts{
Pre: &[]pipelines.Step{
pipelines.NewManualApprovalStep(jsii.String("PromoteToProd"), &pipelines.ManualApprovalStepProps{}),
},
})
pipeline := pipelines.NewCodePipeline(stack, jsii.String("CodePipeline"), &pipelines.CodePipelineProps{
// pipelines.NewCodePipeline(stack, jsii.String("CodePipeline"), &pipelines.CodePipelineProps{
PipelineName: jsii.String(*stack.StackName()),
SelfMutation: jsii.Bool(false),
UseChangeSets: jsii.Bool(false),
次の2つをオフにする
- SelfMutation
- UseChangeSets
cf. pipelines package - github.com/aws/aws-cdk-go/awscdk/v2/pipelines - Go Packages
わかったこと
CDK Pipelines は あくまで CloudFormation の デプロイメントパイプラインを構築するものであり、 Terraform の デプロイメントパイプラインの構築にはマッチしていない。
Terraform CI/CD パイプライン を CodePipeline で実現する
参考
- TerraformでCodePipeline + CodeCommit作る際にトリガーでちょっとハマった話 | DevelopersIO
- CodePipeline で簡単 Terraform CI/CD パイプラインの実装 | DevelopersIO
- Multi-Region Terraform Deployments with AWS CodePipeline using Terraform Built CI/CD | AWS DevOps Blog
- Build infrastructure continuous integration for Terraform code leveraging AWS Developer Tools and Terratest | AWS Developer Tools Blog
- Terraform deployments with AWS CodePipelines | by Rasanpreet | AWS Tip
- CodePipelineからTerraformの実行 - Techfirm Cloud Architect Blog
アカウント単位で AWS CodePipeline を作るという例。
Fig 3. A separate pipeline per environment.
The sample architecture shown above contained a pipeline per environment (DEV, QA, STAGING, PROD) in the tooling account deploying to the target workload account for the respective environment. At scale, you can consider having multiple infrastructure deployment pipelines for multiple business units in the central tooling account, thereby targeting workload accounts per environment and business unit.
While a pipeline can process multiple executions at the same time, a pipeline stage processes only one execution at a time. To do this, a stage is locked while it processes an execution.
複数起動出来るけど Stage は出来なくて待っちゃうのか。
AWS CodePipeline
料金
AWS CodePipeline に前払い料金などの義務はありません。お客様が使用した分にのみお支払いいただきます。AWS CodePipeline は毎月アクティブなパイプライン*1つにつき1.00USD が課金されます。実験を奨励するため、パイプラインは作成後の最初の 30 日間は無料です。
- アクティブなパイプラインとは、30 日以上存在していて、その月に少なくとも 1 つのコード変更が発生したパイプラインです。その月に新しいコード変更がないパイプラインに対しては、料金は発生しません。アクティブなパイプラインは、1 か月に満たない分に対して按分計算されません。
Terraform の Deployment Pipeline の実現方法を比較検討する
前提
- Terraformの管理対象は複数のAWSアカウントである
- AWSアカウントはシステム&&環境で分割されている
実現する Deployment Pipeline
- CI: Continuous Integration
- CD: Continuous Delivery
検討パターン
- AWS CodePipeline を使う
- AWS CodeBuild を使う
- GitHub Actions を使う
- Terraform Cloud を使う
制約条件
- Terraform Repository は GitHub で管理する
- Terraform Repository の構成パターンは次の2つを検討する
- モノレポ
- ポリレポ
比較観点
- 料金
- システムの複雑さ
- 保守性
- セキュリティ
- 使いやすさ