Help us understand the problem. What is going on with this article?

AWS CDKを使ってlambda layerをデプロイしてみた

はじめに

自己研鑽の一環で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を定義していきます。

cdk-stack/lib/cdk-stack.ts
// 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に適用してみます。

cdk-stack/lib/cdk-stack.ts
// 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ロールなどのセキュリティ周りを正しく設定できるように色々調べたいと思います。

hrkzmaaa
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away