TL; DR
- VSCode に分からせるには tsconfig.json の paths
- CDK に分からせるには bundling.externalModules
先行研究とか資料
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html
- https://qiita.com/hrkzmaaa/items/afcf08a549c03e23e8a9
- https://qiita.com/hibohiboo/items/b33c530a5a3e8a9c7411
重要な知識
Lambda layer は /opt 以下にマウントされる
例えば ./layers/app-base
以下にファイルだのフォルダだのたくさん置いて、このように指定したとします
const lambda = require('@aws-cdk/aws-lambda')
const layer = new lambda.LayerVersion(this,"theLayer",{
code: lambda.AssetCode.fromAsset("layers/app-base"),
})
こうすると、ローカルの ./layers/app-base/file
が Lambda 環境では /opt/file
としてアクセス可能になります。
同様に、フォルダが含まれる場合は ローカルの ./layers/app-base/path/to/file
が Lambda 環境では /opt/path/to/file
としてアクセス可能になります。
これを利用することで、Lambdaの実装コード中の記述としては require("/opt/path/to/file")
となります。
しかし、このように書いてしまうと aws-lambda-nodejs
を使った変換時にエラーになってしまいます(たぶん(開発のローカルマシンに /opt/path/to/file
があった場合そこを見るのだろうか……))。
そこで /opt/*
以下の指定を無視するようにする必要があります。
CDK で aws-lambda-nodejs
を使っている場合の除外指定
const lfn = require('@aws-cdk/aws-lambda-nodejs');
new lfn.NodejsFunction (this, "function", {
bundling:{
externalModules:[
'aws-sdk',
'/opt/*',
],
},
});
これで aws-lambda-nodejs
を使う場合の不整合は解決されましたが、ローカルでは相変わらずエラー表示が続いているはずです(あなたの開発ローカルマシンには /opt/path/to/file
は存在しないはずなので……)
tsconfig.json で読み替えをお願いする
tsconfig.json を編集します。
"paths": {
"/opt/*": [
"./layers/app-base/*",
],
},
こうすることで、ローカルでは require("/opt/path/to/file")
が ./layers/app-base/path/to/file
を見てくれるようになります。
以上。