我正在用来自共享ini文件中的配置文件的凭据初始化s3客户机。我想设置默认区域使用相同的。
~.awscredentials
[myprofile]
aws_access_key_id = ...
aws_secret_access_key = ...
~.awsconfig
[profile myprofile]
region = eu-west-1
我的代码import {S3} from '@aws-sdk/client-s3';
import {fromIni} from '@aws-sdk/credential-providers';
const s3Client = new S3({
credentials: fromIni({
profile: 'myprofile',
}),
});
await s3Client.listBuckets({});
我得到的错误是Error: Region is missing
,调用fromIni
的输出是
{
accessKeyId: '...',
secretAccessKey: '...',
sessionToken: undefined
}
为什么区域不从共享配置文件中加载?
更新
fromIni
docs注意到
出现在两个文件中的配置文件将不会被合并,并且出现在凭据文件中的版本将优先于配置文件中的配置文件。
除了明显违反通常的配置标准外,将region
从config
移动到credentials
也会产生相同的错误。
~.awscredentials
[myprofile]
aws_access_key_id = ...
aws_secret_access_key = ...
region = eu-west-1
loadSharedConfigFiles
助手可以从本地配置文件中读取配置文件的默认区域,然后您可以将其传递给客户端构造函数:
import { fromIni } from '@aws-sdk/credential-providers';
import { loadSharedConfigFiles } from '@aws-sdk/shared-ini-file-loader';
const profile = 'myprofile';
const s3Client = new S3Client({
credentials: fromIni({ profile }),
region: (await loadSharedConfigFiles()).configFile?.[profile]?.region,
});
configFile
属性加载~/aws/config
,credentialsFile
加载~/.aws/credentials
。
S3构造函数在配置对象的级别上使用区域属性作为credentials
,因此您应该使用如下内容:
const s3Client = new S3({
credentials: fromIni({
profile: 'myprofile',
}),
region: 'eu-west-1'
});
fromIni文档没有提到区域,我猜它不是用来做这个的
关于加载配置文件,我认为你正在寻找环境变量AWS_SHARED_CREDENTIALS_FILE
,见这里(虽然没有测试它)。但是,正如@CherryDT所评论的那样,您可能希望显式声明它,它可能会根据情况而更改。