AWS - Невозможно получить доступ к объекту корзины S3 из EC2 - PullRequest
0 голосов
/ 04 февраля 2020

Я не уверен, пропустил ли я здесь шаг или нет.

У меня есть корзина s3, к которой мне нужно иметь доступ из скрипта 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/*"
        }
    ]
}

И мои доверительные отношения для роли IAM

Доверительные отношения

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

Затем я прикрепил эту роль IAM к своему экземпляру EC2. Из того, что я прочитал, это все, что мне нужно сделать, но я думаю, что мне нужно сделать больше.

В моей Политике Bucket у меня есть следующее, чтобы разрешить доступ из моей SES, чтобы иметь возможность создавать объект электронной почты .

Политика S3 Bucket

{
    "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, которую я прикрепил. Нужно ли что-то добавить в мою Политику Bucket? Вот где я запутался.

Что я испытываю, так это когда создается новый объект, и я пытаюсь получить доступ к этому объекту из моего AWS SDK PHP. Я получаю «403» Запрещено. Если я сделаю этот объект publi c в консоли S3, я смогу получить к нему доступ. Поэтому, даже если я установил разрешения для своего EC2 на доступ к своему S3, если я не сделаю объект доступным c, я не могу получить к нему доступ.

Я даже пытался использовать wget для объекта на реальном сервере через терминал, и я все еще получаю 403, если я не делаю объект опубликованным c

Когда я запускаю симулятор политики IAM для своей роли, я получаю

enter image description here

Вот мой 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));

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

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

0 голосов
/ 04 февраля 2020

Во-первых, вы установили доверительные отношения, чтобы служба EC2 могла взять на себя эту роль?

Далее, вы не связываете роли IAM напрямую с экземплярами EC2; вместо этого вам нужно использовать профиль экземпляра. Вы настроили профиль экземпляра, связанный с этой ролью?

Этот документ является хорошим началом: https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-create-iam-instance-profile.html

...