aws - как заставить одну лямбду звонить другой - PullRequest
1 голос
/ 27 октября 2019

2-я лямбда работает и вставляет запись в DynamoDB, когда я тестирую ее один.

У меня есть другая лямбда, которая пытается вызвать ее, но ничего не происходит.

Журналы Cloudwatchпокажите никаких проблем и покажите ставит операторы после вызова.
Но таблица динамодаба не вставляет никаких записей.

Обе лямбды имеют полный лямбда-доступ

Лямбда 2 - LamdaLamdaDynamodb

2-я лямбда, которая работает сама по себе:

# 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

Лямбда 1 - triggerLamdaLamda

Первая лямбда, которая пытается вызвать ее:

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 ]

2 голосов
/ 27 октября 2019
  • Вы можете назвать лямбду из другой лямбды. github python и реализация terraform
  • Вызывающая лямбда должна иметь роль с прикрепленной политикой, имеющей действие lambda:InvokeFunction.
  • Вызывающая лямбда, предполагающая, что она вызывает другие 2 лямбда синхроннодолжно иметь invocationType=RequestResponse (это тип по умолчанию). AWSJavaScriptSDK
invoke_resp = LAMBDA_CLIENT.invoke(
        FunctionName='second_lambda',
        InvocationType='RequestResponse',
        Payload=encoded_payload)
  • Различными invocationType являются следующие RequestResponse (default), Event и DryRun. aws docs В зависимости от вашего синхронного вызова или асинхронного вызова.
  • В вашем случае единственное, чего не хватает, о чем я могу подумать, это: для этой операции требуется разрешение для лямбда: InvokeFunction action.
1 голос
/ 27 октября 2019
  1. Использование времени в качестве ключа не очень хорошая идея. См .: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html
  2. Вы можете использовать пошаговые функции для цепочки лямбда-функций в режиме рабочего процесса.
  3. Первая лямбда может генерировать событие CloudWatch, которое вторая лямбда может прослушивать как триггер. Событие будет содержать полезную нагрузку.

IMO: [3] - самый простой способ сделать это. Вы также можете попробовать установить для параметра function_name значение ARN лямбда-функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...