概要
Serverless フレームワークを使用して Lambda Layer を作成し、別の Lambda から Layer にあるライブラリを利用する例です。
serverless.yml の設定
Lambda 関数が実行されるサーバーのデフォルトのライブラリ探索パスGEM_PATH
は$LAMBDA_TASK_ROOT/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0
です。
一方でbundle install --deployment
したときにインストールされるパスはvendor/bundle/ruby/2.5.0
になります。
よって、Layer としてデプロイするフォルダをleyers
以下のpath
でvendor/bundle
とし、GEM_PATH
に/opt/ruby/2.5.0
を加えて上書きしています。
また、Serverless での Lambda Layer の詳しい設定はこちらにのっています。
service: lambda-layers
provider:
name: aws
region: ap-northeast-1
stage: ${opt:stage, 'dev'}
runtime: ruby2.5
environment:
GEM_PATH: $LAMBDA_TASK_ROOT/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0:/opt/ruby/2.5.0
package:
individually: true
functions:
helloFunc:
handler: hello.handler
events:
- http:
path: hello
method: get
package:
include:
- hello.rb
layers:
- { Ref: TestLambdaLayer }
layers:
test:
path: vendor/bundle
name: test-${self:provider.stage}
compatibleRuntimes:
- ruby2.5
レイヤーとして使うライブラリのインストール
今回は例としてHashidsというライブラリを使用しました。
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
# gem "rails"
gem 'hashids'
デプロイに必要のためプロジェクトフォルダへインストールします。
bundle
bundle install --deployment
レイヤーを使用する Lambda 関数の作成
require 'hashids'
def handler(event:, context:)
hashids = Hashids.new('this is my salt')
hash = hashids.encode(12_345)
{ statusCode: 200, body: hash }
end
デプロイ & テスト
sls deploy
デプロイが完了すれば、sls invoke
でテストができます。以下のような結果が返れば成功です。
sls invoke -f helloFunc
{
"statusCode": 200,
"body": "NkK9"
}