为什么我需要硬编码凭据才能使用javascript SDK连接到AWS?
我在这里提出的问题让我相信,默认情况下,JavaScript AWS SDK会在您的环境中的许多地方查找凭据,而无需您做任何事情。检查地点的顺序如下所示: 我有一些连接到AWS Athena的工作代码。只有手动硬编码凭证,我才能让它工作,这似乎与上面的文档相矛盾。这是我的密码:为什么我需要硬编码凭据才能使用javascript SDK连接到AWS?,javascript,amazon-web-services,aws-sdk,amazon-athena,Javascript,Amazon Web Services,Aws Sdk,Amazon Athena,我在这里提出的问题让我相信,默认情况下,JavaScript AWS SDK会在您的环境中的许多地方查找凭据,而无需您做任何事情。检查地点的顺序如下所示: 我有一些连接到AWS Athena的工作代码。只有手动硬编码凭证,我才能让它工作,这似乎与上面的文档相矛盾。这是我的密码: export const getAthena = (): AWS.Athena => { if (process.env["LOCAL_MODE"] === "true") { const
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角色文档不是说我不必这样做吗?
但是,如果我将代码更改为此,对雅典娜的任何调用都会挂起,直到超时:
export const getAthena = (): AWS.Athena => {
return new AWS.Athena();
};
如果我将超时设置为一个非常大的数字,它最终会让我知道我有无效的凭据
根据文档,第二个示例不应该像第一个示例一样查找凭据吗?为什么第二个例子挂起?我不想写上面的代码。如何让代码像示例一样工作?
AWS.Athena()
如果您使用的是IAM角色,则不需要显式提供任何凭据(null或其他):
const AWS = require('aws-sdk');
const athena = new AWS.Athena();
const params = { ... };
const rc = await athena.startQueryExecution(params).promise();
事实上,这也适用于通过本地环境变量提供的凭据或凭据/配置文件中提供的凭据。SDK将一个接一个地进行尝试。因此,经过调查,这(即第二个代码段的失败)似乎是因为您的
.aws/credentials
文件中没有[默认值]
配置文件。这是一个特殊的配置文件。我假设客户机在找不到空字符串时使用空字符串(或null或其他内容)。老实说,我觉得这很有趣(应该有例外)
无论如何,要修复此问题,请重命名配置文件,您必须[默认]
,或者在代码中设置不同的配置文件。以下是相关文件:
我建议使用
AWS\u PROFILE
环境变量。将使您的代码更具可移植性。如果您有相互竞争的凭据来源,则这两个代码段的作用不同。根据文档,从各种来源检索凭据:IAM、凭据
文件、env变量等。文档没有说明任何优先级,但它必须以某种方式(决定性地)决定使用哪个。因此,您的连接挂起是因为它使用了优先级更高的凭据,而这些凭据恰好是无效的,对吗?我猜这是因为地区的变化。@据我所知,这很奇怪,我不知道。在本地,我想我只有一个凭证文件。再说一次,总的来说,我对IAM了解不多。如果我的本地计算机在VPN上,是否可以有IAM角色?我认为IAM角色只适用于AWS服务器/服务。是的,如果您没有明确设置,我认为IAM不重要。虽然我也不是专家。无论如何,我认为这个问题与地区设置有关。因为你无法连接。如果凭据无效,则会相对较快地出现错误。在创建新的AWS.Athena
实例之前,您是否尝试过调用new AWS.Athena({region:“us-east-1”})
或仅更新region?@奇怪是的,它以同样的方式超时。奇怪。您的凭据配置中是否有多个配置文件?如果是默认的,那么第一个是什么?我不是在本地使用IAM角色(至少不是有意的)。我仅在部署代码时使用IAM角色。我的示例已经展示了您在这里所说的内容(您还有两行代码)。您不需要比我所展示的更多的代码。如果在本地运行awscli:aws s3 ls
和aws athena列表命名查询
,会发生什么情况?是否超时?请检查OP上的注释。问题是我的凭据文件只有一个配置文件,但它没有命名为[默认]
。你知道我怎么说我想使用名为[aws14]
的配置文件而不是[default]
?在Mac或Linux上:AWS\u profile=aws14 node app.js