【问题标题】:AWS - Unable to access S3 bucket object from EC2AWS - 无法从 EC2 访问 S3 存储桶对象
【发布时间】:2020-05-20 15:59:50
【问题描述】:

我不确定我是否错过了这里的步骤。

我有一个 s3 存储桶,我需要能够从我编写的在我的 EC2 上运行的 AWS 开发工具包 PHP 脚本进行访问。我创建了一个 IAM 角色以允许访问。

IAM Allow_S3_Access_to_EC2

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::myinbox"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::myinbox/*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": "s3:DeleteObject",
            "Resource": "arn:aws:s3:::myinbox/*"
        }
    ]
}

我对 IAM 角色的信任关系是

信任关系

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

然后,我将该 IAM 角色附加到我的 EC2 实例。从我所读到的内容来看,这就是我所要做的,但我认为我还需要做更多。

在我的存储桶策略中,我有以下内容允许从我的 SES 访问以创建电子邮件对象。

S3 存储桶政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::myinbox/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "************"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:role/Allow_S3_Access_to_EC2"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::myinbox",
                "arn:aws:s3:::myinbox/*"
            ]
        }
    ]
}

对于我的 EC2 甚至我附加的 IAM 角色,我的存储桶策略中没有任何内容。我是否还需要在我的存储桶策略中添加一些内容?这就是我困惑的地方。

我遇到的是当创建一个新对象并尝试从我的 AWS 开发工具包 PHP 访问该对象时,我得到一个“403”禁止。如果我在 S3 控制台中公开该对象,我就可以正常访问它。因此,即使我已经为我的 EC2 设置了访问我的 S3 的权限,除非我将对象公开,否则我无法访问它。

我什至尝试通过终端对实际服务器上的对象使用wget,除非我将对象公开

当我在我的角色上运行 IAM 策略模拟器时,我得到了

这是我的 PHP

PHP 脚本

require '../aws-ses/aws-autoloader.php';

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

$bucketName = 'myinbox';

try {
// Instantiate the client.
    $s3 = new S3Client([
        'version' => 'latest',
        'region'  => 'us-west-2',
        'credentials' => array('key'=>'*********************',
                    'secret'=>'*******************************************')
    ]);
} catch (Exception $e) {
    // We use a die, so if this fails. It stops here. Typically this is a REST call so this would
    // return a json object.
    die("Error: " . $e->getMessage());
}
// Use the high-level iterators (returns ALL of your objects).
$objects = $s3->getIterator('ListObjects', array('Bucket' => $bucketName));

【问题讨论】:

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


    【解决方案1】:

    首先,您是否设置了信任关系以便 EC2 服务可以承担该角色?

    接下来,您不要将 IAM 角色直接与 EC2 实例相关联;相反,您需要使用实例配置文件。您是否设置了与该角色关联的实例配置文件?

    这个文档是一个好的开始:https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-iam-instance-profile.html

    【讨论】:

    • 我不确定您所说的信任是什么意思。我通过在控制台 > 操作 > 实例设置 > 附加/替换 IAM 角色中检查实例,将 IAM 角色附加到 EC2。这不是办法吗?
    • 查看我在“信任关系”选项卡下看到的 IAM 角色The identity provider(s) ec2.amazonaws.com
    • 是的:“信任关系”似乎是正确的。您是否看到角色摘要顶部填充了“实例配置文件 ARN”?
    • 是的,arn:aws:iam::****************:instance-profile/Allow_S3_Access_to_EC2
    • 完美。那么是的,您确实需要在您的存储桶策略中声明以允许从您的 EC2 实例进行读取访问。
    【解决方案2】:

    1)我会确保你是ec2使用角色调用s3,使用下面的命令来识别

    aws sts get-caller-identity
    

    2) 我会撤销现有会话以确保新会话已刷新角色

    https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html

    3) 使用 S3 访问分析器来定义访问解析

    https://docs.aws.amazon.com/AmazonS3/latest/user-guide/access-analyzer.html

    【讨论】:

    • 我做了前 2 个,它们都很好,完成了,你能扩展第三个吗?
    猜你喜欢
    • 2016-03-07
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2020-10-15
    • 1970-01-01
    • 2016-01-22
    • 2020-06-15
    相关资源
    最近更新 更多