Open23

aws-cdk で AWS CodePipeline を作って Terraform の CI/CD をしたい

anfangdanfangd

やりたいこと

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)

参考サイト

anfangdanfangd

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

参考

anfangdanfangd
anfangdanfangd

Self Mutate のプロセスを経由すると、そこだけで時間が掛かる。

anfangdanfangd

Self Mutate のプロセスを経由すると、そこだけで時間が掛かる。

Off にできる。

anfangdanfangd
    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{}),
        },
    })

https://catalog.us-east-1.prod.workshops.aws/workshops/d93fec4c-fb0f-4813-ac90-758cb5527f2f/en-US/walkthrough/go/pipelines/staging/add-manual-approval

anfangdanfangd

わかったこと

CDK Pipelines は あくまで CloudFormation の デプロイメントパイプラインを構築するものであり、 Terraform の デプロイメントパイプラインの構築にはマッチしていない。

anfangdanfangd
anfangdanfangd

アカウント単位で 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.

cf. Multi-Region Terraform Deployments with AWS CodePipeline using Terraform Built CI/CD | AWS DevOps Blog

anfangdanfangd

AWS CodePipeline

料金

AWS CodePipeline に前払い料金などの義務はありません。お客様が使用した分にのみお支払いいただきます。AWS CodePipeline は毎月アクティブなパイプライン*1つにつき1.00USD が課金されます。実験を奨励するため、パイプラインは作成後の最初の 30 日間は無料です。

  • アクティブなパイプラインとは、30 日以上存在していて、その月に少なくとも 1 つのコード変更が発生したパイプラインです。その月に新しいコード変更がないパイプラインに対しては、料金は発生しません。アクティブなパイプラインは、1 か月に満たない分に対して按分計算されません。
anfangdanfangd

Terraform の Deployment Pipeline の実現方法を比較検討する

前提

  • Terraformの管理対象は複数のAWSアカウントである
  • AWSアカウントはシステム&&環境で分割されている

実現する Deployment Pipeline

  1. CI: Continuous Integration
  2. CD: Continuous Delivery

検討パターン

  1. AWS CodePipeline を使う
  2. AWS CodeBuild を使う
  3. GitHub Actions を使う
  4. Terraform Cloud を使う

制約条件

  1. Terraform Repository は GitHub で管理する
  2. Terraform Repository の構成パターンは次の2つを検討する
  3. モノレポ
  4. ポリレポ

比較観点

  • 料金
  • システムの複雑さ
  • 保守性
  • セキュリティ
  • 使いやすさ