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 ListBucket
ação fornece permissões no nível do bloco e as outras PutObject/DeleteObject
ações requerem permissões nos objetos dentro do bloco.
O primeiro elemento Resource especifica arn:aws:s3:::<Bucket-Name>
a ListBucket
açã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 DeletObject
para 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 GetObject
no 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
.
aws
para 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_ID
eAWS_SECRET_ACCESS_KEY
) no meu arquivo de script bash, conforme descrito aqui .