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

1 个赞

确保您的 EC2 实例具有上传到 S3 的正确权限,例如 s3:PutObjects3:GetObject。仔细检查您的 S3 存储桶的区域和访问设置。如果需要,您可能还想尝试启用 s3_use_acls: true。您也可以尝试使用 AWS CLI 直接上传来排除权限问题。如果您不使用直接上传,请将 enable_direct_s3_uploads: f 保持原样。应该有助于解决问题!

1 个赞

嗯……

我的 EC2 实例角色策略看起来是这样的:

[
    {
    "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"
}
]

存储桶权限看起来是这样的,但安全中心已经对我大喊大叫,说它太开放了 :frowning:

我可以通过 CLI 从 EC2 实例上传文件而没有问题(在这种情况下,实例配置文件可以正常工作)。

更新:注意到上传进度达到 100%,之后我才收到错误(不得不快速使用 Greenshot 捕捉到这个 :smiley:

嗯……似乎它成功上传了分段,但之后未能完成该过程。

现在已尝试设置具有凭证的 IAM 用户,并授予其 s3:* 权限,现在上传可以正常工作,但 Discourse 之后无法显示它:

由于我在一家公司工作,并且我们的账户中启用了 SCP(服务控制策略),因此似乎公共访问通常被阻止

对我(以及所有在账户中有相同限制的人)来说,似乎没有 S3 了

我现在放弃了…… :frowning:

希望这能帮到你:https://www.youtube.com/watch?v=qjebh5AOZ8E 。如果贵公司没有明确阻止,这应该对你有用。

我在这里遇到了与原始发帖人相同的错误消息,配置也类似。我已验证,尽管 Discourse 无法做到,但我可以从我的 EC2 实例使用 AWS CLI 获取和放置 S3 对象。

我创建了一个新的 IAM 用户,其权限策略与我的 EC2 实例角色相同,并使用了访问密钥而不是 EC2 实例配置文件,现在上传工作正常。

所以,在我的例子中,这不是更改权限的问题,这让我认为实例配置文件身份验证可能存在 bug。有什么方法可以让我获取有关此失败原因的更多信息吗?

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.