Как использовать учетные данные предполагаемой роли в DynamodB (Javascript aws-SDK)?

У меня уже есть aws, предполагается, что учетные данные роли находятся в файле.aws / credetials. Как использовать его для создания STS или DynamodB, как:

const { DynamoDB } = require('aws-sdk');
const { DocumentClient } = DynamoDB;

 const dynamo = new DynamoDB({
 endpoint: process.env.AWS_ENDPOINT,
 region: process.env.AWS_REGION,
 accessKeyId: process.env.AWS_ACCESS_KEY_ID,
 secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
 secretToken: process.env.aws_security_token
 });

Я имею в виду, я получил ошибку как:

root@myubuntu:~/work/contacts_api# node ./seed/runner.js

`` `

Проверка наличия таблицы контактов { UnrecognizedClientException: маркер безопасности, включенный в запрос, недействителен. в Request.extractError (/root/work/contacts_api/node_modules/aws-sdk/lib/protocol/json.js:51:27) в Request.callListeners (/root/work/contacts_api/node_modules/aws-sdk/lib/sequential_executor.js:106:20) в Request.emit (/root/work/contacts_api/node_modules/aws-sdk/lib/sequential_executor.js:78:10) в Request.emit (/root/work/contacts_api/node_modules/aws-sdk/lib/request.js:683:14) в Request.transition (/root/work/contacts_api/node_modules/aws-sdk/lib/request.js:22:10) в AcceptorStateMachine.runTo (/root/work/contacts_api/node_modules/aws-sdk/lib/state_machine.js:14:12) по адресу /root/work/contacts_api/node_modules/aws-sdk/lib/state_machine.js:26:10 по запросу. (/root/work/contacts_api/node_modules/aws-sdk/lib/request.js:38:9) по запросу. (/root/work/contacts_api/node_modules/aws-sdk/lib/request.js:685:12) в Request.callListeners (/root/work/contacts_api/node_modules/aws-sdk/lib/sequential_executor.js:116:18) сообщение: "Маркер безопасности, включенный в запрос, является недействительным.", Код: "UnrecognizedClientException", время: 2019-01-07T05:39:54.907Z, идентификатор запроса: "A5CFV62P0TGHJH7VDIBSL0JRC3VV4KQNSO5AEMVJF66Q9 40000, статус: ложный: код возврата: ложный: retryDelay: 5.013458338738063}

`` `

Я хочу знать правильный путь к начальным учетным данным, если я хочу использовать учетные данные mfa.

2 ответа

Я предполагаю, что ошибка здесь должна дать вам подсказку:

"Маркер безопасности, включенный в запрос, недействителен"

Вы пытались распечатать значение среды

env | grep aws_security_token

Если он пуст, вам придется установить значение до запуска вашего кода.

Кроме того, я заметил, что все остальные ключи aws имеют заглавные буквы, а aws_security_token - строчные.

Я подозреваю secretTokenне вещь. Вот два примера того, как это можно сделать (как я делал это раньше).

Тем не менее, я бы поощрял создание и использование Credentials везде, где это возможно (второй пример), но если вы хотите сделать это встроенным, это тоже должно сработать.

      /** assume a role and build a DocumentClient object to make a single scan **/
;(async () => {
  const sts = new AWS.STS()
  const assumeRole = await sts
    .assumeRole({
      RoleArn: process.env.ROLE_ARN,
      RoleSessionName: process.env.ROLE_SESSION_NAME,
    })
    .promise()

  const dynamodb = new AWS.DynamoDB.DocumentClient({
    region: process.env.REGION,
    credentials: {
      accessKeyId: assumeRole.Credentials?.AccessKeyId,
      secretAccessKey: assumeRole.Credentials?.SecretAccessKey,
      sessionToken: assumeRole.Credentials?.SessionToken,
    },
  })

  const scan = await dynamodb
    .scan({
      TableName: process.env.TABLE_NAME,
    })
    .promise()

  console.log(scan)
})()
      /** 
* assume a role and build a Credentials object and use it 
* to build a DocumentClient object to make a single scan 
**/
;(async () => {
  const sts = new AWS.STS()
  const assumeRole = await sts
    .assumeRole({
      RoleArn: process.env.ROLE_ARN,
      RoleSessionName: process.env.ROLE_SESSION_NAME,
    })
    .promise()

  const credentials = new AWS.Credentials({
    accessKeyId: assumeRole.Credentials?.AccessKeyId,
    secretAccessKey: assumeRole.Credentials?.SecretAccessKey,
    sessionToken: assumeRole.Credentials?.SessionToken,
  })

  const dynamodb = new AWS.DynamoDB.DocumentClient({
    region: process.env.REGION,
    credentials: credentials,
  })

  const scan = await dynamodb
    .scan({
      TableName: process.env.TABLE_NAME,
    })
    .promise()

  console.log(scan)
})()
Другие вопросы по тегам