毎回調べてる気がするのでメモ。
前提
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