AWS SDK v3 代入客户角色

AWS SDK v3 Assume role for a client

我正在使用 AWS JS SDK v3 编写一个 Node JS 应用程序。我正确地使用 STS 承担角色并检索凭据。假设呼叫响应是这样的:

{
    "$metadata": {
        "httpStatusCode": 200,
        "requestId": "xxx",
        "attempts": 1,
        "totalRetryDelay": 0
    },
    "Credentials": {
        "AccessKeyId": "xxx",
        "SecretAccessKey": "xxx",
        "SessionToken": "xxx",
        "Expiration": "2021-02-26T15:40:17.000Z"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "xxx",
        "Arn": "arn:aws:sts::xxx"
    }
}

我正在获取凭据并将它们传递给 DynamoDBClient 构造函数(连同区域)。

import { DynamoDBClient, ListTablesCommand } from '@aws-sdk/client-dynamodb';

public getTablesList(region: string) {
  const credentials = await getCredentialsFromSTS(region);
  const clientParams = Object.assign(credentials, region); // This just merges two JSONs into one
  const dbClient = new DynamoDBClient(clientParams);
  const command = new ListTablesCommand({});
  const response = await dbClient.send(command);
  console.log(response);
}

我在响应中得到的是一个仅包含运行我的代码的帐户表的列表。我担任该角色的帐户中的表不存在。也许我错误地担任了这个角色?我尝试将凭据打包到“凭据”密钥中,但这也无济于事。

const clientParams = Object.assign({ Credentials: credentials }, region);

知道我做错了什么吗?也许 DDBClient 没有像它应该的那样假设它,但是有没有办法检查 DBClient 的假设角色?我在 documentation 中找到了一个名为 RoleInfo 的命名空间,但我不知道如何调用它。

请阅读DynamoDBClient参数对象的文档:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#constructor-property

凭证字段是小写的,而在 STS 结果中它们是大写的。

您的代码中还有更多错误,例如 Object.assign(credentials, region); 调用。 region 这里是一个 string,所以通过将它分配给 credentials 你不会得到一个 属性 名为“region”的 region 变量的值,但是你会得到数字属性,每个属性都有 region 字符串的一个字符。

正确的初始化应该是:

const credentials = await getCredentialsFromSTS(region);
const dbClient = new DynamoDBClient({
  region: region,
  credentials: {
    accessKeyId: credentials.AccessKeyId,
    secretAccessKey: credentials.SecretAccessKey,
    sessionToken: credentials.SessionToken,
  }
});