AWS-如何让一个Lambda呼叫另一个Lambda

时间:2019-10-27 00:26:41

标签: amazon-web-services aws-lambda

当我单独测试第二个lambda时,它将记录插入到dynamoDB中。

然后我有另一个lambda试图调用它,但似乎什么也没发生。

Cloudwatch日志显示没有问题,并在调用后显示puts语句。
但是dynamodb表没有插入任何记录。

两个Lambda都有完整的Lambda访问权限

Lambda 2-LamdaLamdaDynamodb

第二个lambda可以独立工作:

# lambda 'two'
require 'aws-sdk-lambda'
require 'aws-sdk-dynamodb'
require 'time'
require 'json'

def handler(event:, context:)
  p "index2"
  dynamodb = Aws::DynamoDB::Client.new(region: 'us-east-2')
  item = {
      "name": "#{Time.now.to_s[0..19]} #{event['Records'][0]['eventSource']} #{event['Records'][0]['eventName']}",
      "eventTime": "#{Time.now.to_s[0..19]}",
      "eventSource": "lambda",
      "description": "from lambda event",
      "eventID": "#{event['Records'][0]['eventID']}",
      "eventName": "#{event['Records'][0]['eventName']}", 
      "eventSource":"#{event['Records'][0]['eventSource']}",
      "awsRegion":"#{event['Records'][0]['awsRegion']}"
  }
  params = {
      table_name: 'any_event',
      item: item
  }
  begin
    dynamodb.put_item(params)
    puts 'Added item'
  rescue  Aws::DynamoDB::Errors::ServiceError => error
    puts 'Unable to add item:'
    puts error.message
  end
end

Lambda 1-triggerLamdaLamda

第一个尝试调用它的Lambda:

require 'aws-sdk-lambda'
require 'time'
require 'json'
def lambda_handler(event:, context:)
  client = Aws::Lambda::Client.new(region: 'us-east-2')
  payload = '{"name": "thing"}' 
  the_payload = JSON.generate(payload)
  resp = client.invoke({
    function_name: 'LamdaLamdaDynamodb',
    invocation_type: 'RequestResponse',
    log_type: 'None',
    payload: the_payload
  })
end

2 个答案:

答案 0 :(得分:2)

  • 您可以从另一个lambda调用lambda。 github python & terraform implementation
  • 调用方lambda应该具有附加策略,该策略具有lambda:InvokeFunction动作。
  • 假设调用lambda同步调用其他2个lambda,则其应具有invocationType=RequestResponse(其默认类型)。AWSJavaScriptSDK
invoke_resp = LAMBDA_CLIENT.invoke(
        FunctionName='second_lambda',
        InvocationType='RequestResponse',
        Payload=encoded_payload)
  • 不同的invocationType如下RequestResponse (default)EventDryRunaws docs取决于您的同步调用还是异步调用。
  • 在您看来,我唯一想到的就是,此操作需要 lambda:InvokeFunction 操作的许可。

答案 1 :(得分:1)

  1. 将时间用作关键不是一个好主意。参见:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html
  2. 您可以使用“步骤函数”以工作流方式链接Lambda函数。
  3. 第一个Lambda可以发出CloudWatch事件,第二个Lambda可以监听触发事件。该事件将包含有效载荷。

IMO:[3]是最简单的方法。您也可以尝试将function_name参数设置为Lambda函数的ARN。