毎回調べてる気がするのでメモ。

前提

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

元記事はこちら

AWS Lambdaの関数から別のLambda関数を呼び出すときのNode.js実装とServerless設定