Загрузка в AWS S3 — не удалось подписать запрос без установленных учетных данных

Привет, ребята,

Я использую версию 3.4.0.beta3-dev и получаю упомянутую ошибку (но только в интерфейсе, а не в логах) при попытке загрузить изображение в тему.

Моя конфигурация выглядит следующим образом:


["s3_upload_bucket", "<bucketname>/discourse-uploads"],
 ["s3_backup_bucket", "<bucketname>/discourse-backups"],
 ["s3_region", "eu-central-1"],
 ["s3_use_acls", "f"],
 ["enable_direct_s3_uploads", "f"],
 ["enable_s3_uploads", "t"],
 ["s3_access_key_id", ""],
 ["s3_secret_access_key", ""]]

Я использую профиль экземпляра EC2 и переопределяю учётные данные.

В интерфейсе я получаю ошибку:

Но в логах сказано, что всё прошло успешно:

Started POST "/uploads.json?client_id=bb1ab05dbb9d4d1f9930d05f28b17f94" for 10.x.x.x at 2024-12-13 11:46:35 +0000
Processing by UploadsController#create as JSON
  Parameters: {"upload_type"=>"composer", "pasted"=>"true", "name"=>"image.png", "type"=>"image/png", "sha1_checksum"=>"a0f0fe1abd27ce137e0e1b2a28cd9348a08112ff", "file"=>#<ActionDispatch::Http::UploadedFile:0x00007f50b8b01db8 @tempfile=#<Tempfile:/tmp/RackMultipart20241213-386-i7xkqa.png>, @content_type="image/png", @original_filename="image.png", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"image.png\"\r\nContent-Type: image/png\r\n">, "client_id"=>"bb1ab05dbb9d4d1f9930d05f28b17f94"}
Completed 200 OK in 36ms (Views: 0.1ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
Completed 418  in 23ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.4ms)

После этого бакет пуст (я только что настроил его с новым бакетом).

Есть какие-то подсказки?

Спасибо,

WS

Убедитесь, что ваш экземпляр EC2 имеет необходимые права для загрузки в S3, например s3:PutObject и s3:GetObject. Перепроверьте регион и настройки доступа вашего бакета S3. При необходимости вы также можете включить параметр s3_use_acls: true. Вы можете также протестировать загрузку напрямую через AWS CLI, чтобы исключить проблемы с правами доступа. Если вы не используете прямую загрузку, просто оставьте enable_direct_s3_uploads: f без изменений. Это должно помочь решить проблему!

Хм-м-м…

Моя политика ролей EC2 Instance выглядит так:

[
    {
    "Action": [
        "s3:PutObject",
        "s3:AbortMultipartUpload",
        "s3:PutLifecycleConfiguration",
        "s3:PutObjectVersionAcl",
        "s3:PutBucketCORS",
        "s3:DeleteObject",
        "s3:PutObjectAcl",
        "s3:Get*",
        "s3:List*"
    ],
    "Resource": [
        "arn:aws:s3:::<data-bucket>",
        "arn:aws:s3:::<data-bucket>/*",
        "arn:aws:s3:::<backup-bucket>",
        "arn:aws:s3:::<backup-bucket>/*"
    ],
    "Effect": "Allow"
}
]

Разрешения для бакета выглядят так, но Security Hub уже кричит мне, что это слишком открыто :frowning:

Я могу загружать файлы с экземпляра EC2 без проблем через CLI (instanceprofile работает в этом отношении)

ОБНОВЛЕНИЕ: заметил, что прогресс загрузки достигает 100 %, и только после этого я получаю ошибку (пришлось поторопиться с Greenshot, чтобы запечатлеть это :smiley:)

Хм-м-м… Похоже, он успешно загрузил части (multipart), но не смог завершить процесс после этого.

Попробовал настроить пользователя IAM с учетными данными и выдать ему права s3:*, теперь загрузка работает, но Discourse не может отобразить изображение после этого:

Поскольку я работаю в компании, и для наших аккаунтов активны SCP (политики контроля сервисов), похоже, что публичный доступ в целом заблокирован.

Похоже, S3 для меня (и для всех, у кого такие же ограничения для их аккаунтов) недоступен.

Сдаюсь… :frowning:

Надеюсь, это вам подойдёт: https://www.youtube.com/watch?v=qjebh5AOZ8E. Это сработает, если ваша компания явно не заблокировала этот ресурс.

У меня возникало то же сообщение об ошибке, что и у автора оригинального поста, при схожей конфигурации. Я проверил, что с помощью AWS CLI на моем экземпляре EC2 могу загружать и выгружать объекты S3, хотя Discourse не мог этого делать.

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

Таким образом, в моем случае проблема не была связана с изменением разрешений, что заставляет меня предположить наличие ошибки в аутентификации через профиль экземпляра. Есть ли способ получить дополнительную информацию о том, почему это не работало?