1. はじめに
みなさん、AWS してますか?
値段が安く・触りやすく・記事も豊富にあるので、僕はかなり好きです。
ただそうは言っても、個人で触りたいとなると料金の面で利用できるものとそうでない物が出てきたり、
一旦作成したサービスを忘れることなく全て削除したりするのは面倒な気がします。
また、 Web のコンソールや CLI で作成した物は属人性が高くなり、手順やノウハウが残らないためよくないです。
そこで、便利なのが CDK です。
2. CDKとは
AWS が公式に提供するInfrastructure as Code(=IaC)
のライブラリです(GitHub)。
CloudFormation をラップしており、Typescript
やPython
などを用いて実装することで、サービスの作成が可能です。
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 おすすめの記事
-
- こちら本家の API reference です。Python 専用の docs もありますが、こちらの方が参考になります。
4. おわりに
自分の中で、CDK はかなり好きなので、いろんな人に CDK を使っていただきたいなと思います。
IaC
を進めるという意味でもかなり良いです。
また、これからも随時GitHubのサンプルは増やしていく予定なので、ぜひチェックなどをお願いいたします。