🧑‍🤝‍🧑

Serverless Frameworkを用いてLambdaコンテナのECRへの格納とローカル実行を共存させる

2022/10/07に公開

ECRにデプロイしたいしローカルで実行もしたい

単純にECR用の設定を既存のものに加えるとデプロイ時に怒られるのでその対処法です。

背景と問題の詳細

Serverless Frameworkを用いて、Lambdaをzipでデプロイする場合、以下のように設定するかと思います。

functions:
  <lambdaファンクション>:
    handler: <ハンドラーのパス>

こちらの記事に記載の通り、以下のように設定することで、Serverless Frameworkを用いてECRへのデプロイが可能です。

provider:
  ecr:
    images:
      <タグ名>:
        path: <Dockerfileの置いてあるディレクトリのパス>

...

functions:
  <lambdaファンクション>:
    image:
      name: <タグ名>
      command:
        - <ハンドラーのパス>

しかし、この方式をとった場合、$ sls offlineコマンドを用いたローカル実行がうまくいきません。これはhandlerを設定から削除しているためで、以下のように共存させることでローカル実行は正常に動作します。

functions:
  <lambdaファンクション>:
    handler: <ハンドラーのパス>
    image:
      name: <タグ名>
      command:
        - <ハンドラーのパス>

これで解決かと一見思えるのですが、ここで、$ sls deployをすると、handlerimageは共存できないと言われデプロイ出来ないことがわかります。

解決策

serverless-offlineのIssueを見てみる

本件そのままのIssueが報告されており、2つの解決策がコメントされています。
一つはserverless-plugin-ifelseプラグインを用いる方法、もう一つはhandlerimageを用いる定義ファイルをそれぞれ用意し実行時のフラグによって切り替えるというものになります。

自分の場合は1つ目の方法で対処しました。serverless-plugin-ifelseを用いて以下のように対応します(Ifの箇所は好みで対応。Excludeはほぼ同じになるかと)

custom: 
  serverlessIfElse:
    - If: '"${sls:stage}" != "local"'
      Exclude:
        - functions.<lambdaファンクション>.handler

結論

これでデプロイ時(stagelocalではなくdevprdの場合)にはhandlerが取り除かれ、handlerimageが共存できないと怒られなくなります

Discussion