概要
SAM でライブラリをレイヤー化し、メインの Lambda 関数から呼び出すまでの方法を書き留めています。
使用するランタイムは Ruby2.5 です。
Ruby 2.5.3 SAM CLI 0.44.0
プロジェクトの作成
今回は SAM CLI のジェネレータを使ってサンプルとなるプロジェクトを作成します。
sam init --name sam-app --runtime ruby2.5
cd sam-app
レイヤーの作成
次にレイヤーとなるフォルダを作成し、ライブラリをインストールします。
mkdir app_layer && cd app_layer
bundle init
gem 'hashids'
Gemfile に使いたいライブラリを記載して、bundle install --path .
コマンドを実行します。
もし、使いたいライブラリが native extension の場合は docker イメージを使って Linux 環境でバンドルします。
docker run --rm -v ${PWD}:/var/task lambci/lambda:build-ruby2.5 bundle install --path .
template.yaml の編集
リソース定義ファイルにレイヤーの設定を追加します。
プロジェクトのルートにあるtemplate.yaml
を開いて、Resources 項目の一番下に以下を追記します。
Resources:
# ...略
AppLayer:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: app_layer/
次に、ライブラリを呼び出す側の関数にレイヤーを紐付けします。
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
# ...略
Layers:
- !Ref AppLayer
環境変数 GEM_PATH を設定して、ライブラリの探索パスを変更します。
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
# ...略
Environment:
Variables:
GEM_PATH: /opt/ruby/2.5.0:/opt/ruby/gems/2.5.0:/opt/ruby/2.5.0
メインの Lambda 関数を編集
レイヤーの作成が完了したのでメインの関数からライブラリを呼び出すようにコードを編集します。
require 'hashids'
def lambda_handler(event:, context:)
hashids = Hashids.new('this is my salt')
hash = hashids.encode(12_345)
{ statusCode: 200, body: hash }
end
ローカルでテストする
すべての準備が整ったのでテストしてみます。
プロジェクトのルートで sam local start-api
コマンドを実行するとローカルサーバーが起動します。
http://localhost:3000/hello
にアクセスし、ランダムな文字列が表示されていれば成功です。