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
EXPERTE
gefragt vor 5 Monaten26 Aufrufe
1 Antwort
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
EXPERTE
beantwortet vor 5 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen