概要

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にアクセスし、ランダムな文字列が表示されていれば成功です。