5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AmplifyでLambda Layerを環境非依存にできなかった話とその対策

Last updated at Posted at 2021-08-14

概要

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やそのバージョンを一時的に使用することができる。
やり方はこちらでまとめてくれている。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?