CDKのサンプルプロジェクトのリポジトリを作成・公開した


1. はじめに

みなさん、AWS してますか?
値段が安く・触りやすく・記事も豊富にあるので、僕はかなり好きです。

ただそうは言っても、個人で触りたいとなると料金の面で利用できるものとそうでない物が出てきたり、
一旦作成したサービスを忘れることなく全て削除したりするのは面倒な気がします。
また、 Web のコンソールや CLI で作成した物は属人性が高くなり、手順やノウハウが残らないためよくないです。

そこで、便利なのが CDK です。

2. CDKとは

AWS が公式に提供するInfrastructure as Code(=IaC)のライブラリです(GitHub)。
CloudFormation をラップしており、TypescriptPythonなどを用いて実装することで、サービスの作成が可能です。

IaCとしては、前述の CloudFormation や Terraform などもあります。
ただこれらはjsonで記述する必要があり(VSCode だとプラグインで入力補助もあります)、
作成するサービスの量が多くなると見通しが悪くなる可能性があります。

2.1 CDKのメリット

  • AWS が公式に提供しているので利用できなくなるなどの不安はない(と思う)
  • ドキュメントをみながら必要なパラメータを付与していくことになるので、必要な設定などがわかりやすい
  • スタックの名前を変えれば同じ内容のサービスを複数個展開できるため、開発と本番の環境分離なども容易に行える
    • ただし、同一の名前のサービスはできないので、環境ごとに名前を変える必要な場合がある(基本的には)
  • リソースの作成・削除が容易(IaCのメリット)
  • コードでサービスの管理ができるので属人性を排除できる(IaCのメリット)

2.2 CDKのデメリット

  • リリースされたばかりのサービス(機能)は対応できないことがある
    • CloudFormation が対応されたのち、 CDK の対応がされるため
    • (新サービスの LambdaContainer は4時間くらいで更新されていたので、必ずしもそうとは言い切れなくなりましたね笑)
  • リリースの速度がかなり早く、過去に作成したコードが利用できなる可能性がある
    • 2020年12月07日時点で、6日に1度のペースでリリース
    • (とはいえ、破壊的な変更はそこまでない印象)
  • ローカルからのコマンドでの削除が失敗することがある
    • IAM に CDK で管理していない Policy を付与などした場合

3. さわってみる

メリット・デメリットは実際に触ってみて感じるのが一番なので、利用方法を書いていきます。

3.1 環境構築

Mac の場合はbrewにて CDK をインストールできます。

$ brew install aws-cdk

その後、各プロジェクトに必要な CDK の Python ライブラリを入れていく形になります。

$ pip install aws-cdk.aws-lambda

必要になったら、都度パッケージを入れていくことになるのですが、
pypi aws_cdk athenaなどと必要なサービス名を含めて調べるとどのパッケージを入れればいいかわかります。

3.1 公式サンプルプロジェクト

ゼロから、このライブラリをドキュメントから利用方法を探っていくのはかなり大変だと思うので、その際に有用なのがサンプルプロジェクトです。

AWS の公式リポジトリのaws-cdk-exampleが一番信頼できます。
ただ、Python のプロジェクトとなると意外と少なかったり、更新日時が古く動かないサンプルなどもあります。

3.2 作成したサンプルプロジェクト

そのため、私も同じようなフォーマットで、
Python のみのサンプルプロジェクト一覧aws-cdk-small-examplesを作成してみました。
記事作成時点は CDK のバージョンが1.76.0なのですが、その時点で全てのサンプルプログラムが動くようになっています。
作成してみたサンプルプロジェクトの数は12個です。
(本家公式は25個なので、半分程度はあります。ただ、かぶっているサンプルは2個程度のみです)

対応しているサービスなどは以下の通りです。

  • Lambda
  • VPC
  • AWS Batch
  • Step Functions
  • DynamoDB
  • API Gateway
  • CloudFront
  • S3
  • Glue

作成したリポジトリにて、公開しているサービスとその関連を表した図です。
(※注意:これらのサービスが一度にデプロイされるわけではありません)

次の節から公開している、構成図の一部を紹介します。

3.2.1 API Gateway + Lambda + DynamoDB

この例では、3つの Lambda を作成し、DynamoDB にアクセスする app.py を公開しています。

3.2.2 Glue + StepFunctions

この例では、Glue のJobを定義して、それを StepFunctions から実行する app.py を公開しています。
意外と Glue の例は少ないので、もし利用するような方がいれば参考になるかなと思います。

3.2.3 Lambda Container

ここでは、reInvent2020で発表された新サービスの1つである、Lambda Container の例を公開しています。

細かい使い方などは別のQiitaの記事でも紹介しておりますで、合わせてどうぞ。

3.2.4 AWS Batch + StepFunctions

この例では、AWS Batch を StepFunctions と CloudWatch Event を利用して定期実行する app.py を公開しています。
VPC なども一から作成しており、結構長いコードとなっております。
細かい説明などは、Qiitaの記事にて、紹介しております。

3.2.5 NESTED AWS Batch + StepFunctions

CloudFormation がNestに対応したので、3.2.4 の構成をNestで書き換えたを作成しております。
Nestを利用することのメリットは、作成したStackの責任を明確にできることです。

例では、以下のように分離させています。
* VPC のスタック:ベース
* Bathc のスタック:処理などを実際に行う部分
* StepFunctions + CloudWatch Event のスタック:定期的に処理を走らせる部分

3.3 おすすめの記事

4. おわりに

自分の中で、CDK はかなり好きなので、いろんな人に CDK を使っていただきたいなと思います。
IaCを進めるという意味でもかなり良いです。

また、これからも随時GitHubのサンプルは増やしていく予定なので、ぜひチェックなどをお願いいたします。