対象のLambda Function
Layerが設定されています。
Layerには共用のNPM Packageがインストールされています。
課題
Amplify MockではLayer付きFunctionのローカル起動をサポートしていません。
起動時に以下のようなエラーが吐き出されます。
Unable to mock myFunction. Mocking a function with layers is not supported. To test in the cloud: run "amplify push" to deploy your function to the cloud and then run "amplify console function" to test your function in the Lambda console.
1. Mock起動前にLayerを外す
Amplify CLI GitHub Issueにコメントがあります。
amplify-meta.jsonからjqを利用してLayerを外すことで起動できるようです。
2. FunctionにLayer環境を移植する
1でLayerを外すことで、そこにインストールされているライブラリが利用できなくなります。
今回のケースでは、NPM Packageを利用できるようにする必要があります。
該当Functionのpackage.jsonに記載していればMock起動時にインストールしてくれるので、
Layerのpackage.jsonの depndencies
を転記すれば良さそうです。
具体的な対応方法
手動対応は当然やりたくないので、コマンドで実行します。
必要に応じてファイルのバックアップは取っておきましょう。
1. Mock起動前にLayerを外す
FUNCTION_NAME="myFunction"
MOCK_META_JSON=`jq ".function.$FUNCTION_NAME.dependsOn = []" /path/to/amplify-meta.json`
echo "$MOCK_META_JSON" > /path/to/amplify-meta.json
2. FunctionにLayer環境を移植する
以下はFunctionのpackage.jsonのdependenciesをLayerのもので置き換えるケースです。
LAYER_DEPENDENCIES=`jq .dependencies /path/to/layer/package.json`
PKG_JSON=`jq . /path/to/function/package.json | jq ". + {\"dependencies\": ($LAYER_DEPENDENCIES) }"`
echo "$PKG_JSON" > /path/to/function/package.json
Amplify Mockでローカル実行する
$ amplify mock function $FUNCTION_NAME --event src/event.json`
amplify-meta.json, package.jsonを戻すのをお忘れなく。