AWS Credentials未传递 给 包含查询DynamoDB Node.js脚本的 ECS task

0

【以下的问题经过翻译处理】 有一个奇怪的问题。我有一个 ECS 任务附加了名为 MyRole 的 RoleName。此 ECS 任务有一个查询 dynamodb 表的 nodejs 脚本。

脚本内容如下:

const AWS = require('aws-sdk');

async function GetCredentials(){ var docClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-2'});

var identifier = "test-asassa";

var params3 = { TableName: 'MyTable', ExpressionAttributeNames: { '#var1': 'var1' }, KeyConditionExpression: '#var1 = :var1', ExpressionAttributeValues: { ':var1': 'ValueToBeQueried' } }

await docClient.query(params3,( () => { })).promise().then(async (data1) => { console.log(data1); }); };

GetCredentials().then(data => { console.log(data); });

仅在 docker 容器中运行时,此代码不会从 Role 中获取 AWS Credentials,并会出错并提示“ValidationException”。同时,如果我将AWS Credentials导出为 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN,脚本就可以工作。

有人可以帮助我了解这里发生的事情吗?我如何确保代码是否使用了附加到 ECS 任务的角色?

信任关系和所有其他杂项都是正确的。查询也是正确的。要重现这一点,您可以创建一个名为“MyTable”的表,主键为“var1”。使用与上面共享的代码相同的代码,并在同一终端中导出 AWS Credentials。该代码将起作用。现在,在任何 ecs 任务中,将 iam 角色附加到具有足够权限的任务,它不会工作,并且会错误地显示“ValidationException:One or more parameter values were invalid: Condition parameter type does not match schema type”,这完全是误导的报错信息。

profile picture
专家
已提问 5 个月前22 查看次数
1 回答
0

【以下的回答经过翻译处理】 这段代码本身有问题.

如果您使用instance profile在 EC2 中的 nodejs v16.13.2 中按原样运行,则会出现完全相同的错误。

您的代码的问题在于同时使用了Callback function和Promise。

您不应同时使用Callback function和Promise,因为函数签名不匹配。

请清理你的代码,删除不必要的等待,异步,最重要的是删除你的回调闭包,我建议你添加错误处理逻辑,否则它可能会导致你的应用程序崩溃。

docClient.query(params3).promise().then((data1) => {
	console.log(data1);
}, (err) => {
    console.error((err));
});

您可以参考如何在 AWS SDK 此处 中正确使用 promise。

最后,我建议您花时间阅读有关 Promise 的内容。因为即使您解决了我指出的问题,您的代码仍然无法运行,因为您对 GetCredentials() 进行了 API 调用,您似乎希望返回一个Promise,但您没有这样做。

如果您希望调用 GetCredentials().then(),您应该在 GetCredentials 函数中执行此操作,而不是之前的代码块 -

return docClient.query(params3).promise();

供您参考,您的代码应如下所示(我没有修复您的命名,您也应该这样做)

const AWS = require('aws-sdk');

var docClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});

async function GetCredentials(){

//var identifier = "test-asassa";

var params3 = {
  TableName: 'MyTable',
  ExpressionAttributeNames: { '#var1': 'var1' },
  KeyConditionExpression: '#var1 = :var1',
  ExpressionAttributeValues: {
    ':var1': 'test'
  }
}

return docClient.query(params3).promise();

};

GetCredentials().then( (data) => {
    console.log(data);
}, (err) => {
    console.error(err);
});

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则