この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
コンニチハ、千葉です。
CDKを利用することで、コードでCloudFormationを定義し、デプロイできるようになります。無限の可能性を秘めたCDKですが、今回理解を含めるために公式から提供されているCDKのPython Workshopをやってみたのでお届けします。
こちらをやって、CDKをみんなで使い始めましょう!
アジェンダ
- プロジェクトの作成
- プロジェクトの構造
- Cloudformationテンプレートの作成
- デプロイ
- 環境の削除
やってみた
事前にCDKのインストールは行っておきましょう。 また、AWS CLIと同じく実行権限のためのアクセスキー、またはIAMロールの設定をしておきましょう。
プロジェクトの作成
プロジェクトの用のディレクトリを作成します。
mkdir cdk-workshop && cd cdk-workshop
cdk init
コマンドにて、プロジェクトの初期化を行います。
cdk init sample-app --language python
Virtualenvをアクティブ化します。cdk init
を実行すると、同時にvirtualenvを利用した仮想環境も作成されます。既存のPythonに影響を与えずに任意のパッケージをインストールできるようになります。仮想環境を有効化しましょう。
Linux: source .env/bin/activate
Windows: .env/Scripts/activate.bat
仮想環境上に必要なPythonモジュールをインストールします。
pip install -r requirements.txt
プロジェクトの構造
初期化後、以下の構造になります。
- README.md — このプロジェクトのREADME。
- app.py — このサンプルアプリケーションの「メイン」。
- cdk.json — CDK構成ツリーを生成するために実行可能なCDKを実行する必要があるCDKの構成ファイル。
- hello — Pythonモジュールディレクトリ。
- hello_construct.py — CDKアプリケーションで使用するために定義されたカスタムCDKコンストラクト。
- hello_stack.py-CDKアプリケーションで使用するカスタムCDKスタック構成。
- requirements.txt — このファイルは、アプリケーションのすべての依存関係をインストールするためにpipによって使用します。
- setup.py — このPythonパッケージの構築方法と依存関係を定義します。
- tests — すべてのテストが含まれます。
- unit — 単体テストが含まれています。
- test_hello_construct.py - helloパッケージで作成されたカスタムCDKコンストラクトの簡単なテスト。これは主に、テストをプロジェクトに接続する方法を示すためのものです。
app.py
にメインの処理を書くのですが、サンプルだと以下のようなコードになっています。
#!/usr/bin/env python3
from aws_cdk import core
from hello.hello_stack import MyStack
app = core.App()
MyStack(app, "hello-cdk-1", env={'region': 'us-east-2'})
MyStack(app, "hello-cdk-2", env={'region': 'us-west-2'})
app.synth()
app.pyにメインの処理を書いてもいいのですが、サンプルだとエントリポイントとして書かれています。hello/hello_stack.py
にメインの処理のコードがあります。hello/hello_stack.pyはこんな感じです。
from aws_cdk import (
aws_iam as iam,
aws_sqs as sqs,
aws_sns as sns,
aws_sns_subscriptions as subs,
core
)
from hello_construct import HelloConstruct
class MyStack(core.Stack):
def __init__(self, app: core.App, id: str, **kwargs) -> None:
super().__init__(app, id, **kwargs)
queue = sqs.Queue(
self, "MyFirstQueue",
visibility_timeout=core.Duration.seconds(300),
)
topic = sns.Topic(
self, "MyFirstTopic",
display_name="My First Topic"
)
topic.add_subscription(subs.SqsSubscription(queue))
hello = HelloConstruct(self, "MyHelloConstruct", num_buckets=4)
user = iam.User(self, "MyUser")
hello.grant_read(user)
Cloudformationテンプレートの作成
アプリから、CloudFormationテンプレートを作成します。CDKのコードを元に、CloudFormationテンプレート自体が出力されます。cdk synth
コマンドで、CloudFormationテンプレートを出力します。
app.py にてスタックを2つ定義しています(hello-cdk-1とhello-cdk-2)。
$ cdk ls
hello-cdk-1
hello-cdk-2
そのうち、1の方のCloudFormationテンプレートを出力します。
cdk synth hello-cdk-1
デプロイ
CloudFormationテンプレートが出力されたので、デプロイしてみましょう。その前に、初回デプロイのタイミングでやっておくことがあります。ブートストラップスタック
のインストールです。これには、CDKで利用するためのS3バケットCD作成などが含まれます。
cdk bootstrap
準備が整ったので、デプロイしましょう。
cdk deploy hello-cdk-1
CDKスタック「hello-cdk-1」は、CloudFormationスタックと1:1になります。マネージメントコンソールを確認したところ、スタックが作成されていました。
環境の削除
デプロイした環境を削除します。
cdk destroy hello-cdk-1
最後に
PythonのCDKを利用したワークショップを実際にやってみました。CloudFomrtainoは宣言的な定義だったため、かゆいところに手が届きにくかったですが、CDKを利用することで対応している言語を使うことができます。今まで複雑になりがちだったテンプレートをシンプルに利用できそうです。