【问题标题】:Grant EC2 instance access to S3 Bucket授予 EC2 实例对 S3 存储桶的访问权限
【发布时间】:2016-09-05 04:48:03
【问题描述】:

我想授予我的 ec2 实例访问 s3 存储桶的权限。

在这个 ec2 实例上,启动了一个包含我的应用程序的容器。现在我没有获得 s3 存储桶的权限。

这是我的存储桶策略

{
"Version": "2012-10-17",
"Id": "Policy1462808223348",
"Statement": [
    {
        "Sid": "Stmt1462808220978",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::714656454815:role/ecsInstanceRole"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::bucket-name/*",
        "Condition": {
            "IpAddress": {
                "aws:SourceIp": "private-ip/32"
            }
        }
    }
]
}

但在我授予存储桶所有人访问它的权限之前,它不起作用。

我尝试从 ec2 实例内部卷曲 s3 存储桶中的文件,但这也不起作用。

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-ec2 amazon-policy


    【解决方案1】:

    我遇到了同样的问题。我终于通过使用 AWS CLI 为有问题的存储桶创建访问点解决了这个问题,请参阅 https://docs.aws.amazon.com/AmazonS3/latest/dev/creating-access-points.html 然后我创建了一个如下所示的存储桶策略

    {
        "Version": "2012-10-17",
        "Id": "Policy1583357393961",
        "Statement": [
            {
                "Sid": "Stmt1583357315674",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<account-id>:role/ecsInstanceRole"
                },
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::<your-bucket>"
            },
            {
                "Sid": "Stmt1583357391961",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::<account-id>:role/ecsInstanceRole"
                },
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": "arn:aws:s3:::<your-bucket>/*"
            }
        ]
    }
    

    请确保您使用的是较新版本的 aws cli(1.11.xxx 不适用于我)。我终于安装了第 2 版的 cli 来让它工作。

    【讨论】:

      【解决方案2】:

      至少在 2019 年之前,有一种更简单、更简洁的方法(凭据不必存储在实例中,而是可以自动查询它们):

      1. 为您的实例创建一个 IAM 角色并分配它
      2. 创建策略以授予对您的 s3 存储桶的访问权限
      3. 将策略分配给实例的 IAM 角色
      4. 上传/下载对象,例如通过aws cli for s3 - cp 例如aws s3 cp &lt;S3Uri&gt; &lt;LocalPath&gt;

      @2:Allow Read and Write Access to Objects in an S3 Bucket 的 JSON 策略示例是:

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "ListObjectsInBucket",
                  "Effect": "Allow",
                  "Action": ["s3:ListBucket"],
                  "Resource": ["arn:aws:s3:::bucket-name"]
              },
              {
                  "Sid": "AllObjectActions",
                  "Effect": "Allow",
                  "Action": "s3:*Object",
                  "Resource": ["arn:aws:s3:::bucket-name/*"]
              }
          ]
      }
      

      您必须调整允许的操作,并替换“bucket-name”

      【讨论】:

        【解决方案3】:

        没有直接授予“EC2”实例访问 AWS 服务器的方法,但您可以尝试以下方法。

        1. 在 AWS IAM 中创建一个新用户,然后下载凭证文件。
        2. 此用户将代表您的 EC2 服务器。
        3. 为用户提供对您的 S3 存储桶的权限。
        4. 接下来,将凭据文件放在以下位置:-
          EC2 - Windows 实例:
          一种。将凭据文件放置在您希望的任何位置。 (例如 C:/credentials)
          湾。创建一个环境变量 AWS_CREDENTIAL_PROFILES_FILE 并将值作为您放置凭证文件的路径(例如 C:/credentials)
          EC2 - Linux 实例
          一种。按照 Windows 实例中的步骤操作
          湾。在应用服务器的根文件夹(例如 /usr/share/tomcat6)中创建一个文件夹 .aws
          C。在环境变量和 .aws 文件夹之间创建符号链接 sudo ln -s $AWS_CREDENTIAL_PROFILES_FILE /usr/share/tomcat6/.aws/credentials

        5. 现在您的凭证文件已放置,您可以使用 Java 代码访问存储桶。
          注意:AWS-SDK 库对于这个

        
        
            AWSCredentials credentials = null;
                    try {
                        credentials = new ProfileCredentialsProvider().getCredentials();
                    } catch (Exception e) {
                        LOG.error("Unable to load credentials " + e);
                        failureMsg = "Cannot connect to file server.";
                        throw new AmazonClientException(
                                "Cannot load the credentials from the credential profiles file. " +
                                "Please make sure that your credentials file is at the correct " +
                                "location (environment variable : AWS_CREDENTIAL_PROFILES_FILE), and is in valid format.",
                                e);
                    }
        
                    AmazonS3 s3 = new AmazonS3Client(credentials);
                    Region usWest2 = Region.getRegion(Regions.US_WEST_2);
                    s3.setRegion(usWest2);
            ObjectListing objectListing = s3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix));
        
        

        bucketName = [您的存储桶名称]
        prefix = [您存储桶中的文件夹结构,其中包含您的文件]

        希望对您有所帮助。 此外,如果您不使用 Java,您也可以查看其他编程语言的 AWS-SDK。

        【讨论】:

          【解决方案4】:

          我发现了……

          它仅适用于 ec2 实例的公共 IP。

          【讨论】:

            【解决方案5】:

            试试这个:

            {
            "Version": "2012-10-17",
            "Id": "Policy1462808223348",
            "Statement": [
                {
                    "Sid": "Stmt1462808220978",
                    "Effect": "Allow",
                    "Principal": {
                        "AWS": "*" 
                    },
                    "Action": "s3:*",
                    "Resource": "arn:aws:s3:::bucket-name/*",
                    "Condition": {
                        "IpAddress": {
                            "aws:SourceIp": "yourIp/24"
                        }
                    }
                }
            ]
            }
            

            【讨论】:

            • 没用。这太令人困惑了。就像我说的那样,我什至无法从 ec2 实例内部为我的文件制作卷曲。只有当我为所有人设置权限并且我不想这样做时。
            猜你喜欢
            • 2022-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-02
            • 1970-01-01
            • 2013-10-31
            • 2018-02-01
            • 2020-08-22
            相关资源
            最近更新 更多