【问题标题】:Is using InstanceProfileCredentialsProvider correct way to connect to AWS S3 from Ec2 instance?是否使用 InstanceProfileCredentialsProvider 正确的方式从 Ec2 实例连接到 AWS S3?
【发布时间】:2018-04-10 07:09:46
【问题描述】:

在我的代码正常工作之前,我将存储桶策略设置得太开放。

{
    "Version": "2012-10-17",
    "Id": "Policy15",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bcktName",
                "arn:aws:s3:::bcktName/*"
            ]
        }
    ]
}

我正在使用 Elastic BeanStalk,而后者又使用 AWS Ec2。 Ec2 实例具有 aws-elasticbeanstalk-ec2-role,它提供了对 S3 的 FullAccess(我知道完全访问是危险的)。

我在部署到 Ec2 的 webapp 中使用以下 java 代码。

AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                  .withCredentials(new InstanceProfileCredentialsProvider(false))
                  .build();
              versionId = s3Client.putObject(new PutObjectRequest("bucketName", name, convFile))
                  .getVersionId();

1) 这是在 java 代码中从 Ec2 连接到 S3 的正确方法吗? 2) This 文档让我感到困惑,因为我不确定是否必须设置环境变量和/或 Java 系统属性和/或默认凭证配置文件和/或 Amazon ECS 容器凭证和/或实例配置文件凭证?

请帮助我。我被这个问题困扰了将近一周。

PS: 以下是分配给我的个人资料的 ec2InstanceRole

Role ARN  arn:aws:iam::111111111111:role/aws-elasticbeanstalk-ec2-role
Role description  
Instance Profile ARNs  arn:aws:iam::111111111111:instance-profile/aws-elasticbeanstalk-ec2-role
Path   /
Creation time  2017-10-17 11:27 PDT

分配给上述角色的策略是

  AmazonS3FullAccess
  AWSElasticBeanstalkWebTier
  AWSElasticBeanstalkMulticontainerDocker
  AWSElasticBeanstalkWorkerTier

【问题讨论】:

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


    【解决方案1】:

    尽管您的代码应该按原样运行,但您可以将这部分全部删除:.withCredentials(new InstanceProfileCredentialsProvider(false)) 如果您未指定任何凭据设置,AWS SDK for Java 将自动获取实例配置文件。你可以这样做:

    AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
    

    如果这不起作用,请尝试从 S3 存储桶中完全删除存储桶策略。您不需要存储桶策略以允许使用 IAM 实例配置文件的服务器访问存储桶,并且如果您的存储桶策略中有错字或某些内容,则可能会造成破坏。

    如果这不起作用,请将分配给 IAM 实例配置文件的 IAM 策略添加到您的问题中。

    【讨论】:

    • 我试过 AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();使用我现有的存储桶策略以及删除我的存储桶策略。没有运气。
    • 我已添加分配给角色的 IAM 策略,该角色又分配给 Quesiton 中的 Ec2 实例。
    • 顺便说一句,当 Ec2InstanceRole 分配给 Ec2 实例时,我是否需要设置环境变量和/或 Java 系统属性和/或 Ec2 实例中的默认凭据配置文件?
    • 不,恰恰相反。您需要确保系统上没有 AWS 凭证文件,并且您需要确保没有在环境变量中定义任何凭证。如果您拥有其中任何一个,它将覆盖实例配置文件凭据。我推荐阅读这个页面:docs.aws.amazon.com/sdk-for-java/v1/developer-guide/…
    • 它会首先查找环境变量,如果没有找到,接下来会查找 java 系统属性,如果没有找到系统属性,接下来会查找凭证文件,等等. 由于您想使用选项 5,EC2 实例配置文件,您需要确保您没有做任何其他事情,以便它会通过提供程序链并到达它检查并使用您已配置的实例配置文件。
    猜你喜欢
    • 2012-11-23
    • 2014-06-06
    • 2021-08-02
    • 2023-01-24
    • 1970-01-01
    • 2014-03-03
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多