概要
AmplifyのLambda layerを環境*非依存にするために試行錯誤したのでメモ。(Lambda layerとはLambda関数で使用するライブラリ群で、例えばJSの場合node_modules
ディレクトリをLambda関数から利用できるようにアップロードしておくものだ。)
環境:amplify env
で切り替えられるenvironmentのこと。
結論
2021/08/14現在、AmplifyでLambda layerの環境に依存する設定をAmplifyの設定ファイルから切り離すことができなかった。
対策としては、Lambda layerをAmplifyの外(Lambdaコンソール等)で直に作成し、ARNをAmplifyのLambda関数で指定して使用することとした。
Amplifyの進化は激しいので、しばらくしたら改善されることを祈る。
詳細
問題
Amplifyでamplify add function
コマンドから、Lambda layerを作成しAmplifyプロジェクトでLambda関数と一緒に管理することが可能なのだが、layerに関してはCloudFormationのテンプレートから環境毎に違う設定を切り出すことができない。
Lambda関数やAPIに関しては、環境依存の設定はパラメータ化してamplify/team-provider-info.json
に環境毎の設定として切り出すことができるのだが、layerに関してはできない。
具体的には amplify/backend/function/mylayer/mylayer-cloudformation-template.json
のようなファイルがlayerのCloudFormationテンプレートになるが、このファイルにlayerの各バージョンがリソースとして記載されてしまう。そして、そのバージョンは環境毎のlayerによって異なるリソースとなるため、環境を切り替える度にこのファイルが書き換えられてしまう。
なんとかこれをパラメータを利用するようにしても、Layerのバージョンが上がるとこのファイルがAmplify CLIによってまるまる上書きされてしまい環境依存の内容に戻ってしまう。
今のところ、これにより大きな障害があったわけではないが、異なる開発者がpull requestを出す度にここが変わっているので、それをマージして良いものか迷うし、本来の設定が何だったのかわからなくなる。
Amplify CLIのリポジトリでも2021/05/27に問題提起されているが有効な解決策が提示されないまま、2021/06/10にメンテナーによってクローズされている。なので、近いうちに改善されるとは思えない。
対策
ワークアラウンドとしてLambda layerをAmpliyの管理下から外した。
Lambdaコンソールで直に作成して、そのARNをAmplify管理下のLambda関数の設定で指定するようにした。
指定する場所はLambda関数のCloudFormationテンプレート amplify/backend/function/myfunction/myfunction-cloudformation-template.json
のようなファイルの、Resources.LambdaFunction.Properties.Layers
になる。
"Resources": {
"LambdaFunction": {
...
"Properties": {
...
"Layers": [
"arn:aws:lambda:ap-northeast-1:00000000000000:layer:mylayer:1"
]
}
},
...
},
おまけ: このANRはパラメータ化できる
このLambda関数のCloudFormationテンプレートではamplify/team-provider-info.json
に切り出したパラメータを使用することができるので、このlayerのARNをパラメータ化してしまえば、環境毎に切り替えることが可能だ。
また、パラメータのデフォルト値に通常利用するARNを設定しておき、必要なときだけamplify/team-provider-info.json
に任意のARNを設定することで、異なるLambda layerやそのバージョンを一時的に使用することができる。
やり方はこちらでまとめてくれている。