在 EC2 实例上 运行 时,Amazon S3 不会 return 响应或抛出错误
Amazon S3 does not return a response or throw error when running on EC2 instance
我正在尝试使用访问密钥和秘密密钥凭据连接到 S3 存储桶。
这在我的本地机器上正常工作。但是,当我尝试在 EC2 实例上 运行 它时,执行似乎停在 result = s3Client.listObjectsV2(request);
行。没有例外。根本没有回应。如果有任何帮助,我将不胜感激。
Java代码
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accesskey, secretkey)))
.withRegion(region).build();
ListObjectsV2Result result = null;
List<S3ObjectSummary> objects = null;
String continuationToken = null;
System.out.println("Starting loop to request information");
int count = 1;
do {
ListObjectsV2Request request = new ListObjectsV2Request();
request.setBucketName(bucket);
request.setContinuationToken(continuationToken);
System.out.println("Placing request information #" + count);
result = s3Client.listObjectsV2(request);
System.out.println("Got response for request #" + count++);
continuationToken = result.getNextContinuationToken();
objects = result.getObjectSummaries();
for (S3ObjectSummary os : objects) {
System.out.println(os.getKey());
}
} while (continuationToken != null);
pom.xml
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.466</version>
</dependency>
S3 存储桶策略
{
"Version": "2012-10-17",
"Id": "Policy1563965234895",
"Statement": [
{
"Sid": "Stmt1563965231235",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxx:user/xyz_dev",
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::xxxx-yyy-bucket",
"arn:aws:s3:::xxxx-yyy-bucket/*"
]
}
]
}
感谢您的回复。我的代码有多个问题(这不是 Amazon S3 的问题)
- 这是臭名昭著的错误
java.lang.NoSuchFieldError: SIGNING_REGION
但只发生在 EC2 上。它没有在代码周围的 try-catch 块中捕获,而是在 HTTP 响应中。
- 我的项目在 Spring 启动它错误地导入了不同版本的 aws-sdk 模块
- 我有另一个 POM 条目
hadoop-aws
,它有自己的 aws-sdk 版本
修复:
添加了单独的 aws-sdk 模块条目而不是完整的 aws-java-sdk
com.amazonaws
aws-java-sdk-cognitoidp
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-core -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cognitoidentity -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cognitoidentity</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cognitoidp -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cognitoidp</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-kms -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-kms</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
向 hadoop-aws 添加了排除项
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-aws</artifactId>
<version>3.1.1</version>
<exclusions>
<exclusion>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-bundle</artifactId>
</exclusion>
</exclusions>
</dependency>
您提到您的项目是 Spring BOOT 项目。
我们正在编写一份文档,该文档将向您展示如何编写一个 Spring 启动应用程序来调用 AWS 服务(在文档中,使用 DynamoDB 作为示例)并将其部署到 AWS Elastic Beanstalk。
执行此操作时,您需要做一些事情才能使 Spring BOOT 应用正常工作,例如:
通过添加名为SERVER_PORT 的新环境变量来设置Spring Boot 侦听的端口,其值为 5000。
添加一个名为 AWS_ACCESS_KEY_ID 的新变量并指定您的访问权限
核心价值。
添加一个名为 AWS_SECRET_ACCESS_KEY 的新变量并指定您的密钥值。
要创建 AWS 服务客户端,请使用 EnvironmentVariableCredentialsProvider - 像这样使用环境变量。
Region region = Region.US_EAST_1; DynamoDbClient ddb =
DynamoDbClient.builder()
.region(region)
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.build();
文档完成后,我将post放在这里。
希望这对您有所帮助...
我正在尝试使用访问密钥和秘密密钥凭据连接到 S3 存储桶。
这在我的本地机器上正常工作。但是,当我尝试在 EC2 实例上 运行 它时,执行似乎停在 result = s3Client.listObjectsV2(request);
行。没有例外。根本没有回应。如果有任何帮助,我将不胜感激。
Java代码
AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accesskey, secretkey)))
.withRegion(region).build();
ListObjectsV2Result result = null;
List<S3ObjectSummary> objects = null;
String continuationToken = null;
System.out.println("Starting loop to request information");
int count = 1;
do {
ListObjectsV2Request request = new ListObjectsV2Request();
request.setBucketName(bucket);
request.setContinuationToken(continuationToken);
System.out.println("Placing request information #" + count);
result = s3Client.listObjectsV2(request);
System.out.println("Got response for request #" + count++);
continuationToken = result.getNextContinuationToken();
objects = result.getObjectSummaries();
for (S3ObjectSummary os : objects) {
System.out.println(os.getKey());
}
} while (continuationToken != null);
pom.xml
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.466</version>
</dependency>
S3 存储桶策略
{
"Version": "2012-10-17",
"Id": "Policy1563965234895",
"Statement": [
{
"Sid": "Stmt1563965231235",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxxxxxxxxxxx:user/xyz_dev",
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::xxxx-yyy-bucket",
"arn:aws:s3:::xxxx-yyy-bucket/*"
]
}
]
}
感谢您的回复。我的代码有多个问题(这不是 Amazon S3 的问题)
- 这是臭名昭著的错误
java.lang.NoSuchFieldError: SIGNING_REGION
但只发生在 EC2 上。它没有在代码周围的 try-catch 块中捕获,而是在 HTTP 响应中。 - 我的项目在 Spring 启动它错误地导入了不同版本的 aws-sdk 模块
- 我有另一个 POM 条目
hadoop-aws
,它有自己的 aws-sdk 版本
修复:
添加了单独的 aws-sdk 模块条目而不是完整的 aws-java-sdk com.amazonaws aws-java-sdk-cognitoidp
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-core --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-core</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cognitoidentity --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-cognitoidentity</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cognitoidp --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-cognitoidp</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-kms --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-kms</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> </dependency>
向 hadoop-aws 添加了排除项
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-aws</artifactId> <version>3.1.1</version> <exclusions> <exclusion> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bundle</artifactId> </exclusion> </exclusions> </dependency>
您提到您的项目是 Spring BOOT 项目。
我们正在编写一份文档,该文档将向您展示如何编写一个 Spring 启动应用程序来调用 AWS 服务(在文档中,使用 DynamoDB 作为示例)并将其部署到 AWS Elastic Beanstalk。
执行此操作时,您需要做一些事情才能使 Spring BOOT 应用正常工作,例如:
通过添加名为SERVER_PORT 的新环境变量来设置Spring Boot 侦听的端口,其值为 5000。
添加一个名为 AWS_ACCESS_KEY_ID 的新变量并指定您的访问权限 核心价值。
添加一个名为 AWS_SECRET_ACCESS_KEY 的新变量并指定您的密钥值。
要创建 AWS 服务客户端,请使用 EnvironmentVariableCredentialsProvider - 像这样使用环境变量。
Region region = Region.US_EAST_1; DynamoDbClient ddb =
DynamoDbClient.builder()
.region(region)
.credentialsProvider(EnvironmentVariableCredentialsProvider.create())
.build();
文档完成后,我将post放在这里。
希望这对您有所帮助...