当前位置: 首页 > 知识库问答 >
问题:

AWS-无法从EC2访问S3 bucket对象

景才英
2023-03-14

我不确定我是不是漏了一步。

我有一个s3 bucket,我需要能够从一个AWS SDK PHP脚本访问我写的运行在我的EC2上。我创建了一个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/*"
        }
    ]
}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
{
    "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/*"
            ]
        }
    ]
}

我的Bucket策略中没有任何关于我的EC2甚至我附加的IAM角色的内容。我也需要在我的桶策略中添加一些东西吗?这就是我困惑的地方。

我所经历的是,当一个新的对象被创建,我试图从我的AWS SDK PHP访问该对象时,我得到了一个“403”禁止。如果我在S3控制台中公开该对象,我就可以很好地访问它。因此,即使我为EC2设置了访问S3的权限,除非我将该对象公开,否则我无法访问它。

我甚至尝试通过终端对实际服务器上的对象使用wget,但除非公开该对象,否则我仍然获得403

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));

共有1个答案

穆歌者
2023-03-14

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

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

本文档是一个良好的开端:https://docs.aws.amazon.com/codedeploy/latest/userguide/gett-start-create-iam-instance-profile.html

 类似资料:
  • 从AWS-EC2实例运行的AWS-SDK如何访问AWS-S3桶? 将AWS-EC2策略设置为可以访问S3存储桶而无需访问ID和密钥。 aws-cli工具能够从EC2实例访问S3桶,而不需要任何访问ID和密钥。 如果aws-cli工具能够在没有访问ID和密钥的情况下访问S3,那么AWS-SDK在从EC2实例运行时也必须有办法做到这一点。 如何做到这一点?

  • 我已启动 EC2 - Windows 实例 创建了一个 S3 存储桶,创建了一个角色 S3 完整访问并分配给 EC2 实例。 从EC2实例浏览器中,我能够访问我的角色的元数据:http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2-S3-access 如果我尝试从S3 bucket访问文件:https://s3.ap

  • 我编写了一个非常简单的spring boot应用程序,并将其打包在Docker中。 docker文件的内容是: 我把它推到了docker hub。 我在aws上创建了一个新的EC2实例。然后我连接到它并键入以下命令: 最后一个命令在屏幕上给出了许多消息,表示spring boot应用程序正在运行。 看起来很棒。但是,当我打开浏览器并键入:http://ec2-54-86-87-68.compute

  • 我正在运行一个AWS ECS服务,它正在运行一个具有多个容器的任务。任务在awsvpc网络模式下运行。(EC2,不是Fargate) 集装箱港口映射在ECS任务定义中。 PS:目标(公共IP)可以从远程PC访问。只是不是从港口来的。

  • 我使用terraform创建了一个新的EC2实例来安装vertica,但无法在实例中访问Internet或pinggoogle.com。 我已使用私有子网设置了 ec2 实例,并使用公有子网设置了 nat 网关。 主路由表允许 0.0.0.0/0 作为目标,目标作为 nat 网关。另一个路由表将子网关联作为私有子网 10.103.2.0/24。互联网网关也连接到 VPC。 我的ec2实例安全组允许

  • 我一直试图通过访问rest API[1]来监控实例。对于特定的访问密钥和秘密密钥,我在AWS S3上尝试了相同的凭据例如,它成功执行,但对于Amazon EC2,我得到了以下错误: 亚马逊3和AMzonEC2的SIgnature生成是不同的吗?我使用[2]来生成签名,据我所知,亚马逊s3和亚马逊ec2的签名生成没有重大变化。 这可能是什么原因?我们是否需要为Amazon EC2设置任何特定的权限?