😃

初心者がAWS CDK for Python v2を用いてIaCをやってみた

2022/05/10に公開

概要

以前、AWS CDK v2 をPythonで使いこなそう!!(2022/01/24)という記事を書いた後、実際にどのような流れでCDKを使用するかを簡単にまとめておこうと思ったため、自身の復習のために書いたアウトプット記事です。
ここではCDKコマンドの使用をメインとしているため、コードの中身などは次回以降に紹介するかもしれません。

環境などの各種設定に関しては、以前の記事を参考にしてください。

ディレクトリの説明

手順項目にあるプロジェクト作成を行った際に作成されるディレクトリの中身に筆者が手を加えたディレクトリの簡単な説明

プロジェクトフォルダ名[hogehoge]
.
├── app.py # このソースで作成するスタックを選択
├── cdk.context.json
├── cdk.json
├── cdk.out    # ここに作成されたcloudformationファイルが存在
├── hogehoge
│   ├── hogehoge_stack.py   # このソースでスタックを定義
│   ├── __init__.py
│   └── __pycache__
├── env.ini   # 設定値をここで管理(筆者が自身で作成)
├── README.md
├── requirements-dev.txt
├── requirements.txt
├── .venv
├── source.bat
└──tests     
  • 基本的には、app.py と hogehoge_stack.pyを編集・更新して、cdk diffとcdk deployの繰り返し

手順

I. サンプルプロジェクト作成

プロジェクトに必要なディレクトリ群を用意する必要があるが、今回はcdk init sample-appコマンドで自動作成していただく。

mkdir {プロジェクト名など}
cd {上記のディレクトリ}
cdk init sample-app language=python

II. cdk deploy の前に

cdk deployコマンドで記述されたコードから、リソースを作成するがその前にいくつか準備が必要である。

  • python3 -m venv .venv

    • 仮想環境の作成
  • pip install -r requirements.txt

    • app.pyなどに必要なモジュールをインストール
    • defaltで aws-cdk-lib と constructs の二つがバージョンも含め requirements.txtに記述済み
  • cdk diff

    • コードにsyntax errorなどがあれば、ほとんどはここでわかる
    • 同じスタックを作成している場合は差分のみ表示される
    • 以前のスタックとの変更点の確認(以下 参考)
プロジェクト名[Zenn]
$ cdk diff
Stack zenn
current credentials could not be used to assume 'arn:aws:iam::[AWSアカウント]:role/cdk-hnb659fds-lookup-role-[AWSアカウント]-[Region]', but are for the right account. Proceeding anyway.
(To get rid of this warning, please upgrade to bootstrap version >= 8)
current credentials could not be used to assume 'arn:aws:iam::[AWSアカウント]:role/cdk-hnb659fds-deploy-role-[AWSアカウント]-[Region]', but are for the right account. Proceeding anyway.
IAM Statement Changes
┌───┬──────────────────┬────────┬─────────────────┬───────────────────────────┬──────────────────────────────────────────────────┐
│   │ Resource         │ Effect │ Action          │ Principal                 │ Condition                                        │
├───┼──────────────────┼────────┼─────────────────┼───────────────────────────┼──────────────────────────────────────────────────┤
│ + │ ${ZennQueue.Arn} │ Allow  │ sqs:SendMessage │ Service:sns.amazonaws.com │ "ArnEquals": {                                   │
│   │                  │        │                 │                           │   "aws:SourceArn": "${ZennTopic}"                │
│   │                  │        │                 │                           │ }                                                │
└───┴──────────────────┴────────┴─────────────────┴───────────────────────────┴──────────────────────────────────────────────────┘
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Parameters
[+] Parameter BootstrapVersion BootstrapVersion: {"Type":"AWS::SSM::Parameter::Value<String>","Default":"/cdk-bootstrap/hnb659fds/version","Description":"Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"}

Conditions
[+] Condition CDKMetadata/Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"af-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}

Resources
[+] AWS::SQS::Queue ZennQueue ZennQueueEDCD25A8 
[+] AWS::SQS::QueuePolicy ZennQueue/Policy ZennQueuePolicy1151899A 
[+] AWS::SNS::Subscription ZennQueue/zennZennTopic6694A41D ZennQueuezennZennTopic6694A41D01784B63 
[+] AWS::SNS::Topic ZennTopic ZennTopic2D5EE428 

Other Changes
[+] Unknown Rules: {"CheckBootstrapVersion":{"Assertions":[{"Assert":{"Fn::Not":[{"Fn::Contains":[["1","2","3","4","5"],{"Ref":"BootstrapVersion"}]}]},"AssertDescription":"CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."}]}}

III. いよいよ cdk deply !

II で特に問題がなければ、いざ cdk deploy !

[実行中・終了時の出力]
$ cdk deploy

~~~~~~~~~cdk diffの出力と同じ内容~~~~~~~~~~~

Do you wish to deploy these changes (y/n)? y
zenn: deploying...
current credentials could not be used to assume 'arn:aws:iam::[AWSアカウント]:role/cdk-hnb659fds-deploy-role-[AWSアカウント]-[Region]', but are for the right account. Proceeding anyway.
[0%] start: Publishing 556569cc42a934bb4a6cba7b5a2cb117a2c87886496a78533e75c5302b55074b:current_account-current_region
current credentials could not be used to assume 'arn:aws:iam::[AWSアカウント]:role/cdk-hnb659fds-file-publishing-role-[AWSアカウント]-[Region]', but are for the right account. Proceeding anyway.
[100%] success: Published 556569cc42a934bb4a6cba7b5a2cb117a2c87886496a78533e75c5302b55074b:current_account-current_region
test: creating CloudFormation changeset...






 ✅  zenn

✨  Deployment time: 92.52s

Stack ARN:
arn:aws:cloudformation:[Region]:[AWSアカウント]:stack/test/bb09b1e0-a362-11ec-a2d1-020f8ccce900

✨  Total time: 99.33s

IV. 後片付け

不必要な課金されないように、cdk destroy で作成したスタックを削除(cdk destroy)。

出力
$ cdk destroy
Are you sure you want to delete: zenn (y/n)? y
zenn: destroying...
current credentials could not be used to assume 'arn:aws:iam::[AWSアカウント]:role/cdk-hnb659fds-deploy-role-[AWSアカウント]-[Region]', but are for the right account. Proceeding anyway.

 ✅  zenn: destroyed

参考

Discussion