Как правильно настроить S3 и IAM для загрузки файлов в корзину S3? - PullRequest
0 голосов
/ 12 января 2019

Я хочу использовать S3 для размещения файлов, которые я загружаю через приложение Kotlin Spring-Boot. Я следовал инструкциям и использовал различные другие документы, а также попробовал несколько решений для подобных проблем, обнаруженных в stackoverflow. Я всегда получаю ошибку 403. Как настроить S3 и IAM, чтобы я мог загрузить файл? И как мне узнать что не так? Любая помощь будет оценена.

Я активировал ведение журнала доступа, который занимает много лет и пока мне мало чем помогает, особенно потому, что создание журнала занимает около 45 минут. Игнорируя ответы со статусом 200, в журналах появляются следующие сообщения (сегмент представляет имя моего сегмента):

  • GET / bucket? Encryption = HTTP / 1.1 "404 ServerSideEncryptionConfigurationNotFoundError
  • GET / bucket? Cors = HTTP / 1.1 "404 NoSuchCORSConfiguration
  • GET / bucket? Policy = HTTP / 1.1 "404 NoSuchBucketPolicy
  • PUT / bucket? Policy = HTTP / 1.1 "400 MalformedPolicy
  • GET / bucket /? PolicyStatus HTTP / 1.1 "404 NoSuchBucketPolicy
  • PUT / bucket? Policy = HTTP / 1.1 "403 AccessDenied

Я создаю AmazonS3 экземпляр по

AmazonS3ClientBuilder.defaultClient()

Я проверил реализацию, и она получает учетные данные из переменных окружения, которые я установил.

Чтобы отправить файл, я использую следующий метод в моей реализации S3Service:

private fun uploadFileToBucket(fileName: String, file: File) {
    s3client.putObject(
            PutObjectRequest(bucketName, fileName, file)
                    .withCannedAcl(CannedAccessControlList.PublicRead)
    )
}

Это моя политика для пользователя IAM (пользователь наследует политику от группы):

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:PutAccountPublicAccessBlock",
            "s3:GetAccountPublicAccessBlock",
            "s3:ListAllMyBuckets",
            "s3:HeadBucket"
        ],
        "Resource": "*"
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket",
            "arn:aws:s3:::bucket/*"
        ]
    }
]

}

И это политика ведра:

{
    "Version": "2012-10-17",
    "Id": "PolicyId",
    "Statement": [
        {
            "Sid": "StmtId",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account:user/username"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket"
        }
    ]
}

В конце я хочу иметь возможность помещать файлы в корзину и предоставлять общий доступ к ним. Например, я хочу загрузить изображения из приложения Angular, загрузить их через приложение Spring Boot и отобразить их в приложении Angular. Сейчас я даже не могу загрузить их через Почтальон без ошибки 403.

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Как отметил Марк Б, политику IAM можно сократить, и политика сегмента в любом случае не нужна. Однако загрузка файла работала с этими настройками и с измененным. Проблема в моем коде и в конфигурации S3 заключалась в том, что я пытался изменить ACL, не допуская этого в своем ведре. Как я отметил на скриншоте ниже, блокирование новых общедоступных ACL-списков должно быть отключено, иначе сервер ответит 403 по определению.

Setting up public access

0 голосов
/ 12 января 2019

Политика IAM может быть сокращена до этого:

{
 "Version": "2012-10-17",
 "Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket",
            "arn:aws:s3:::bucket/*"
        ]
    }
 ]
}

Другими словами, это второе утверждение дает полный доступ к S3, поэтому первое утверждение в вашей политике IAM бессмысленно.

Возможно, в вашей политике ведра что-то не так. Трудно сказать, потому что я заменил несколько значений на заполнители. Однако в этом случае вам не нужна политика сегментов. Я бы просто удалил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...