我问过this other question这让我相信,默认情况下,JavaScript AWS SDK 会在您环境中的多个位置查找凭证,而您无需执行任何操作。这里列出了它检查的位置的顺序:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-node.html
我有一些连接到 AWS Athena 的工作代码。只有手动对凭据进行硬编码才能使其正常工作,这似乎与上面的文档相矛盾。这是我的代码:
export const getAthena = (): AWS.Athena => {
if (process.env["LOCAL_MODE"] === "true") {
const awsCredentials = {
region: "us-east-1",
accessKeyId: awsCredentialsParser("aws_access_key_id"),
secretAccessKey: awsCredentialsParser("aws_secret_access_key"),
sessionKey: awsCredentialsParser("aws_session_token")
};
AWS.config.update(awsCredentials);
let credential = new AWS.Credentials({
accessKeyId: awsCredentials.accessKeyId,
secretAccessKey: awsCredentials.secretAccessKey,
sessionToken: awsCredentials.sessionKey
});
return new AWS.Athena({credentials: credential, signatureCache: false});
} else {
const awsCredentials1 = {
region: "us-east-1",
accessKeyId: undefined,
secretAccessKey: undefined,
sessionKey: undefined
};
AWS.config.update(awsCredentials1);
return new AWS.Athena({credentials: undefined, signatureCache: false});
}
};
export const awsCredentialsParser = (key: string): string => {
const homeDirectory = os.homedir();
const awsCredentials = fs.readFileSync(homeDirectory + "/.aws/credentials", {encoding: "UTF8"});
const awsCredentialLines = awsCredentials.split("\n");
const lineThatStartsWithKey = awsCredentialLines.filter((line) => line.startsWith(key))[0];
return lineThatStartsWithKey.split(" = ")[1];
};
如您所见,我正在使用一个名为“LOCAL_MODE”的环境变量。如果将此设置为 true,它将从我的共享凭证文件中获取凭证。然而,如果您未处于本地模式,它会将所有凭证设置为未定义,并改为依赖 IAM Angular 色。 文档不是说我不必这样做吗?
但是,如果我将代码更改为这样,对 athena 的任何调用都会挂起,直到超时:
export const getAthena = (): AWS.Athena => {
return new AWS.Athena();
};
如果我将超时设置为一个非常大的数字,它最终会让我知道我的凭据无效。
根据文档,第二个示例不应该像第一个示例那样查找凭据吗?为什么第二个示例挂起?我不想写上面的代码。如何让我的代码像示例一样工作?
- 我在第二个示例中是否以错误的方式创建了
AWS.Athena()
? - 如何排查此问题以找出挂起的原因?
- 根据文档,底部示例不应该做与顶部相同的事情吗?
最佳答案
因此,经过调查后,这(即第二个片段的失败)似乎是因为您没有 [default]
您的个人资料 .aws/credentials
文件。这是一个特殊的配置文件。我假设客户端在找不到它时使用空字符串(或空值或其他东西)。说实话,我觉得这很有趣(应该抛出异常)。
无论如何,要解决这个问题,您必须将配置文件重命名为 [default]
或者在您的代码中设置不同的配置文件。这是相关文档:
我建议使用AWS_PROFILE
环境变量。将使您的代码更加可移植。
关于javascript - 为什么我需要对凭证进行硬编码才能使用 javascript SDK 连接到 AWS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57278192/