毎回調べてる気がするのでメモ。
前提
AWSアカウントがあってaws configure
でアカウントキーの設定済み。
> node -v
v10.11.0
> npm -v
6.9.0
> aws --version
aws-cli/1.16.153 Python/3.6.6 Darwin/18.6.0 botocore/1.12.143
> sls -v
1.43.0
環境構築
serverlessで環境を作成します。
> sls create -t aws-nodejs \
-p invoke-lambda-fcn-on-lambda
> cd invoke-lambda-fcn-on-lambda
> npm init
# ローカルでテストするならインストールする
> npm i -d --save-dev aws-sdk
実装と設定
handler.js
'use strict';
module.exports.hello = async (event) => {
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();
let result = await lambda.invoke({
FunctionName: 'invoke-lambda-fcn-on-lambda-dev-hoge',
InvocationType: 'RequestResponse',
Payload: JSON.stringify({"hoge": "hoge"})
}).promise();
console.log('invoke function', result);
return {
statusCode: 200,
body: JSON.stringify({
message: result,
input: event,
}, null, 2),
};
};
module.exports.hoge = async (event) => {
return {
statusCode: 200,
body: JSON.stringify({
message: event.Body,
input: event,
}, null, 2),
};
};
iamRoleStatements
になに設定するんだっけなーって毎回悩みます。
serverless.yml
service: invoke-lambda-fcn-on-lambda
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-1
iamRoleStatements:
- Effect: 'Allow'
Action:
- 'lambda:InvokeFunction'
Resource:
- '*'
functions:
hello:
handler: handler.hello
hoge:
handler: handler.hoge
デプロイと動作確認
sls invoke local
でローカル実行させたいのですが、lambda.invoke
メソッドで実行できるのはデプロイ済みの関数だけっぽいです。(未調査)
> sls deploy
(略)
Serverless: Stack update finished...
Service Information
service: invoke-lambda-fcn-on-lambda
stage: dev
region: us-east-1
stack: invoke-lambda-fcn-on-lambda-dev
resources: 8
api keys:
None
endpoints:
None
functions:
hello: invoke-lambda-fcn-on-lambda-dev-hello
hoge: invoke-lambda-fcn-on-lambda-dev-hoge
layers:
None
> sls invoke -f hello -log
{
"statusCode": 200,
"body": "{\n \"message\": {\n \"StatusCode\": 200,\n \"ExecutedVersion\": \"$LATEST\",\n \"Payload\": \"{\\\"statusCode\\\":200,\\\"body\\\":\\\"{\\\\n \\\\\\\"input\\\\\\\": {\\\\n \\\\\\\"hoge\\\\\\\": \\\\\\\"hoge\\\\\\\"\\\\n }\\\\n}\\\"}\"\n },\n \"input\": {}\n}"
}
--------------------------------------------------------------------
START RequestId: f83cec93-032a-4159-90a5-a4345fa68672 Version: $LATEST
'{"statusCode":200,"body":"{\\n \\"input\\": {\\n \\"hoge\\": \\"hoge\\"\\n }\\n}"}' } function { StatusCode: 200,
END RequestId: f83cec93-032a-4159-90a5-a4345fa68672
REPORT RequestId: f83cec93-032a-4159-90a5-a4345fa68672 Duration: 34.77 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 93 MB
はい。
環境のお片付けもお忘れなく。
> sls remove
参考
amazon web services - AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction - Stack Overflow
https://stackoverflow.com/questions/37498124/accessdeniedexception-user-is-not-authorized-to-perform-lambdainvokefunction