layer と serverless のメモ

lambda layer

lambda layer 使う際のメモ。

/opt/(zipパッケージ名)/file となる。

import sys

def lambda_handler(event, context):
    
    print(sys.path)

# ['/var/task', '/opt/python/lib/python3.7/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python37.zip', '/var/lang/lib/
# python3.7', '/var/lang/lib/python3.7/lib-dynload', '/var/lang/lib/python3.7/site-packages', '/opt/python/lib/python3.7/site-packages']

なので、layer としてあげるパッケージは python ディレクトリを圧縮するとあまり悩まなくて済む。

serverless framework cli

CLI イメージのメモ。

プロジェクト作成。

sls create --template aws-python

デプロイ。

sls deploy --aws-profile (profile name)

--aws-profileserverless.yml に書いてあればいらない。

provider:
# you can overwrite defaults here
  stage: dev
  region: us-east-1

sls deploy すると同じディレクトリにあるファイルやディレクトリも lambda にあがるっぽい。

serverless.yml で制御可能。

package:
#  include:
#    - include-me.py
#    - include-me-dir/**
  exclude:
    - Pipfile
    - python/**
    - python.zip

起動。

sls invoke -f hello

-fserverless.ymlfunctions 定義。

functions:
  *hello*: 
    handler: handler.hello

event を投げて invoke する場合。

-p(file)path

sls invoke -f hello -p event.json

-ddata

sls invoke -f hello -d "test"

削除。

sls remove

sls logs -f (function)

Serverless: Listing deployments:
Serverless: -------------
Serverless: Timestamp: 1561802225906
Serverless: Datetime: 2019-06-29T09:57:05.906Z
Serverless: Files:
Serverless: - aws-python.zip
Serverless: - compiled-cloudformation-template.json
Serverless: Listing functions and their last 5 versions:
Serverless: -------------
Serverless: hello: $LATEST, 5
Service Information
service: aws-python
stage: dev
region: us-east-1
stack: aws-python-dev
resources: 5
api keys:
  None
endpoints:
  None
functions:
  hello: aws-python-dev-hello
layers:
  None
Service wide metrics
June 28, 2019 7:04 PM - June 29, 2019 7:04 PM

Invocations: 7
Throttles: 0
Errors: 0
Duration (avg.): 1.09ms
service: aws-python
provider:
  stage: dev
  region: us-east-1
  name: aws
  runtime: python3.7
package:
  exclude:
    - Pipfile
    - python/**
    - python.zip
functions:
  hello:
    handler: handler.hello
    events: []
    name: aws-python-dev-hello
(略)
--------------------------------------------------------------------
START RequestId: b6cc890b-ce85-4728-a81a-3676385a2c7d Version: $LATEST
END RequestId: b6cc890b-ce85-4728-a81a-3676385a2c7d
REPORT RequestId: b6cc890b-ce85-4728-a81a-3676385a2c7d  Duration: 1.36 ms       Billed Duration: 100 ms         Memory Size: 1024 MB    Max Memory Used: 54 MB

serverless framework layer

layer を使いたいとき

ドキュメントでは Ref の設定は layer の名前を TitleCased で記載とあるけど実際は、TitleCase+LambdaLayer のように見える。そもそも TitleCased をよく知らないのだけど、単語の頭文字を大文字にするだけではないのかな。

https://en.wikipedia.org/wiki/Letter_case#Title_Case

layers:
  layerOne:
    path: python
    name: ${self:provider.stage}-${self:provider.region}-layer
    description: Description
    compatibleRuntimes:
      - python3.7

functions:
  hello:
    handler: handler.hello
    layers:
      - {Ref: LayerOneLambdaLayer}

layer のモジュールが import できない

以下の構成だと、/opt 配下に格納されてしまったので import 出来なかったようです。feedparser を例に。

layers:
  layerOne:
    path: python
.
├── Pipfile
├── event.json
├── handler.py
├── python
│   ├── __pycache__
│   │   └── feedparser.cpython-35.pyc
│   ├── feedparser-5.2.1.dist-info
│   │   ├── DESCRIPTION.rst
│   │   ├── INSTALLER
│   │   ├── METADATA
│   │   ├── RECORD
│   │   ├── WHEEL
│   │   ├── metadata.json
│   │   └── top_level.txt
│   └── feedparser.py
├── python.zip
└── serverless.yml

以下に変更すると import で使用できた。

layers:
  layerOne:
    path: module
.
├── Pipfile
├── event.json
├── handler.py
├── module
│   └── python
│       ├── __pycache__
│       │   └── feedparser.cpython-35.pyc
│       ├── feedparser-5.2.1.dist-info
│       │   ├── DESCRIPTION.rst
│       │   ├── INSTALLER
│       │   ├── METADATA
│       │   ├── RECORD
│       │   ├── WHEEL
│       │   ├── metadata.json
│       │   └── top_level.txt
│       └── feedparser.py
└── serverless.yml
© てっくらのーと/mkr-note 2024