【Tips】Serverless Frameworkで最新のboto3をインストールしたLambda Layerをデプロイする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。DI部の春田です。

表題の件、思わぬところで突っかかってしまったので簡単に共有させていただきます。

問題点

  • 環境:
    • Python 3.7
    • Serverless Framework 1.34.1
    • serverless-python-requirements 4.2.5

2019年6月現在のboto3は、最新バージョンとAWS LambdaのPython3.7ランタイムで使えるデフォルトバージョン間で結構な差分が出てきております。

  • Lambdaの現行バージョン
    • boto3: 1.9.42 (Nov 10, 2018)
    • botocore: 1.12.42
  • 最新
    • boto3: 1.9.174 (Jun 22, 2019)
    • botocore: 1.12.174

AWS Lambda ランタイム - AWS Lambda

実際、デフォルトのバージョン1.9.42では、最新の1.9.174の SFN.Client.create_state_machine で指定できるパラメータ tags がなかったため、デフォルトのboto3を最新のものに上書きしたいと思ったのが動機でした。

ところが、開発環境ではserverless-python-requirementsを使ってPythonのLambda Layerを設定しているのですが、 requirements.txt にそのままboto3を加えてもLayerに反映されなかったのです。

対処

serverless-python-requirementsOmitting Packages によれば、 requirement.txt にインストールしたいパッケージを明示的に記入したとしても、以下のパッケージはデフォルトで除外されてしまうようです。

  • boto3
  • botocore
  • docutils
  • jmespath
  • pip
  • python-dateutil
  • s3transfer
  • setuptools
  • six

これを回避するために、 noDeploy に空のリストを渡しました。

custom:
  pythonRequirements:
    noDeploy: []

サイズは重くなってしまいますが、こうすることで最新バージョンのboto3を使用することができます。