AWS SDK v3 无法从配置文件中获取区域

AWS SDK v3 can't get region from profile

我正在使用来自共享 ini 文件中配置文件的凭据初始化 s3 客户端。我想使用相同的设置默认区域。

~\.aws\credentials

[myprofile]
aws_access_key_id = ...
aws_secret_access_key = ...

~\.aws\config

[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 文档指出

Profiles that appear in both files will not be merged, and the version that appears in the credentials file will be given precedence over the profile found in the config file.

除了与通常的 configuration standards 明显不同之外,将 regionconfig 移动到 credentials 会产生相同的错误。

~\.aws\credentials

[myprofile]
aws_access_key_id = ...
aws_secret_access_key = ...
region = eu-west-1

S3 Constructor 在配置对象级别使用区域 属性 作为 credentials,因此您应该使用类似:

const s3Client = new S3({
   credentials: fromIni({
        profile: 'myprofile',
   }),
   region: 'eu-west-1'
});

fromIni 文档没有谈到区域,我想它不是这个意思。

关于加载配置文件,我认为你正在寻找环境变量AWS_SHARED_CREDENTIALS_FILEsee here(虽然没有测试)。 但是,正如@CherryDT评论的那样,您可能希望明确声明它,它可能会根据情况而变化。

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/configcredentialsFile 加载 ~/.aws/credentials.