授予EC2实例访问S3 Bucket的权限

时间:2016-05-10 09:37:09

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

我想授予我的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存储桶中的文件,但这也不起作用。

5 个答案:

答案 0 :(得分:1)

我发现了......

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

答案 1 :(得分:1)

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

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

  5. 现在您已放置凭证文件,您可以使用Java代码访问存储桶 注意 :此需要AWS-SDK库

  6. 
    
        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 = [你的水桶名称]
    前缀 = [您的存储区中的文件夹结构,包含您的文件]

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

答案 2 :(得分:1)

至少到现在(2019年),有一种更轻松,更干净的方法(凭据不必存储在实例中,而是可以自动查询):

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

@ 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/*"]
        }
    ]
}

您必须调整允许的操作,并替换“存储桶名称”

答案 3 :(得分:0)

试试这个:

{
"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"
            }
        }
    }
]
}

答案 4 :(得分:0)

我遇到了同样的问题。我终于解决了这一问题,方法是使用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对我不起作用)。我终于安装了cli的第2版,以使其正常工作。