使用无区域ProfileCredentialsProvider创建S3Client报错,求解决
问题
使用未配置区域的ProfileCredentialsProvider创建AWS S3Client时抛出异常。我的凭证文件里没有区域名称,但已经在代码中通过endpointOverride指定了端点(地址是https://s3.ap-south-1.amazonaws.com),而且无法在凭证文件中硬编码区域。请问能不能不指定区域就创建S3Client?
代码示例
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.builder() .profileFile(profile) .profileName(credentialsProfile) .build(); return S3Client.builder() .endpointOverride(endpoint) //endpoint is https://s3.ap-south-1.amazonaws.com .credentialsProvider(credentialsProvider) .build();
报错信息
连接S3失败:无法从区域提供链中的任何一个提供器加载区域 software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain@62ea3440: [software.amazon.awssdk.regions.providers.SystemSettingsRegionProvider@4212a0c8: 无法从系统设置加载区域。必须通过环境变量(AWS_REGION)或系统属性(aws.region)指定区域。, software.amazon.awssdk.regions.providers.AwsProfileRegionProvider@c1bd0be: 配置文件default中未提供区域, software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider@4bef0fe3: 无法连接EC2元数据服务。]
解决方案
不行,AWS SDK for Java v2要求创建S3Client时必须指定区域——哪怕你已经覆盖了端点,SDK的签名逻辑还是依赖区域参数,所以绕不开这一步。不过你可以用以下两种方式解决,不用硬编码到凭证文件:
从端点URL中解析区域
你的端点地址里已经包含了区域信息(ap-south-1),可以直接从URL提取后设置:// 从endpoint提取区域ID String regionId = endpoint.getHost().split("\\.")[1]; Region region = Region.of(regionId); ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.builder() .profileFile(profile) .profileName(credentialsProfile) .build(); return S3Client.builder() .endpointOverride(endpoint) .credentialsProvider(credentialsProvider) .region(region) .build();直接在代码中指定区域
既然不能写到凭证文件,直接在代码里指定对应区域就行:ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.builder() .profileFile(profile) .profileName(credentialsProfile) .build(); return S3Client.builder() .endpointOverride(endpoint) .credentialsProvider(credentialsProvider) .region(Region.AP_SOUTH_1) .build();
内容的提问来源于stack exchange,提问作者akshay
相关产品推荐
相关产品推荐

