Сканирование Amazon DynamoDB делает два HTTP-запроса к серверу, вызывая ошибку, почему? - PullRequest
1 голос
/ 29 апреля 2020

У меня есть машинопись реагирующего приложения, которая использует сервисы DynamoDB для хранения данных. У меня есть javascript промежуточное ПО, которое управляет операциями доступа к БД. Я разработал локально операции scan и put и delete без ошибок. После настройки производственной среды возникает ошибка. Если я выполняю код локально в производственной среде, у меня возникает та же ошибка.

Я заметил, что операция scan завершается неудачно. На самом деле это происходит странным образом, потому что я видел, что запрос к aws серверу выполняется дважды.

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

Я заметил, что

  • операция извлечения onClick действительно вызывается один раз (как и ожидалось)
  • операция сканирования DynamoDB действительно вызывается один раз (как и ожидалось)
  • обратный вызов scann выполняется дважды (не так, как ожидалось)
    • при первом получении данных, и я могу их записать (идеально)
    • второй вызов выполняется с ошибкой

aws код конфигурации

const awsConfig = {
  accessKeyId: process.env.REACT_APP_AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.REACT_APP_AWS_SECRET_ACCESS_KEY,
  region: process.env.REACT_APP_AWS_REGION,
  endpoint: process.env.REACT_APP_AWS_ENDPOINT
}

new AWS.Endpoint(awsConfig.endpoint || '')

AWS.config.update({
  region: awsConfig.region,
  //endpoint: awsConfig.endpoint || '',
  credentials: new AWS.Credentials(awsConfig.accessKeyId || '', awsConfig.secretAccessKey || ''),
  sslEnabled: false,
  maxRetries: 5
})

const dynamoDbClient = new AWS.DynamoDB.DocumentClient()

примечание к этой части кода, Typescript выдает мне ошибку, если я оставляю конечную точку в AWS .config.update , поэтому я устанавливаю ее по-другому new AWS .Endpoint (awsConfig.endpoint || ' ')

Argument of type '{ region: string | undefined; endpoint: string; credentials: Credentials; sslEnabled: false; maxRetries: number; }' is not assignable to parameter of type 'ConfigurationOptions & ConfigurationServicePlaceholders & APIVersions'.
  Object literal may only specify known properties, and 'endpoint' does not exist in type 'ConfigurationOptions & ConfigurationServicePlaceholders & APIVersions'.ts(2345)

aws код доступа

const searchParams = { TableName: 'table' }

let dataItems: DateFields[] = []

await dynamoDbClient
  .scan(searchParams, (error: any, data: any) => {
    if (error) {
      console.error(`Error fetchCategories: `, JSON.stringify(error, null, 2))
      return
    }
    dataItems = data.Items
  })
  .promise()

со следующей ошибкой

Error fetchCategories:  {
  "message": "The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.",
  "code": "InvalidSignatureException",
  "time": "2020-04-29T08:39:14.449Z",
  "requestId": "xxxxxxxxxxxxxxxxxxx",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 15.082420221534553
}

{"__type":"com.amazon.coral.service#InvalidSignatureException","message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details."}

Есть идеи, почему это происходит? Большое спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Проблема заключается в aws коде доступа и для его исправления я обновил клиент DynamoDB следующим образом:

  try {
    const data = await dynamoDbClient.scan(params).promise()
    return data.Items
  } catch(error) {
    logError(operation, error)
  }

Это изменение в коде предотвращает:

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