javascript - 为什么我需要对凭证进行硬编码才能使用 javascript SDK 连接到 AWS?

标签 javascript amazon-web-services aws-sdk amazon-athena

我问过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();
};

如果我将超时设置为一个非常大的数字,它最终会让我知道我的凭据无效。

根据文档,第二个示例不应该像第一个示例那样查找凭据吗?为什么第二个示例挂起?我不想写上面的代码。如何让我的代码像示例一样工作?

  1. 我在第二个示例中是否以错误的方式创建了 AWS.Athena()
  2. 如何排查此问题以找出挂起的原因?
  3. 根据文档,底部示例不应该做与顶部相同的事情吗?

最佳答案

因此,经过调查后,这(即第二个片段的失败)似乎是因为您没有 [default]您的个人资料 .aws/credentials文件。这是一个特殊的配置文件。我假设客户端在找不到它时使用空字符串(或空值或其他东西)。说实话,我觉得这很有趣(应该抛出异常)。

无论如何,要解决这个问题,您必须将配置文件重命名为 [default]或者在您的代码中设置不同的配置文件。这是相关文档:

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html

我建议使用AWS_PROFILE环境变量。将使您的代码更加可移植。

关于javascript - 为什么我需要对凭证进行硬编码才能使用 javascript SDK 连接到 AWS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57278192/

相关文章:

node.js - 如何使用适用于 JavaScript 的 AWS 开发工具包动态创建内联 Lambda?

java - 了解 AWS 开发工具包 Java 2.x(异步与同步)HTTP 客户端

javascript - 将 datepicker() 放在动态创建的元素上 - JQuery/JQueryUI

javascript - 我如何确定在您所在的州选中了哪个复选框?

java - 如何在基于tomcat服务器和mysql数据库的AWS上部署java spring restful服务?

java - 如何使用ListVersionsRequest、JAVA从S3获取确切文件的信息?

c# - 签名不匹配错误 - 使用 AWS 签名版本 4

java - 尝试使用匿名凭证从 AWS S3 中列出对象,但它仍在检查 ~/.aws/credentials

java - Webdriver 确实存在时没有这样的元素,我已经等待了足够长的时间

javascript - 我怎样才能 wrap() 一个容器中的所有元素而不是每个元素?