簡體   English   中英

為什么需要使用JavaScript SDK對憑證進行硬編碼才能連接到AWS?

[英]Why do I need to hardcode credentials to connect to AWS using the javascript SDK?

我在這里問了另一個問題 ,這使我相信,默認情況下,JavaScript AWS開發工具包無需執行任何操作即可在您環境中的許多位置查找憑據。 此處列出了它檢查的位置的順序: 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,它將從我的共享憑據文件中獲取憑據。 而如果您不在本地模式下,它將所有憑據設置為undefined,而是依靠IAM角色。 文檔不是說我不必這樣做嗎?

但是,如果我將代碼更改為此,則對雅典娜的任何調用都會掛起,直到超時:

export const getAthena = (): AWS.Athena => {
    return new AWS.Athena();
};

如果我將超時設置為一個非常大的數字,它最終會讓我知道我的憑據無效。

根據文檔,第二個示例不是應該像第一個一樣找到憑證嗎? 為什么第二個示例掛起? 我不想寫上面的代碼。 如何使代碼像示例一樣工作?

  1. 在第二個示例中,我是否以錯誤的方式創建了AWS.Athena()
  2. 如何解決此問題以弄清楚其為何掛起?
  3. 根據文檔,底部示例是否應該與頂部示例做相同的事情?

因此,經過調查后,看來這(即第二個片段的失敗)是因為您的.aws/credentials文件中沒有[default]配置文件。 這是一個特殊的配置文件。 我假設客戶端找不到時使用空字符串(或null或其他內容)。 老實說我覺得很有趣(應該拋出一個例外)。

無論如何,要解決此問題,可以將配置文件重命名為[default]或在代碼中設置其他配置文件。 以下是相關文檔:

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

我建議使用AWS_PROFILE環境變量。 將使您的代碼更具可移植性。

如果您使用的是IAM角色,則無需顯式提供任何憑據(為null或其他方式):

const AWS = require('aws-sdk');
const athena = new AWS.Athena();
const params = { ... };
const rc = await athena.startQueryExecution(params).promise();

實際上,這可以與通過本地環境變量提供的憑據一起使用,也可以在憑據/配置文件中使用。 SDK將嘗試一連串的憑據提供程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM