[英]AWS Iot sdk javascript - Cannot connect to AWS (Failed to read credentials for AWS_PROFILE default from undefined)
[英]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();
};
如果我將超時設置為一個非常大的數字,它最終會讓我知道我的憑據無效。
根據文檔,第二個示例不是應該像第一個一樣找到憑證嗎? 為什么第二個示例掛起? 我不想寫上面的代碼。 如何使代碼像示例一樣工作?
AWS.Athena()
? 因此,經過調查后,看來這(即第二個片段的失敗)是因為您的.aws/credentials
文件中沒有[default]
配置文件。 這是一個特殊的配置文件。 我假設客戶端找不到時使用空字符串(或null或其他內容)。 老實說我覺得很有趣(應該拋出一個例外)。
無論如何,要解決此問題,可以將配置文件重命名為[default]
或在代碼中設置其他配置文件。 以下是相關文檔:
我建議使用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.