[AWS CDK(Cloud Development Kit)] 複数アカウント・複数リージョンへのデプロイを管理する

コンニチハ、千葉です。

CDKを利用すると、コードでCloudFormationを定義できます。ループ処理ができたり、変数なども柔軟に定義できるようになります。

今回は、CDKを利用して複数アカウントや複数リージョンへのデプロイをやってみます。

やってみた

前提

  • CDKをインストールして利用可能になっている
  • CDKは複数の言語に対応していますが、今回は Python を利用
  • 2アカウント、2リージョンにそれぞれデプロイしてみる

はじめての方は、こちらが参考になります。

プロファイルの設定

事前にプロファイルを設定しておきます。プロファイルとはAWS CLIで利用していた、環境ごとにアクセスするためのキーを切り替えるためのものです。 Linuxだと ~/.aws/config に保存されます。今回作成したプロファイルのサンプルです。

本番環境、開発環境のキーをそれぞれ指定します。サンプルとしてキーを指定していますが、AWSのベストプラクティスとしてはキー指定指定ではなく、IAMロールの指定なのでご注意ください。

[profile dev]
aws_access_key_id=xxx
aws_secret_access_key=xxx

[profile prd]
aws_access_key_id=xxx
aws_secret_access_key=xxx

プロジェクトの作成と初期化

CDKの環境を初期化しつつ、今回のサンプルコードをデプロイします。

$ mkdir cdk-multi-sample && cd cdk-multi-sample
$ cdk init --language python
$ source .env/bin/activate
$ pip install -r requirements.txt
$ pip install aws-cdk.aws-s3

デプロイするサンプルコード

今回デプロイするサンプルコードです。サンプルとしてS3バケットを作ります。

まずapp.py内にエントリポイントを作成します。複数アカウント、複数リージョンを指定します。

#!/usr/bin/env python3

from aws_cdk import core

from cdk_multi_sample.cdk_multi_sample_stack import CdkMultiSampleStack

app = core.App()
CdkMultiSampleStack(app, 'Stack-dev-tokyo', env={'account': 'ONE', 'region': 'ap-northeast-1'})
CdkMultiSampleStack(app, 'Stack-dev-virginia', env={'account': 'ONE', 'region': 'us-east-1'})
CdkMultiSampleStack(app, 'Stack-prd-tokyo', env={'account': 'TWO', 'region': 'ap-northeast-1'})
CdkMultiSampleStack(app, 'Stack-prd-virginia', env={'account': 'TWO', 'region': 'us-east-1'})

app.synth()
  • app:デプロイ時に指定するアプリケーション名
  • account:任意のAWSアカウントIDを指定
  • region:任意のリージョンを指定

次に、cdk_multi_sample/cdk_multi_sample_stack.pyにS3バケットを作成するコードを記述します。

from aws_cdk import (
    aws_s3 as s3,
    core
)

class CdkMultiSampleStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # The code that defines your stack goes here
        bucket = s3.Bucket(self, 
            cdk-s3-multi-sample,)

デプロイ

それでは、各アカウントと各リージョンにそれぞれデプロイします。 まずは、CloudFormationのテンプレートを生成します。

$ cdk synth
$ cdk ls
Stack-dev-tokyo
Stack-dev-virginia
Stack-prd-tokyo
Stack-prd-virginia

デプロイしてみます。

$ cdk deploy Stack-dev-tokyo --profile dev
$ cdk deploy Stack-dev-virginia --profile dev
$ cdk deploy Stack-prd-tokyo --profile prd
$ cdk deploy Stack-prd-virginia --profile prd

マネージメントコンソールから見てみました。それぞれ、CloudFormationスタックが追加されてました。また、S3バケットも作成されてます。

環境削除

試せたので、サンプル環境を掃除します

$ cdk destroy Stack-dev-tokyo --profile dev
$ cdk destroy Stack-dev-virginia --profile dev
$ cdk destroy Stack-prd-tokyo --profile prd
$ cdk destroy Stack-prd-virginia --profile prd

最後に

CDKを利用して、マルチアカウント、マルチチージョンに対してデプロイしてみました。CloudFormationのStackSetsを利用することでも可能ですが、CDKでも対応できることを確認できました。

参考