Проблема доступа к корзине AWS S3 с разрешениями пользователя IAM

В настоящее время я столкнулся с проблемой доступа к объектам в моей корзине AWS S3 с использованием пользователя IAM, которому были предоставлены определенные разрешения. Вот краткий обзор моей установки:

  1. Политика сегмента S3:
  • У меня есть корзина S3 с именем eskolo-dev-bucket, к которой прикреплена следующая политика:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXXXXX:user/eskoloAppUsers"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::eskolo-dev-bucket/*"
        }
    ]
}

  1. Политика пользователя IAM: К пользователю IAM eskoloAppUsers прикреплены следующие политики:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::eskolo-dev-bucket"
            ]
        },
        {
            "Sid": "ManipulatePolicy",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::eskolo-dev-bucket/*"
            ]
        }
    ]
}

  1. Мой код .Net с Appsettings.json
 public static async Task<bool> DoesS3ObjectExistAsync(AwsSettings awsSettings, string key)
 {
     try
     {
         using var s3Client = new AmazonS3Client(
             awsSettings.AccessKey,
             awsSettings.SecretKey,
             awsSettings.Region);
         var request = new GetObjectMetadataRequest
         {
             BucketName = awsSettings.Bucket,
             Key = key
         };

         await s3Client.GetObjectMetadataAsync(request);
         return true;
     }
     catch (AmazonS3Exception e)
     {
         if (e.StatusCode == HttpStatusCode.NotFound)
             return false;

         throw;
     }

Appsettings.json

"AwsSettings": {
  "AccessKey": "xxxxxxxxxx",
  "Bucket": "eskolo-dev-bucket",
  "LogoUri": "s3://eskolo-dev-bucket/development/assets/",
  "Region": "eu-north-1",
  "SecretKey": "xxxxxxx",
  "TemplateUri": "s3://eskolo-dev-bucket/development/email-templates/"
}
  1. Описание проблемы:
  • При попытке получить доступ к объектам в eskolo-dev-bucket через приложение my.NET с помощью метода GetObjectMetadataAsync я постоянно получаю ошибку 404. URI, которые я использую: s3://eskolo-dev-bucket/development/assets/eSkolo Logo.svg s3://eskolo-dev-bucket/development/email-templates/e-Skolo-OTP-template.hbs
  1. Ожидаемое поведение:
  • Я ожидаю, что смогу успешно получить метаданные для этих объектов без получения ошибки 404.
  1. Фактическое поведение:
  • При отправке запроса я получаю ошибку 404, указывающую, что запрошенный ресурс не существует.
  1. Шаги, предпринятые для решения:
  • Дважды проверьте имя сегмента и пути к объектам на наличие опечаток.
  • Проверено, что пользователь IAM имеет правильные разрешения.
  • Убедилось, что объекты существуют в указанных путях в корзине S3.
  1. Дополнительная информация:
  • Пользователь IAM был недавно создан, и разрешения были соответствующим образом обновлены.
  • Нет проблем с сетью или брандмауэров, блокирующих доступ к сервисам AWS.

Можете ли вы показать нам код, который вы используете? Обычно вызовы AWS SDK не используют формат s3://eskolo-dev-bucket/development/email-templates/e-Skolo-O‌​TP-template.hbs. Вместо этого вы должны указать имя сегмента и ключ в отдельных полях.

John Rotenstein 01.07.2024 00:29

Примечание: вам не нужно использовать политику сегмента в вашей ситуации. Предоставления разрешения через пользователя IAM достаточно, чтобы предоставить доступ к сегменту. Политика сегмента обычно используется только для предоставления доступа ВСЕМ пользователям или для доступа к нескольким учетным записям.

John Rotenstein 01.07.2024 00:32

Привет @JohnRotenstein, я добавил код .Net. Спасибо за вашу помощь.

Programmer In The Making 02.07.2024 17:30

Какое значение key передается в функцию DoesS3ObjectExistAsync()?

John Rotenstein 03.07.2024 01:21

@JohnRotenstein - ключ development/email-templates/e-Skolo-OTP-template.hbs

Programmer In The Making 03.07.2024 17:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы проверить вашу политику, я сделал следующее:

  • Создан новый сегмент S3 programmer-in-the-making с настройками по умолчанию.
  • Создал пользователя IAM и прикрепил эту политику:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListPolicy",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::programmer-in-the-making"
            ]
        },
        {
            "Sid": "ManipulatePolicy",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::programmer-in-the-making/*"
            ]
        }
    ]
}
  • Загрузил файл в корзину
  • Создал ключ доступа и секретный ключ для пользователя IAM и сохранил его с помощью aws configure --profile progammer-in-the-making.
  • Запустите команды AWS CLI:
% aws s3 ls s3://programmer-in-the-making --profile programmer-in-the-making
2024-07-04 12:37:30      54741 ghost.gif

% aws s3api head-object  --bucket programmer-in-the-making --key ghost.gif --profile programmer-in-the-making
{
    "AcceptRanges": "bytes",
    "LastModified": "2024-07-04T02:37:30+00:00",
    "ContentLength": 54741,
    "ETag": "\"131ca58bc2049ab827b0d6b21b746347\"",
    "ContentType": "image/gif",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}

(Я использовал head-object как ближайшую к GetObjectMetadataAsync() операцию AWS CLI, которую вы используете.)

Запросы AWS CLI были успешными, что доказывает, что политика достаточна для доступа к объектам в корзине.

Затем я попробовал другие команды, чтобы убедиться, что разрешения ограничены разрешениями, предоставленными в корзине:

% aws s3 ls --profile programmer-in-the-making

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

Следовательно, любая проблема заключается либо в вашем коде, либо в вашем ключе доступа/секретном ключе. Разрешения IAM, предоставленные в политике, верны.

Вы правы, проблема заключалась в коде .Net. Я изо всех сил пытался получить правильную документацию для .AWS S3 SDK для .Net, поэтому использовал неправильный код.

Programmer In The Making 05.07.2024 22:53

Другие вопросы по теме

Невозможно найти актив в /home/runner/CDK_Test/frontend/frontendapp/build при запуске развертывания CDK на GitHub. Действие
Terraform не позволяет использовать переменную при создании ресурса. Как объехать?
Использование AWS CloudFront для обслуживания HTTPS в корзинах AWS S3, но НЕКОТОРЫЕ изображения застревают в цикле перенаправления
HTML-аудиоэлемент отключен, хотя src верен
Загрузка файла на S3 через Node.js SDK. Результатом является пустой файл
Браузер не обновляет изображение, когда URL-адрес источника изображения изменен на URL-адрес изображения в корзине AWS S3
Снежинка — получайте уведомления о любых ошибках задачи, если для копии установлено значение «on_error = continue»
Ошибка чтения файла из S3: null (Служба: S3, код состояния: 502) с помощью GetObjectRequest
Scrapy TSV скачать файл. как конвертировать файл в паркет перед загрузкой на s3
Как мне подключить ssh-ключ для репозитория BitBucket к моему контейнеру, чтобы использовать ссылки ssh git в рабочих процессах Argo?