Acesso negado ao fazer upload de arquivos para a Amazon usando políticas do Paperclip e do IAM
Não consigo fazer um upload trabalhando com o Paperclip usando uma política do IAM do S3. Estou até tendo problemas com uploads diretos do jQuery (sem Paperclip). Meu cenário é o seguinte, eu tenho um aplicativo que terá muitos sites. Cada site terá seu próprio bucket e só poderá acessar seu próprio bucket, o de mais ninguém. oPolíticas de Exemplo do IAM A documentação explica exatamente o que eu quero fazer em "Exemplo: Permitir que cada usuário do IAM acesse uma pasta em um bucket". Eu tenho um grupo IAM configurado para o aplicativo e tenho um usuário por site dentro do grupo. Esses usuários do IAM pertencem ao grupo. A política do grupo é a seguinte:
{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Action":[
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource":"arn:aws:s3:::my-app/${aws:username}/*"
}
]
}
Aqui está minha configuração de CORS no balde, para dev é claro, ele será bloqueado mais tarde:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Aqui estão as minhas configurações de Paperclip:
has_attached_file :background_image,
storage: :s3,
s3_credentials: {
access_key_id: "xxx",
secret_access_key: "xxx"
},
bucket: "my-app",
s3_permissions: "public-read",
path: "/background_images/:id/:filename"
Anteriormente, estava trabalhando com diretivas diretamente no intervalo, o que funcionou, mas não foi tão flexível quanto necessário quando entro em um ambiente de produção com muitos "sites". Tanto quanto eu posso dizer que eu segui a documentação exatamente ainda qualquer coisa que eu faço resulta em 'acesso negado'. Neste ponto, não tenho certeza se o problema está na minha política do IAM ou na configuração do Paperclip.
editar: esclarecimento.
edit 2: SOLUÇÃO FINAL
Aqui está minha política final do IAM baseada emEste artigo:
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::my-app"],
"Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::estimator-app"],
"Condition":{"StringLike":{"s3:prefix":["home/${aws:username}/*"]}}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::my-app/home/${aws:username}/*"]
}
]
}
E minhas configurações atualizadas de Paperclip:
has_attached_file :background_image,
storage: :s3,
s3_credentials: {
access_key_id: "xxx",
secret_access_key: "xxx"
},
bucket: "estimator-app",
s3_permissions: "public-read",
path: "/home/my_s3_username/background_images/:id/:filename"
Era importante incluir o nome de usuário no caminho Paperclip. Eu estava supondo que a Amazon inferiria isso das credenciais, mas esse não é o caso.