【问题标题】:Amazon S3 does not return a response or throw error when running on EC2 instanceAmazon S3 在 EC2 实例上运行时不返回响应或抛出错误
【发布时间】:2020-03-21 07:42:51
【问题描述】:

我正在尝试使用访问密钥和密钥凭据连接到 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/*"
            ]
        }
    ]
}

【问题讨论】:

  • 确保实例可以访问互联网,并且您的凭据配置相同
  • 如果执行停止,这听起来像是一个被捕获并忽略的异常。
  • 为什么不将 IAM 角色附加到 EC2 实例:docs.aws.amazon.com/AWSEC2/latest/UserGuide/… 并在存储桶策略中允许该角色?
  • @AndrewA。我没有专门尝试过,但我确实尝试将 EC2 IAM 角色分配给 Bucket 策略。让我再试一次。
  • 您是否在私有子网中运行?

标签: java amazon-web-services amazon-s3 amazon-ec2 aws-java-sdk


【解决方案1】:

感谢您的回复。我的代码有多个问题(这不是 Amazon S3 的问题)

  1. 这是臭名昭著的错误java.lang.NoSuchFieldError: SIGNING_REGION,但仅发生在 EC2 上。它没有在代码周围的 try-catch 块中捕获,而是在 HTTP 响应中。
  2. 我的项目在 Spring Boot 上,它错误地导入了不同版本的 aws-sdk 模块
  3. 我有另一个 POM 条目 hadoop-aws,它有自己的 aws-sdk 版本

修复:

  1. 添加了单独的 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>
    
  2. 为 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>
    

【讨论】:

    【解决方案2】:

    您提到您的项目是一个 Spring BOOT 项目。

    我们正在编写一个文档,该文档将向您展示如何编写调用 AWS 服务的 Spring BOOT 应用程序(在文档中,以 DynamoDB 为例)并将其部署到 AWS Elastic Beanstalk。

    当你这样做时,你需要做一些事情才能使 Spring BOOT 应用程序正常工作,例如:

    1. 通过添加一个名为 SERVER_PORT 的新环境变量来设置 Spring Boot 侦听的端口,其值为 5000。

    2. 添加一个名为 AWS_ACCESS_KEY_ID 的新变量并指定您的访问权限 核心价值。

    3. 添加一个名为 AWS_SECRET_ACCESS_KEY 的新变量并指定您的密钥值。

    要创建 AWS 服务客户端,请使用 EnvironmentVariableCredentialsProvider - 像这样使用环境变量。

    Region region = Region.US_EAST_1; DynamoDbClient ddb =
    
     DynamoDbClient.builder()
                 .region(region)
                 .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                 .build();
    

    文件完成后,我会在这里发布。

    希望对你有帮助……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2012-02-12
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2012-08-01
      相关资源
      最近更新 更多