🤔

[AWS SAM]Lambdaレイヤーが追加されない

2023/06/17に公開

はじめに


SAMのテンプレートでAWS::Serverless::LayerVersionリソースを追加して、各関数のLayersに指定したのですが、ビルド/デプロイ後に確認するとレイヤーが追加できていませんでした。その原因を探ります。

動作環境

macOS Monterey 12.6.5

原因

調べた結果、templateファイルの書き方等に問題はなく、コードの置き方に問題があったようです。
Pythonではコードをpython/サブディレクトリに置かないといけませんでした。

$ cd todo_layer/python/
bash-3.2$ tree
.
├── requirements.txt
└── user_numpy.py
  ToDoLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      Description: ToDo Lambda Function Layer
      ContentUri: todo_layer/
      CompatibleRuntimes:
        - python3.9
    Metadata:
      BuildMethod: python3.9

ContentUriには、python/サブディレクトリは含めません。

デベロッパーガイド
によると、

カスタムレイヤーを作成するときは、AWS Lambda が環境変数に頼ってレイヤーコードを見つけます。Lambda ランタイムは、レイヤーコードがコピーされた /opt ディレクトリにパスを含めます。カスタムレイヤーコードを見つけられるようにするため、プロジェクトのビルドアーティファクトのフォルダ構造が、ランタイムが期待するフォルダ構造と一致している必要があります。
例えば、Python ではコードを python/ サブディレクトリに置くことができます。NodeJS では、コードを nodejs/node_modules/ サブディレクトリに置くことができます。

python/ サブディレクトリに置くことができます。
なので、MUSTではないと思ったのですがダメのようです。

コードを python/ サブディレクトリに置いて、ビルド/デプロイした所、無事にレイヤーが追加され、各関数からの呼び出しも問題なく行うことができました。

参考

Discussion