AWS CDK でアプリと一緒にインフラをコードで操ろう !

~ AWS CDK で試して学ぶサーバーレス開発の達人の技 #1 ~

2024-11-01
デベロッパーのためのクラウド活用方法

Author : 高野 賢司

みなさんこんにちは ! AWS の高野 賢司です。私は Infrastructure as Code (IaC) の技術が大好きで、毎週リリースされる AWS CDK のアップデート内容を解説する ことで AWS のサービスを学んでいます。

シリーズ『AWS CDK で試して学ぶサーバーレス開発の達人の技』では、インフラからアプリまでさまざまな領域の「達人」にインタビューして、開発高速化のための「達人の技」を AWS CDK を使って試していきます。これから数回にわたって「テスト自動化の基本」、「AWS SAM でのローカルデバッグ」、「Lambda Web Adapter の活用」、「AWS Step Functions を素早くデプロイする方法」などを取り上げる予定です。サーバーレス初心者の私と一緒に学んでいきましょう !

主にサーバーレス開発に携わるアプリエンジニアの方を対象としています。AWS CDK を使っていて、これからサーバーレス開発を学び始めたいインフラエンジニアの方にもおすすめです。

各回の達人の技は独立しており、すべてを同時に組み合わせる必要はありません。開発しているプロダクトの性質やチームの文化などによって、「これは使えそうだ」と思ったものを試してみてください。

第一回は、IaC の達人として私高野が「AWS CDK で AWS Lambda 関数をサクッとデプロイする技」を紹介します。Lambda 関数を動かすには、アプリのコードを書くだけでなくインフラの設定とデプロイも必要です。IDE から出ずに、アプリとインフラをコードだけで操れる AWS CDK はサーバーレスをぐっと身近にしてくれます。

また後半では、サーバーレス開発の高速化を始めるために「サーバーレス開発の速さの要素」を分解して理解を深めます。

※ 本記事の内容は次の環境で検証しています: AWS CDK v2.160.0 / Node.js v20.13.1 / macOS Sonoma


AWS CDK で Lambda 関数をサクッとデプロイしてみよう

プログラミングが得意なアプリエンジニアは、AWS CDK による開発速度向上のメリットを最大限に享受できます。

AWS Cloud Development Kit (CDK) は、使い慣れたプログラミング言語で クラウドリソースを定義できるオープンソースのフレームワークです。2024 年 11 月現在、6 つのプログラミング言語 (TypeScript, JavaScript, Python, Java, C# .NET, Go) に対応しています。つまり、アプリと同じプログラミング言語を使って、IDE から出ずにクラウドインフラを定義できます。

例えば、TypeScript で書かれた Lambda 関数を定義するには、このように記述します。

// Lambda function to list objects in bucket
const f = new NodejsFunction(this, "Function", {
    entry: "lambda/list-object.ts",
});

NodejsFunction クラスは、AWS CDK のコンストラクトのひとつです。コンストラクトはさまざまなクラウドリソースを定義するための構成要素です。NodejsFunction は特に TypeScript または JavaScript で書かれたコードを Lambda 関数としてデプロイするのを簡単にしてくれます。たとえば、entry に指定されたファイルの拡張子をもとに、esbuild を使用して「いい感じに」バンドルする機能を持っています。

また、YAML や JSON ファイル、ドメイン固有言語 (DSL) などで記述する IaC ツールと異なり、IDE で開発する際にプログラミング言語の型チェックや入力補完が利用できます。

Lambda 関数をデプロイするには、次のようなコマンドを実行します。

npx cdk deploy

これだけで、必要な一連の処理 (TypeScript のコードをトランスパイル、バンドルして、zip ファイルに固め、Amazon S3 バケットにアップロードし、Lambda 関数をプロビジョニング) を実行してくれます。AWS CDK は IaC ツールのひとつですが、クラウドリソースが要求するファイルやコンテナイメージなどのアセット (資材) も一緒にデプロイしてくれます。つまり、アプリのデプロイも AWS CDK の守備範囲です。

達人の技 1 / ホットスワップで Lambda 関数にすばやくコードを反映

✨️技の効果 : クラウドでのテストにおいて、検証にかかる時間を短くする

Lambda 関数のコードを変更したとき、すぐにクラウドに反映して動作を確認したいですよね。そんなときはホットスワップ機能の出番です。CDK のデプロイコマンドに --hotswap オプションをつけて、以下のように実行できます。

npx cdk deploy --hotswap

AWS CDK では通常、AWS CloudFormation を介してリソースをプロビジョニングします。CloudFormation の実行時間は 2024 年の 3 月に最大で 40% 短縮 しているのですが、それでも開発中に頻繁にコードを変更する場合は長く感じます。ホットスワップ機能は、サポートしているリソースタイプ に限り、CloudFormation を経由せずに直接 AWS API を叩いて変更を適用します。これによりデプロイ時間を数十秒程度に短縮できます (コードの規模や構成によります)。注意点として、CloudFormation スタックとのドリフト (乖離) が発生してしまうため、ホットスワップの利用は開発環境のみにとどめてください。

また、cdk watch コマンドを使用すると、ファイルの変更を自動的に検出してホットスワップデプロイを行ってくれます。さらに、Amazon CloudWatch Logs に出力される Lambda 関数のログを自動的にコンソールに流してくれる機能も持っています。

達人の技 2 / grant メソッドで IAM ポリシーを自動生成

✨️技の効果:コードを書く時間を短くする。さらに、正しい IAM ポリシーを完成させるまでの反復回数を減らす

Lambda 関数で、Amazon S3 バケットにあるオブジェクトを一覧表示したいとしましょう。Lambda 関数はデフォルトでは S3 バケットへのアクセス権をもたないため、通常であれば IAM ロールを作成し、ポリシーを定義してアタッチする必要があります。IAM ポリシーの作成には AWS サービスの知識と試行錯誤が必要となるため、時間がかかるタスクの一つです。

AWS CDK の多くのコンストラクトには grant メソッド が定義されています。以下のように記述すると、CDK が IAM ポリシーを自動的に生成してくれます。

// S3 bucket for contents
const bucket = new Bucket(this, "Bucket");

// Lambda function to list objects in bucket
const f = new NodejsFunction(this, "Function", {
    entry: "lambda/list-object.ts",
    environment: {
    BUCKET_NAME: bucket.bucketName,
    },
});
bucket.grantRead(f);

bucket.grantRead() メソッドに注目すると、引数として IAM ロールではなく Lambda 関数を渡しています。これは Lambda 関数が IGrantable インターフェースを実装しているためで、実際には Lambda 関数の実行ロールに権限が付与されます。これはコーディング中のアプリエンジニアから IAM ロールやポリシーに関する認知負荷を減らします。

あわせて、S3 バケットを宣言し、バケット名を Lambda の環境変数 (environment プロパティ) に渡しているところも確認してみてください。直感的に書けていると思いませんか ?

実は CDK による IAM ポリシーの自動生成機能はこれだけではありません。サーバーレス開発でよく使用する AWS Step Functions や Amazon EventBridge では、明示的に grant メソッドを呼ぶことなく「いい感じに」権限を追加してくれるので、より便利に使えます。こちらについては今後の連載で紹介する予定です。

AWS CDK を試してみよう !

AWS CDK Immersion Day ワークショップ は、今回紹介した「ホットスワップデプロイ」や「grant メソッド」を含め、AWS CDK を基礎から学ぶことができます。日本語に対応しており、TypeScript, Python, Go で実際にコードを書きながら AWS CDK でのサーバーレス開発を試すことができます。ぜひトライしてみてください !


サーバーレス開発の「速さ」ってなんだ ?

AWS CDK を使うと、クラウドリソースの定義やデプロイが簡単かつ素早くできることを学びました。しかし、サーバーレス開発の現場ではタスクはそれだけではありません。AWS CDK はサーバーレス開発のどの部分に効くのでしょうか ?

サーバーレス開発をするときは、インフラ構築とアプリのデプロイを繰り返し行います。AWS Lambda などのサーバーレスサービスを使用する場合、メモリサイズの調整や権限設定など、インフラ (クラウドリソース) の設定変更も頻繁に行います。つまり、サーバーレス開発全体を速く行うには、インフラとアプリのデプロイを両方とも速くしなければなりません。

開発の速さを考えるには、まず測定するスコープを決める必要があります。ここでは「コードを書き始めてから、メインブランチに統合されるまで」の時間について考えてみます。プランニングは含みません。

コーディングフェーズでの開発者の行動をブレイクダウンしてみると、「コードを書く」「検証する」を常に繰り返していることに気付きます。検証して得たフィードバックをもとに、正解のコードを徐々に探り当てます。

フィードバックを得るための手段には、IDE を離れずに実行できるコンパイラや Linter などのツールや、ローカルでのテスト、クラウドでのテスト、そしてレビューがあります。これらは右 (後工程) に進むほどフィードバックを得るためにかかる時間が長くなる傾向があります。コードを完成させるまでの道のりには試行錯誤がつきもので、順番を飛ばしたり戻ったりすることもあります。

コーディングフェーズ全体でかかる時間は、上の図でたどった線の長さと考えることができます。一直線に並べてみると次のようになります。

このように表すと、コーディングフェーズを早く終わらせるには 3 つのアプローチがあることがわかります。(分解のしかたやアプローチにはさまざまな考え方があるため、一例としてご理解ください)

  • コードを書く時間を短くする : ライブラリを使って複雑な処理を抽象化したり、IDE による入力補完や生成 AI によるコード生成を利用したりすることで、コードを書く (アウトプットする) 時間が短縮できます。コードを実行せずにフィードバックを得るために、型チェックや Linter を活用することも有効です。
  • 検証時間を短くする : 手動でコードを実行して結果を確認するのを自動化したり、クラウドへのデプロイにかかる時間を短縮したりすることで、単一の検証プロセスを短縮できます。また、E2E テストよりも軽量なユニットテストに比重をおいたり、クラウドテストよりもローカルテストで確認できることを増やしたりすることで検証プロセス全体を短縮できます。
  • 反復回数を減らす : コーディングは探索的なプロセスのため、意識的に検証の反復回数を減らすことは難しいのですが、フレームワークやサービスを利用してコードの量や複雑性を減らしたり、すでに検証済みのモジュールを再利用したりすることが有効です。生成 AI にコードの記述と検証を代わってもらって、人間がする反復回数を減らすことも現実的になりつつあります。

このように分解してみると、サーバーレス開発ではプログラミングのテクニックだけでなく、より楽にコードを検証するための戦略やクラウドサービスの理解も重要であることがわかります。

ところで、この記事の「達人の技」の説明に、カードゲームのように「技の効果」が書いてあったことに気付いたでしょうか ?

達人の技 1 / ホットスワップで Lambda 関数にすばやくコードを反映
✨️技の効果:クラウドでのテストにおいて、検証にかかる時間を短くする

達人の技 2 / grant メソッドで IAM ポリシーを自動生成
✨️技の効果:コードを書く時間を短くする。さらに、正しい IAM ポリシーを完成させるまでの反復回数を減らす

AWS CDK は、ビジネスロジックの記述に集中することを助けることによって、サーバーレス開発を速くする効果があると言えるでしょう。さらに、アプリ全体をコードで定義することによって、複雑さを緩和し、クラウドを開発者の手の内におさめてくれるツールでもあります。


次回予告

今回は AWS CDK にフォーカスして、サーバーレス開発をどのように高速化できるかを考えました。しかし、高速化のためにできることはまだまだたくさんありそうですね !

おや、次の「サーバーレス開発の達人」が来てくれたようです。

??? 「急がば回れ。サーバーレス開発をもっと速くするには、テストの自動化を上手にやろう !」

次回もお楽しみに !


ここから学び始めよう!参考コンテンツ集


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

高野 賢司 ( Kono, Kenji / @konokenj)
アマゾン ウェブ サービス ジャパン合同会社
シニア ソリューション アーキテクト

名古屋在住のソリューションアーキテクトとして、主に東海地方の製造業のお客様を技術面でサポートしています。 Infrastructure as Code (IaC) のスペシャリストとして、イベント登壇や Baseline Environment on AWS (BLEA) の開発も行っています。
マンガが大好きなのですが、登場人物の名前が覚えられません。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する