Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要硬编码凭据才能使用javascript SDK连接到AWS?_Javascript_Amazon Web Services_Aws Sdk_Amazon Athena - Fatal编程技术网

为什么我需要硬编码凭据才能使用javascript SDK连接到AWS?

为什么我需要硬编码凭据才能使用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

我在这里提出的问题让我相信,默认情况下,JavaScript AWS SDK会在您的环境中的许多地方查找凭据,而无需您做任何事情。检查地点的顺序如下所示:

我有一些连接到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角色文档不是说我不必这样做吗?

但是,如果我将代码更改为此,对雅典娜的任何调用都会挂起,直到超时:

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