2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS SAMを使ってLambdaにLayer設定する方法

Last updated at Posted at 2020-03-16

AWS SAMを使ってLambdaにLayerを設定する方法

はじめに

AWS SAMでLambdaやdynamoDBを使ったサーバーレスアプリケーションを構築しているといろいろなプロジェクトで共通で使っているコードがでてきたりします。
共通化できるものはさっさと共通化して必要なときに呼び出しができるようになると便利なのでさっそく実践してみました。

AWS LambdaにはLayer機能があり、Lambdaのコードで使いたいライブラリなどを設定する事ができます。
Layerに依存関係のあるコードやライブラリをAWS SAMのプロジェクトとしてまとめて設定する方法を調べてやってみました。

Layerに必要なライブラリをZipでまとめてS3に保存して、AWSコンソールから設定する方法はいくつか見つけましたが、AWS SAMのプロジェクトとしてまとめてdeployする方法がなかなかうまくできなかったので備忘録として書いておきます。

前提条件

AWS SAM CLIのインストールはすでに済んでいるものとして説明します。
今回の説明ではPython3.6を使っています。

ディレクトリ構成

Layerとして使いたいコードやライブラリなどを格納するディレクトリは言語ごとに決められています。
AWS Lambda ライブラリの依存関係をレイヤーに含める

pythonならpythonpython/lib/python3.6/site-packagesに格納しておかないと下記のような参照エラーが表示されます。

Unable to import module 'app': cannot import name 'layer_code'

sam initコマンドで作成したSAMプロジェクトにLayerを格納するディレクトリを追加します。

sam-app
├── README.md
├── app
│   ├── __init__.py
│   ├── app.py
│   └── requirements.txt
├── events
│   └── event.json
├── layer                       // ここにLayer格納用ディレクトリを追加
│   └── python                  // 言語名ディレクトリ
│       └── sample
│           └── sample_layer.py   // Layerとして使いたいコード
└── template.yaml

template.yamlの書き方

template.yaml
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: hello-world-sample-function
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.6
      Layers:
        - !Ref LayerSampleLayer     # ポイント1
      Events:
        (省略)

  # Layer定義
  LayerSampleLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: layer-sample-layer
      Description: Hello World Sample Application Resource Layer
      ContentUri: layer              # ポイント2

template.yamlの書き方のポイントは2つです。

  1. Lambda関数定義にLayersの項目を追加してLayer定義を参照するように設定する

  2. Layer定義ではLayerのコードを格納しているフォルダパスを設定する
    →正確には言語名ディレクトリの親ディレクトリを設定する

app.pyでのimport

template.yamlでLayer設定をしておくとapp.pyと同一階層にあるものとして使えるようになります。
ただ一度sam buildを行わないと設定は反映されません。

app.py
# レイヤーとして追加したファイルを参照する
from sample import sample_layer

def lambda_handler(event, context):
    res = sample_layer.hello()
    return res

sample_layer.py
def hello():
    return "hello Layer!"

参考

AWS サーバーレスアプリケーションモデル (AWS SAM) とは
AWS Lambda レイヤー

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?