Как исправить блокировку DynamoDB JS API и тайм-аут моей лямбда-функции?

Я пытаюсь получить доступ к AWS DynamoDB из функции Lambda. Когда я вызываю клиентскую функцию сканирования документа с помощью обещания, она никогда не возвращается, даже если я увеличиваю тайм-аут функции до целой минуты.

Я использую бессерверную платформу, Node 8.10, и я настроил «iamRoleStatements», чтобы разрешить Dynamodb и ARN таблицы.

serverless.yml:

provider:
  name: aws
  runtime: nodejs8.10
  timeout: 6
  region: us-east-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:*
      Resource: "[arn from dynamodb]"

handler.js:

const dynamodb = new AWS.DynamoDB.DocumentClient()
...
...
...
    try {
      console.log('dynamodb go')
      attributes = await dynamodb.scan(queryParams).promise()
      console.log('dynamodb success')
      console.log(attributes)
    } catch (err) {
      console.log('dynamodb error')
    }

Я ожидаю, что в консоли появится «Dynamodb go», затем «Dynamodb success» или даже «Dynamodb error». Однако после вывода команды "Dynamodb go" функция зависает и завершается тайм-аут. Я почему-то неправильно выполняю обещание? Судя по тому, что я видел, это должен быть правильный формат.


comment
Вы пробовали что-то более простое и быстрое, например describeTable (), чтобы убедиться, что у вас действительно есть подключение к DynamoDB?   -  person jarmod    schedule 16.01.2019
comment
@jarmod Я описываюTable (), и это, похоже, тоже истекло. Для описанияTable () я просто использовал базовый объект AWS.DynamoDB вместо клиента документа, это правильно, верно?   -  person danielhep    schedule 16.01.2019
comment
Я отредактировал свой пост, создав свой объект documentclient. Есть ли какая-то конфигурация, которую мне нужно сделать, чтобы это работало? Функция Lambda вызывается из аутентифицированного запроса от веб-клиента с идентификатором когнитивного типа.   -  person danielhep    schedule 16.01.2019
comment
ваша Lambda работает в VPC?   -  person A.Khan    schedule 16.01.2019
comment
Любой такой тайм-аут подключения обычно связан с тем, что ваша лямбда-функция не может достичь сетевого ресурса, к которому она пытается подключиться, в данном случае DynamoDB. Обычно это происходит по одной причине - вы используете функцию Lambda в частной подсети VPC, и эта подсеть не имеет жизнеспособного маршрута к Интернету или DynamoDB через конечную точку VPC. Может ли это быть тем, что здесь происходит?   -  person jarmod    schedule 16.01.2019
comment
@jarmod Это почти наверняка так. Мне было трудно заставить функцию подключиться к экземпляру RDS, и я не совсем уверен, что именно я сделал. Я действительно не понимаю, как работают VPC, и я не уверен, как добавить экземпляр DynamoDB в VPC. Можете ли вы порекомендовать какой-либо ресурс по этому поводу?   -  person danielhep    schedule 16.01.2019


Ответы (1)


Похоже, ваша функция Lambda не может подключиться к DynamoDB. Обычно это вызвано одной причиной - вы запускаете функцию Lambda в VPC, а функция Lambda не имеет жизнеспособного маршрута к DynamoDB (либо через общедоступный Интернет, либо к DynamoDB через частную конечную точку VPC).

Предположительно, вы запускаете свою лямбда-функцию внутри VPC, чтобы он мог получить доступ к вашей частной базе данных RDS, которая в противном случае была бы недоступна через общедоступный Интернет.

У вас есть несколько вариантов:

  1. предоставьте лямбда-функции доступ в Интернет, чтобы она может подключиться к DynamoDB через общедоступный Интернет
  2. добавьте конечную точку VPC для DynamoDB в VPC, чтобы он мог подключиться к DynamoDB в частном порядке

Обратите внимание, что оба работают по TLS, поэтому они безопасны. Решение состоит в том, разрешить ли функции Lambda неограниченный исходящий доступ в Интернет (№1) или ограничить ее DynamoDB (№2).

person jarmod    schedule 16.01.2019
comment
Я скоро попробую и вернусь к вам. Спасибо! - person danielhep; 18.01.2019
comment
Неужели мне действительно нужно создать целый экземпляр EC2 только для того, чтобы эти две службы могли взаимодействовать друг с другом? Я немного разочарован тем, как бессерверные вычисления должны были помочь мне, позаботившись обо всех этих задачах за меня, но затем это создает все эти новые проблемы, которые для меня в новинку. - person danielhep; 25.01.2019
comment
Обновление: решил просто избавиться от VPC и вместо этого постараюсь сделать экземпляр RDS общедоступным. Просто все упрощает. - person danielhep; 25.01.2019
comment
@danielhep Предоставление РСУБД общедоступному Интернету редко бывает хорошей идеей. Вы должны иметь возможность предоставить Lambda доступ как к своему частному экземпляру RDS, так и к службе DynamoDB без необходимости использования шлюза NAT или общедоступного доступа в Интернет. Вы пробовали это с конечной точкой VPC для DynamoDB? - person jarmod; 25.01.2019