授予 EC2 实例对 S3 存储桶的访问权限

Grant EC2 instance access to S3 Bucket

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

试试这个:

{
"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 实例的 public IP。

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

  1. 在 AWS IAM 中创建一个新用户,并下载凭证文件。
  2. 此用户将代表您的 EC2 服务器。
  3. 向用户提供对您的 S3 存储桶的权限。
  4. 接下来,将凭据文件放在以下位置:-
    EC2 - Windows 实例:
    一种。将凭据文件放在您希望的任何位置。 (例如 C:/credentials)
    b.创建一个环境变量 AWS_CREDENTIAL_PROFILES_FILE 并将值作为放置凭据文件的路径(例如 C:/credentials)
    EC2 - Linux 实例
    一种。按照 windows 实例
    中的步骤操作 b.在您的应用程序服务器的根文件夹中创建一个文件夹 .aws(例如 /usr/share/tomcat6)。
    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-SDKs。

至少在 2019 年,有一种更简单、更简洁的方法来做到这一点(凭据永远不必存储在实例中,而是可以自动查询):

  1. 为您的实例创建一个 IAM 角色并分配它
  2. 创建策略以授予对您的 s3 存储桶的访问权限
  3. 将策略分配给实例的 IAM 角色
  4. upload/download 个对象,例如通过 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/*"]
        }
    ]
}

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

我遇到了同样的问题。我最终通过使用 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 来让它工作。