2

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

4

5 回答 5

5

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

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

@2:允许对 S3 存储桶中的对象进行读写访问的 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”

于 2019-03-06T21:45:40.060 回答
1

我发现了......

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

于 2016-05-10T10:34:35.930 回答
1

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

  1. 在 AWS IAM 中创建一个新用户,然后下载凭证文件。
  2. 此用户将代表您的 EC2 服务器。
  3. 为用户提供对您的 S3 存储桶的权限。
  4. 接下来,将凭证文件放在以下位置:-
    EC2 - Windows 实例
    :将凭据文件放置在您希望的任何位置。(例如 C:/credentials)
    b.创建环境变量AWS_CREDENTIAL_PROFILES_FILE并将值作为您放置凭证文件的路径(例如 C:/credentials)
    EC2 - Linux 实例
    a。按照 Windows 实例
    b 中的步骤操作。在应用服务器的根文件夹(例如/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 = [您的存储桶名称]
前缀= [您的存储桶内的文件夹结构,您的文件所在的位置]

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

于 2016-05-11T04:42:50.200 回答
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"
            }
        }
    }
]
}
于 2016-05-10T10:12:51.623 回答
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 版以使其正常工作。

于 2020-03-04T22:34:53.383 回答