普段 CloudFormation で書いている人が AWS CDK Workshop をやってみて思うこと

2022.08.03

「そろそろ AWS CDK に手を出したほうがいいよな...」と思いながら半年は経ったでしょうか。思い続けても一度も手を動かしていないので一行もコードを書けません。このまま暑い夏とともに今年も終わると悟り、AWS CDK Workshop をやってみました。

AWS CDK Workshop は弊社ブログでもたびたび CDK 入門コンテンツとして取り上げられています。ですのでこれ以上内容を紹介することもなさそうですが、普段 CloudFormation を使っていてかつ、TypeScript はなにも知らない状態からはじめた人の記録として自分自身の整理もかねて記録に残します。また、CDK Workshop を進めるなかで参考にしたサイトを紹介します。

AWS CDK Workshop やってみた

具体的なワークショップ内容は以下の記事をご参照ください。

入門してみた

やってみる前に

モチベーション的なところでは前々から IaC の CI/CD したかったので以下の記事(動画)をみて思い立ちました。

「アプリの次はインフラもCI/CDしよう」「Kubernetesで実現するGitOps」ー AWS DevAx::connect シーズン 3 rethink CI/CD (後編 第 3 回)

AWS CDK Workshop をやってみた

完走するまでの時間は6時間半でした。気になったところを調べたり、typo してハマったりしてすんなりとはいきませんでした。それでも休日1日あれば入門できますねと書きたいところですが、私は平日の夜と土日で少しずつ進めました。

ワークショップの内容と個人的なポイントを簡単に紹介します。

AWS CDK Workshop の URL はどっち?

AWS CDK Workshop で検索すると以下の日本語訳されたリンクもヒットしました。双方を見比べてみると日本語翻訳版は多少古かったです。内容にどの程度の差があるのかはわかりませんでしたが、より新しい本家の AWS CDK Workshop を選びました。

対応プログラミング言語

ワークショップの対応言語はTypeScript, Python, .NET, Java の4コース用意されています。いまから CDK デビューするなら実行サンプルが豊富な TypeScript を選択するのが無難だろうという理由で TypeScript 編を進めました。

ワークショップの実施内容

API Gateway -> Lambda -> DynamoDB のいわゆるサーバレスな構成を CDK でデプロイするワークショップです。

ローカル PC に CDK の実行環境構築からはじまり、サーバレスアーキテクチャのデプロイ、CDK 特有の Constructs に触れます。 その後にオプション扱いの様な Advanced Topics のページがあります。個人的には Advanced Topics の内容がとくに知りたかった内容でした。ここではテストコードを書いて、最終的には CodeCommit への Push をトリガーに CodePipeline が起動してデプロイ(CI/CD)までを体験できます。なので、Advanced Topics までやりきるのがオススメです。

やること

  • CDK の初期設定(cdk boostrap)と、cdk deployなどの基本的なコマンド説明
  • Hello World 的な Lambda をデプロイ
    • AWS のインフラリソースだけではなく Lambda 関数のデプロイも楽だなと実感できます
  • Lambda の前に API Gateway を追加(オススメ)
  • Constructs を書いて学ぶ過程で、Lambda の後ろに DynamoDB を追加
  • 外部のモジュールを利用して DynamoDB のテーブル内容をパブリック公開
  • Advanced Topics の内容
    • Assertion テストと、Validation テストの追加(オススメ)
    • CodePipeline で CI/CD を追加

感想

全体を通してみると CloudFormation の YAML で記述と比べるとコード量が非常に少なくて済むことが印象的でした。具体的には最初に Lambda 単体で作成して、その後に API Gateway を作成して Lambda と紐付けるのですが、API Gateway 追加のコードが3行だけでした。API Gateway + Lambda なら AWS SAM でも十分お手軽記述 & デプロイが楽で満足していた身としては今後 CDK を使っていきたいなという気分にさせてくれました。

CDK を使ってみるともしや AWS SAM よりイケているのでは?と素朴な疑問が湧きます。調べてみるとよくある質問に書いてありました。

Q: AWS CDK と AWS SAM にはどのような関係がありますか?
AWS サーバーレスアプリケーションモデルと AWS CDK はどちらも AWS インフラストラクチャをコードとして抽象化しているため、クラウドインフラストラクチャを簡単に定義できます。AWS SAM は特にサーバーレスのユースケースとアーキテクチャに焦点を当てており、コンパクトで宣言型の JSON/YAML テンプレートでインフラストラクチャを定義できます。AWS CDK は、AWS のすべてのサービスを幅広くカバーしており、TypeScript、Python、C#、Java などの最新のプログラミング言語でクラウドインフラストラクチャを定義できます。AWS SAM と AWS CDK は、どちらも CloudFormation をインフラストラクチャスタックのプロビジョニングエンジンとして利用します。

サーバーレスインフラストラクチャを簡潔な宣言型テンプレートで定義したい場合は、SAM が適しています。AWS インフラストラクチャを使い慣れたプログラミング言語で定義したい場合は、AWS CDK を試してみることをお勧めします。どちらの場合でも、CloudFormation を通じた、再現性があり安全なインフラストラクチャデプロイが実現されます。

AWS クラウド開発のよくある質問

CDK は得意なプログラミング言語で書けてかつ、 Constructs で抽象化されていてコードの記述量が少ない vs AWS SAM は CloudFormation の拡張ですので宣言型で書くという違いはあります。どちらが優れているというわけではなく好みでといったところでしょうか。ここで悩ましいのはインフラエンジニアの様な普段からバリバリ開発していなく特段得意な言語はない人の初手 IaC はなにを選択すると幸せになれるか?となると、CloudFormation、Terraform が候補にあがりそうですが、どうせ始めるなら CDK(TypeScript)も捨てがたいです。ぜひ一度 Workshop やってみてください。

ハマったこと

CDK CodePipeline(Advanced Topics)の章で CodeCommit に Push する場面があります。ワークショップの手順通り Git credentials を発行すれば問題はないとは思うのですが、IAM ロールの権限を Assume Role で時限制の権限を引き受けて CodeCommit を利用したいです。たまにしか CodeCommit を利用しないので毎度なにかしら上手くいきません。今回は以下の記事に助けられました。

知識があると望ましいもの

TypeScript 編を無難なという理由で選択しましたがそもそも TypeScript のことを知りません。最低限の知識があればスムーズに進めたかと思いますが、CDK で使う分にはどこまで構文やお作法をおさえておけばよいのかわかりません。写経しながら気になるところを調べ、細かいところは今後都度学べばよいと割り切って進めました。調べたときのリンクを参考までに一部載せておきます。

Workshop 終えたあと

ネクストステップを紹介されている素晴らしい記事があります。ご参照ください。

おわりに

普段 CloudFormation を利用して AWS のリソースを構築しています。IaC ツールはいろいろありますが、最終的にできあがるものは同じ AWS リソースです。すると、目先の仕事に必要な勉強を優先して手をつけられていませんでした。Workshop をやってみると自分にはどの程度学習コストが必要なのかおおよそ把握できると思います。私の場合は TypeScript の学習コストが重いが、CDK で書く機会増やして書いて覚えた方が早く、書く機会を作ってまで習得したいという魅力を感じました。魅力に感じるのは YAML を書くのに飽きた説も否めません。それでは。