Estou adicionando uma resposta com a mesma direção que a resposta aceita, mas com pequenas (importantes) diferenças e adicionando mais detalhes.
Considere a configuração abaixo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::<Bucket-Name>"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
}
]
}
A política concede acesso programático de exclusão de gravação e é separada em duas partes:
a ListBucketação fornece permissões no nível do bloco e as outras PutObject/DeleteObjectações requerem permissões nos objetos dentro do bloco.
O primeiro elemento Resource especifica arn:aws:s3:::<Bucket-Name>a ListBucketação para que os aplicativos possam listar todos os objetos no bucket.
O segundo elemento Resource especifica arn:aws:s3:::<Bucket-Name>/*as ações PutObject, e DeletObjectpara que os aplicativos possam gravar ou excluir qualquer objeto no bucket.
A separação em dois 'arns' diferentes é importante por motivos de segurança, a fim de especificar permissões refinadas no nível do bucket e no nível do objeto.
Observe que se eu tivesse especificado apenas GetObjectno segundo bloco, o que aconteceria é que, nos casos de acesso programático, eu receberia um erro como:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.
awspara um usuário e o usei dentro de um script bash chamado cronjob de outro usuário, o que significa que a chave de acesso e o token de acesso estavam errados / não configurados. Minha solução foi colocar diretamente as credenciais (AWS_ACCESS_KEY_IDeAWS_SECRET_ACCESS_KEY) no meu arquivo de script bash, conforme descrito aqui .