AWS CDK(Cloud Development Kit) を python で使ってみる

AWS のリソース管理

みなさん、AWS 使ってますか?

AWS には本当にたくさんのサービスがあります。
これらのサービスを組み合わせて、早く、簡単に、そしてスケーラブルに環境を構築できることが
AWS の魅力ですよね。

ただ、サービスが多い分、それらを正しく設定して連携させていくことは
普通にコーディングすること、もしくはそれ以上に骨が折れることです。

本番環境を一つ作るだけであれば、Web の画面からマウスでポチポチで作っていっても良いのでしょうが、
プロダクション環境とステージング環境とテスト環境と…とかやってたら大変です。

何なら、構成を途中で変更するということだってよくあることですが、
一カ所変えたときに他の環境も正しく変更されているかどうかということを、
誰が確認できるでしょうか?

これらのリソース管理はクラウドで開発をするためにはとても重要なことであり、
実際に AWS では比較的早い段階から(リソースの種類が増えてきた頃に)
CloudFormation という、リソースを設定ファイルで全て立ち上げ、管理できるサービスを提供していました。

この CloudFormation 、各環境を全く同じように立ち上げ、変更していくことができるのでとても便利なのですが、
一点問題なのが、ただの設定ファイルであるということです。

ということで、例えば 10 個インスタンスを用意したければ同じような記述を 10 回する必要がありますし、
イマドキ IDE は入力したいことを補完してくれますが、そういったものも効きません。

ということで、近年作られたのが AWS CDK なのですね。
これは、CloudFormation の記述内容をプログラミングコードに置き換えることができるサービスになります。

これを使うと、本当に普通にプログラムのコードを書くように、快適にリソースを作成することができます。

ということで、今回はこの AWS CDK を触ってみましょう。

AWS CDK (Pyhotn) から Cognito を立ち上げてみる

では早速やってみましょう。
すでにいくらかこういった記事はあるのですが、大体 EC2 とか S3 を作成しているので、
今回はちょっとマニアックなところで Cognito (Web でのユーザーのログイン等々をイイ感じにしてくれるやつ)を立ち上げてみましょう。
加えて、TypeScript を使ったサンプルが世に出回ってますが、
今回は Python をつかってみることにします。

初期設定

まずはプロジェクトの初期設定ですね。
先ほど Python を使うと言いましたが、手元でコマンドを実行するためには
node.js で作成されたコマンドラインツールを入れておく必要があります。

ということで、とりあえず node と python (python は 3 系を使います) が動かせる環境を用意したら

npm install -g aws-cdk

で、グローバルにコマンドラインをインストールします。
インストールできたら、プロジェクトを作りたいディレクトリに移動してから

cdk init --language=python

このコマンドを実行することで、必要なファイルをそろえてくれます。

で、AWS は親切にも virtualenv を使ってすぐ開発が進められるように、セットアップ系のファイルも用意してくれていますが、
今回は pipenv を使いたいという私の一存でそのあたりのファイルをごっそり削除。

(公式の virtualenv を使う手順は、

Getting Started With the AWS CDK

Install and configure the AWS Cloud Development Kit (AWS CDK) and create Hello world.


このあたりを読んだら分かるかと思います)

.git は git 管理用のファイルなので、実質残ったのは app.py と cdk.json だけですね。
cdk.json は先ほどインストールした cdk コマンドラインから操作を実行する際に参照されるファイルなので、これはそのまま置いておきましょう。
app.py の方が、実際に実行される python ファイルですね。

ここで、 pipenv を使って必要な依存関係を持ってきておきましょう。

pipenv --python 3

上のコマンドで、pipenv に必要な Pipfile を作っておきます。

次に、 CDK を使う上で必ず必要になる core パッケージを入れておきます。

pipenv install aws_cdk.core

CDK 関連のパッケージは全て aws_cdk.* の形で配布されていますよ。
これで、 CDK を書き始める準備は完了です。

Cognito のリソースを作ってみる

では早速 Cognito を作ってみましょう。

まずは、Cognito を作成するための依存パッケージをインストールします。

pipenv install aws_cdk.aws_cognito

パッケージが入ったら、コードを書いていきましょう。
とりあえず cdk と言う名前でディレクトリを作ります。
python のパッケージディレクトリなので、 __init__.py ファイルも cdk ディレクトリ内に置いておきますが、
中身は空で大丈夫です。

で、実際に Cognito を作るコードを書くファイルを auth.py として作成して、
以下の内容を書きましょう。

from aws_cdk import (
    core,
    aws_cognito as cognito,
)


class CognitoStack(core.Stack):

    def __init__(self, scope: core.Construct, name: str, **kwargs) -> None:
        super().__init__(scope, name, **kwargs)
        cognito.UserPool(
            self,
            ’cognito_name’,
            user_pool_name=’cognito_user_pool’,
            auto_verified_attributes=[
                cognito.UserPoolAttribute.EMAIL,
            ],
            sign_in_type=cognito.SignInType.EMAIL,
        )


aws_cognito のインポートは、aws の部分が毎回書くのが面倒だったので as で cognito で参照しています。

見ていただいたら分かるとおり、コンストラクタに書いてあるだけの内容で十分です。
一行目は super().__init__(scope, name, **kwargs) なので、
単純に親のコンストラクタを呼び出しているだけです。

二行目が改行がたくさん入って少し長いですが、
内容そのものとしては一行分だけですね。

Cognito に限らずどのリソースを作るときもそうなのですが、
引数の内容は (self, 'スコープ(こちらで適当に名前を決める)', ...オプション諸々) のような感じで、
一つ目の self と、二つ目のスコープは必須で、それ以外は必要に応じてオプションをつけていくようになります。

指定できるオプションは

class UserPool (construct) · AWS CDK

Language Type name Python aws_cdk.aws_cognito.UserPool Java software.amazon.awscdk.services.cognito.UserPool .NET Amazon.CDK.AWS.Cognito.UserPool TypeScript ( source) @aws-cdk/aws-cognito.UserPool Implements IConstruct , IResource , IUserPool Define a Cognito User Pool. new UserPool(scope: Construct, id: string, props?: User Pool Props) Parameters Name Type Description Array Attributes which Cognito will automatically send a verification message to.


今回の Cognito の UserPool についてはこんな感じでドキュメントにかいてあります。

同様に、他のリソースについても

AWS CDK · AWS CDK Reference Documentation

AWS CDK Reference Documentation


この中から探して、オプションを指定していく形になります。

このあたりは、オプションを確認していけば、あとは IDE の補完にたよって行けば書けてしまうので
とっても便利ですね。

で、python のエントリーポイントとなる app.py の内容を、
以下のように変更します

from aws_cdk import core
from cdk.auth import CognitoStack

app = core.App()

CognitoStack(app, ’CognitoStack’)

app.synth()

単純に先ほどのファイルをインポートして、インスタンス作ってるだけですね。

コードが書けたら、ビルドしてみましょう。
以下を Pipfile に追加します。

[scripts]
build = ”python app.py”

で、おもむろに

pipenv run build

を実行すると…

こんな感じで、cdk.out ディレクトリが作成され、その中に CloudFormation のコードが生成されます。
あとは cdk deploy と打てば、 CloudFromation を経由して Cognito が生成されます。
(認証情報を求められたら、環境変数などにセットしてくださいね)

CDK で簡単にリソース管理を

以上でとても簡単にリソースをコード化して管理するところまでいけました。
最後でお気づきかと思いますが、 CDK は結局は CloudFormation のコードを生成するための
ラッパーになっているのですね。

とはいえ、まだ CloudFormation で多くのリソースを生成する際に必要になってくる、
スタックのネスティングなどには対応していないため、 CloudFormation の力をフルに引き出すためには
まだあと一歩といったところでしょうか。

とはいえ、普通にコードで管理できるため、IDE の補完もききますし、
ミスタイプなどがあってもビルド時にきちんと教えてくれるので、とても便利ですよ。

ぜひ、CloudFormation, CDK 共に、これを使用すること自体は無料でできるので
(もちろん、生成したEC2等々にはお金がかかりますよ!)
今後 AWS で構築をする際には是非使ってみてはいかがでしょうか。

Takato Ezaki

Takato Ezaki小中高の塾講師からエンジニア

投稿者プロフィール

福岡で Web 系のエンジニアをしています。

中高の理科教師免許を取り、起業に 2 年間トライした後エンジニアの道へ入りました。

化学反応の中では Belousov-Zhabotinsky 反応が大好きです。

この著者の最新の記事

関連記事

コメントは利用できません。

募集中!(o゜▽゜)o

エンジャパン
求む、社長!
follow us in feedly

コッチもヨロシク!



最近のネタ!

  1. 2019-12-16

    ロースキルのエンジニアを応援したい!【Agent Grow Advent Calendar 2019:16日目】

    この記事は  Agent Grow Advent Calendar 2019 12月16日目の記事と…
  2. 2019-12-15

    2020年の休日のご案内【Agent Grow Advent Calendar 2019:15日目】

    この記事は Agent Grow Advent Calendar 2019 15日目の記事です。 …
  3. 2019-12-14

    仕事&育児&家事な生活のリアルな日常 ~ 例えば私の場合 ~【Agent Grow Advent Calendar 2019:14日目】

    自分の体験を通じて、 この記事は Agent Grow Advent Calendar 2019 …
  4. 2019-12-13

    ドキッ!?カレーだらけの経営合宿!(レシピもあるよ!)【Agent Grow Advent Calendar 2019:13日目】

    この記事は Agent Grow Advent Calendar 2019 13日目の記事です。 …
  5. 2019-12-12

    今更ChatOpsをしたくてSlack Boltに触れてみた【Agent Grow Advent Calendar 2019:12日目】

    はじめに この記事は Agent Grow Advent Calendar 2019 : 12日目…
ページ上部へ戻る

当サイトに掲載されているコンテンツ(文書、画像等)は、許可なく複製・転用等する事を禁じます。

「フェアネス方式®」(登録6150741)は、日本国内における株式会社エージェントグローの登録商標です。

当サイトでは最低限必要と考えられる場合において、会社名/サービス名/商品名などを記載している場合があります。
これらはあくまでも説明の必要性に応じて用いているものであり、各社の権利等を侵害を目的とするものではございません。
不適切と考えられる場合には、当社お問い合わせフォームよりご連絡ください。

当サイトでは®や™などの表記を省略させていただいております。