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の対応がされるため
    • (新サービスのLambda Containerは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

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

aws-cdk-small-examples-overall.png

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

3.2.1 API Gateway + Lambda + DynamoDB

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

aws-cdk-small-examples-apigw_dynamodb_lambda.png

3.2.2 Glue + StepFunctions

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

aws-cdk-small-examples-glue_stepfunctions.png

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の記事にて、紹介しております!

aws-cdk-small-examples-batch-stepfunction.png

3.2.5 NESTED AWS Batch + StepFunctions

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

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

aws-cdk-small-examples-batch-stepfunction-nested.png

3.3 おすすめの記事

4. おわりに

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

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