[AWS CDK入門] CloudFormationをプログラミングで生成!?ワークショップをやってプロジェクト作成からデプロイまでを理解する

コンニチハ、千葉です。

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を利用することで対応している言語を使うことができます。今まで複雑になりがちだったテンプレートをシンプルに利用できそうです。

参考