🧑🤝🧑
Serverless Frameworkを用いてLambdaコンテナのECRへの格納とローカル実行を共存させる
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
をすると、handler
とimage
は共存できないと言われデプロイ出来ないことがわかります。
解決策
serverless-offlineのIssueを見てみる
本件そのままのIssueが報告されており、2つの解決策がコメントされています。
一つはserverless-plugin-ifelse
プラグインを用いる方法、もう一つはhandler
とimage
を用いる定義ファイルをそれぞれ用意し実行時のフラグによって切り替えるというものになります。
自分の場合は1つ目の方法で対処しました。serverless-plugin-ifelse
を用いて以下のように対応します(Ifの箇所は好みで対応。Excludeはほぼ同じになるかと)
custom:
serverlessIfElse:
- If: '"${sls:stage}" != "local"'
Exclude:
- functions.<lambdaファンクション>.handler
結論
これでデプロイ時(stage
がlocal
ではなくdev
やprd
の場合)にはhandler
が取り除かれ、handler
とimage
が共存できないと怒られなくなります
Discussion