Upload AWS S3 - não é possível assinar a solicitação sem credenciais configuradas

Olá pessoal,

Estou usando a versão 3.4.0.beta3-dev e estou recebendo o erro mencionado (mas apenas na interface do usuário, não nos logs) ao tentar fazer upload de uma imagem em um tópico.

Minha configuração é a seguinte:

["s3_upload_bucket", "<nome_do_bucket>/discourse-uploads"],
["s3_backup_bucket", "<nome_do_bucket>/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", ""]

E estou usando o perfil de instância EC2 e substituindo as credenciais.

Recebo o erro na interface do usuário:

Mas o log informa que foi bem-sucedido:

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)

O bucket está vazio depois (acabei de configurar isso com um bucket novo).

Alguma dica?

Obrigado,

WS

Certifique-se de que sua instância EC2 tenha as permissões corretas para fazer upload para o S3, como s3:PutObject e s3:GetObject. Verifique novamente a região e as configurações de acesso do seu bucket S3. Você também pode tentar ativar s3_use_acls: true, se necessário. Você também pode testar o upload diretamente com o AWS CLI para descartar problemas de permissão. E se você não estiver usando uploads diretos, deixe enable_direct_s3_uploads: f como está. Deve ajudar a corrigir o problema!

hmmmm…

Minha política de EC2Instance Roles se parece com isto:

[
    {
    "Action": [
        "s3:PutObject",
        "s3:AbortMultipartUpload",
        "s3:PutLifecycleConfiguration",
        "s3:PutObjectVersionAcl",
        "s3:PutBucketCORS",
        "s3:DeleteObject",
        "s3:PutObjectAcl",
        "s3:Get*",
        "s3:List*"
    ],
    "Resource": [
        "arn:aws:s3:::\u003cdata-bucket\u003e",
        "arn:aws:s3:::\u003cdata-bucket\u003e/*",
        "arn:aws:s3:::\u003cbackup-bucket\u003e",
        "arn:aws:s3:::\u003cbackup-bucket\u003e/*"
    ],
    "Effect": "Allow"
}
]

As permissões do bucket se parecem com isto, mas o Security Hub já está me alertando que está muito aberto :frowning:

Posso fazer upload de arquivos da instância EC2 sem problemas com a CLI (o instanceprofile funciona nesse sentido)

ATUALIZAÇÃO: notei que o progresso do upload atinge 100% e só depois disso recebo o erro (tive que ser rápido com o Greenshot para capturar isso :smiley:)

hmmmm … parece que ele conseguiu fazer o upload das partes múltiplas, mas não conseguiu finalizar o processo depois.

Tentei agora configurar um Usuário IAM com credenciais e dar a ele permissões s3:*, e agora o upload funciona, mas o discourse não consegue exibi-lo depois:

Como trabalho em uma empresa, e há SCPs (Políticas de Controle de Serviço) ativas para nossas contas, parece que o acesso público é geralmente bloqueado.

Parece não haver S3 para mim (e para todos que têm as mesmas restrições para suas contas).

Desistindo agora… :frowning:

Espero que isso funcione para você: https://www.youtube.com/watch?v=qjebh5AOZ8E. Isso funcionaria para você se não for explicitamente bloqueado por sua empresa.

Estava recebendo a mesma mensagem de erro do autor original aqui, com uma configuração semelhante. Verifiquei que conseguia obter e colocar objetos s3 usando o AWS CLI da minha instância EC2, embora o Discourse não conseguisse fazer isso.

Criei um novo usuário IAM com a mesma política de permissões da minha função de instância EC2 e usei uma chave de acesso em vez do perfil de instância EC2, e agora os uploads funcionam bem.

Portanto, no meu caso, não foi um problema de alteração de permissões, o que me faz pensar que pode haver um bug na autenticação do perfil de instância. Existe alguma maneira de obter mais informações sobre por que isso estava falhando?