我有一个 Java 应用程序正在尝试使用 S3Client 将文件保存到 S3 存储空间。
经过反复试验后,我能够连接并通过创建 S3Client 并验证我是否取回了预期的存储桶列表来证明这一点。
String accessKeyId = "MyAccessKeyId";
String secretAccesskey = "MySecretAccessKey";
StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKeyId, secretAccesskey));
// Create S3 client
S3Client s3Client = S3Client.builder()
.credentialsProvider(credentialsProvider)
.region(Region.US_EAST_1)
.endpointOverride(URI.create("https://cees3.bhinc.gov:10444"))
.overrideConfiguration(ClientOverrideConfiguration.builder()
.build())
.build();
//I've verified that I'm getting back an expected list of buckets
ListBucketsResponse listBucketsResponse = s3Client.listBuckets();
当我尝试将文件实际放入其中一个存储桶时,却出现以下错误:
software.amazon.awssdk.core.exception.SdkClientException:收到 UnknownHostException
我不明白为什么我会收到那个特定的错误,因为似乎我在尝试列出存储桶时也会收到同样的错误。
这是我尝试上传文件的代码 - 正如您所看到的,这基本上是同一件事,只是我试图将文件上传到其中一个存储桶,而不是列出存储桶。
String accessKeyId = "MyAccessKeyId";
String secretAccesskey = "MySecretAccessKey";
StaticCredentialsProvider credentialsProvider = StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKeyId, secretAccesskey));
// Create S3 client
S3Client s3Client = S3Client.builder()
.credentialsProvider(credentialsProvider)
.region(Region.US_EAST_1)
.endpointOverride(URI.create("https://cees3.bhinc.gov:10444"))
.overrideConfiguration(ClientOverrideConfiguration.builder()
.build())
.build();
String bucketName = "testbucket2";
String testFilePath = "C:\\Users\\charlie\\Downloads\\test.png";
// Upload a file
File file = new File(testFilePath);
try (FileInputStream fileInputStream = new FileInputStream(file)) {
String fileExtension = Files.probeContentType(Paths.get(testFilePath));
PutObjectRequest request = PutObjectRequest.builder()
.bucket(bucketName)
.key(accessKeyId)
.contentType(fileExtension)
.build();
// Get the file content as a byte array
byte[] bytes = fileInputStream.readAllBytes();
s3Client.putObject(request, RequestBody.fromBytes(bytes));
System.out.println("File uploaded successfully: " + "test.png");
} catch (IOException e) {
System.err.println("Error uploading file: " + e.getMessage());
}
但是一旦到达 s3Client.putObject,它就会抛出 UnknownHostException。
有什么想法可以解释为什么我在尝试上传文件时会遇到这种情况,但在仅列出现有存储桶时却不会遇到这种情况?
谢谢
因此,API 网关具有与之关联的策略,该策略将限制您可以通过该代理执行的操作。正如您所指出的,https://cees3.bhinc.gov: 10444 是一个 API 网关,并且您正在通过 https 访问内容,因此我怀疑此端点有一个自定义证书,并且该证书与 cees3.bhinc.gov 绑定。这就是为什么如果您尝试通过普通 S3 访问存储桶,您会得到一个与正在使用的默认 AWS 主机名不匹配的证书,并且它会引发 SunCertPathBuilderException。这就是为什么您必须覆盖用于 API 网关的主机的原因。
我认为附加到网关的策略允许您列出存储桶,但并不允许您以任何方式修改它(putObject、createObject 等)。所以我的建议是,如果您有权访问 AWS 控制台和 S3,请检查网关上的策略。看看它允许什么。如果它不允许 putObject,请添加它并查看异常是否消失。如果您没有访问权限,则需要联系有权访问该策略的人,您可以与他们合作为其设置正确的权限。