AWS S3 업로드 - 자격 증명 설정 없이 요청에 서명할 수 없음

여러분,

저는 3.4.0.beta3-dev 버전을 사용 중이고, 주제에 이미지를 업로드하려고 할 때 언급된 오류가 발생하고 있습니다(로그에는 없고 UI에서만 나타남).

제 설정은 다음과 같습니다:


["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 인스턴스 프로필을 사용하여 자격 증명을 오버라이드하고 있습니다.

UI에서 오류가 발생합니다:

하지만 로그에서는 문제가 없었던 것으로 표시됩니다:

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:PutObjects3:GetObject와 같은 올바른 권한이 있는지 확인하세요. S3 버킷의 리전 및 액세스 설정도 다시 한번 점검해 보세요. 필요할 경우 s3_use_acls: true로 설정하는 것도 고려해 볼 수 있습니다. 권한 문제를 배제하기 위해 AWS CLI로 직접 업로드를 테스트해 보는 것도 좋습니다. 그리고 직접 업로드를 사용하지 않는다면 enable_direct_s3_uploads: f 값을 그대로 두면 됩니다. 이렇게 하면 문제가 해결될 것입니다!

음…

제 EC2Instance Roles 정책은 다음과 같습니다:


[
    {
    "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:

CLI를 사용하여 EC2 인스턴스에서 파일을 업로드하는 데는 문제가 없습니다 (instanceprofile은 이 부분에서 정상 작동합니다)

업데이트: 업로드 진행률이 100%에 도달한 후에야 비로소 에러가 발생한다는 것을 알게 되었습니다 (Greenshot으로 빠르게 캡처해야 했어요 :smiley: )

음… 멀티파트 업로드는 성공적으로 수행되었지만, 이후 프로세스를 완료하지는 못한 것 같습니다

방금 IAM 사용자를 만들고 자격 증명을 설정한 뒤 s3:* 권한을 부여했는데, 이제 업로드는 되지만 discourse에서 이후에 표시가 되지 않습니다:

회사에서 일하고 있고, 계정에서 SCP(Service Control Policies)가 활성화되어 있어서 공개 접근이 일반적으로 차단되는 것 같습니다.

나(그리고 같은 제한이 있는 모든 사람)에게는 S3이 불가능한 것 같습니다.

이제 포기합니다 … :frowning:

이것이 당신에게 도움이 되기를 바랍니다: https://www.youtube.com/watch?v=qjebh5AOZ8E . 회사에서 명시적으로 차단되지 않았다면 이 방법으로 작동할 것입니다.

원래 글쓴이와 동일한 오류 메시지가 발생했으며, 설정도 비슷했습니다. EC2 인스턴스에서 AWS CLI를 사용하여 S3 객체를 가져오고 저장할 수 있음을 확인했지만, Discourse에서는 그렇게 할 수 없었습니다.

EC2 인스턴스 역할과 동일한 권한 정책을 가진 새로운 IAM 사용자를 생성하고, EC2 인스턴스 프로파일 대신 액세스 키를 사용했는데, 이제 업로드가 정상적으로 작동합니다.

따라서 제 경우에는 권한 변경 문제가 아니었습니다. 이는 인스턴스 프로파일 인증에 버그가 있을 수 있다는 생각을 하게 만듭니다. 이 문제가 실패한 이유에 대해 더 많은 정보를 얻을 수 있는 방법이 있을까요?