はじめに
@aws-sdk/client-lambdaを使った具体例があまり見つからなかったので、自分の再利用時用に簡単な例をという感じでの記事です。
※ローカル実行したサンプルです。
環境
- node:v16 (ts)
- @aws-sdk/client-lambda
- LambdaClient
- InvokeCommand
- InvokeCommandInput
yarn add @aws-sdk/client-lambda
実行権限 (未検証)
※ローカルで試したので検証していないですが、AWS上で実行する場合は、実行元に下記のようなロールが必要なはず。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PermissionToInvoke",
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:xxxxxx:function:LambdaFunction"
}
]
}
実装
import {
LambdaClient,
InvokeCommand,
InvokeCommandInput
} from '@aws-sdk/client-lambda'
async invoke(bucketName:string, key:string) {
const lambdaClient = new LambdaClient({
region: "ap-northeast-1",
});
// s3のObjectCreateで発火するリクエストの一部を擬似的に作って試した。
const payload =
JSON.stringify({
Records: [
{
s3: {
bucket: {
// name: "test-bucket"
name: bucketName
},
object: {
// key: "images/upload/sample1.webp"
key
}
},
}
]
})
const params: InvokeCommandInput = {
// xxxxxx = AWSアカウント名
// LambdaFunction = 起動するlambda名(lambdaのarn指定で実行可能)
FunctionName: "arn:aws:lambda:ap-northeast-1:xxxxxx:function:LambdaFunction",
InvocationType: "Event", // 非同期
Payload: Buffer.from(payload)
};
const command = new InvokeCommand(params);
await lambdaClient.send(command)
}
所感
実装できるとあっさり。
最初の例がInvokeCommandじゃなく、よく読まずに使おうとしてリクエストが想定と違うなーで少し詰まったくらい。
aws-sdkのv3系、実行方法はあるけどパラメータを指定した実行例があまり見つからないので、個人的に例が欲しいところです。
(それくらい仕様書 or プログラム見てパッとやれよって話なのかもですけど、、、)
参考
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-lambda/
https://github.com/aws/aws-sdk-js-v3/issues/2252
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example.html
https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-lambda/src/models/models_0.ts#L3913