はじめに
自己研鑽の一環でAWS CDKを使っているのですが、lambda layerをデプロイするようなサンプルがあまりないように感じたので、自分で試行錯誤しながらやってみました。
開発環境
- aws-cdk:1.58.0
- cdk使用言語:typescript
前提として
cdkを使えるような環境のセットアップが出来ている前提で記載していきます。
私は以下の記事を参考にさせていただきました。
https://dev.classmethod.jp/articles/aws-cdk-101-typescript/
ディレクトリ構成
本記事のディレクトリ構成は以下のようになっています。
├─backend
│ └─ src
│ ├─function
│ │ └─sample
│ └─layer
│ └─SharedLayer
│ └─nodejs
│ └─node_modules
└─cdk-stack
├─bin
├─lib
└─test
定義してみる
さっそくですがlambda layerを定義していきます。
// lambdaとlambda layerを定義するためのライブラリ
import { AssetCode, Function, Runtime, LayerVersion } from '@aws-cdk/aws-lambda';
// lambdaLayerの定義
const nodeModulesLayer = new LayerVersion(this, 'NodeModulesLayer',
{
code: AssetCode.fromAsset('../backend/src/layer/SharedLayer'),
compatibleRuntimes: [Runtime.NODEJS_12_X]
}
);
以上です。
たったこれだけで定義が出来るのはすごいですね。
ポイントはbackendのディレクトリ構成です。
lambda layerはnodejs/node_modulesのディレクトリ構成にする必要があり、cdk-stack.tsではcodeにnodejs以下を含むディレクトリを指定しています。
lambdaに適用してみる
先ほど定義したlayerをlambdaに適用してみます。
// lambda関数の定義
const sampleLambda = new Function(this, `sample-lambda-function`, {
code: new AssetCode('../backend/src/function/sample'),
handler: 'index.handler',
runtime: Runtime.NODEJS_12_X,
layers: [nodeModulesLayer],
functionName: 'sampleFunction'
});
上記のようにlayersのキーに配列で定義したlambda layerを記載してあげるだけでOKです。
あとはcdk deployコマンドでデプロイすれば完了です。
さいごに
やはりプログラミングをする感覚でサーバレスアーキテクチャを構築できるのはyamlで書くより直感的で良いですね。
今後は実務での利用を目指してAPIGatewayのリソースポリシーやIAMロールなどのセキュリティ周りを正しく設定できるように色々調べたいと思います。