Dodaję odpowiedź w tym samym kierunku, co zaakceptowana odpowiedź, ale z małymi (ważnymi) różnicami i dodaję więcej szczegółów.
Rozważ poniższą konfigurację:
{
"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>/*"]
}
]
}
Polityka udziela programową zapisu usuwania dostępu i jest podzielony na dwie części: działanie zapewnia uprawnień na poziomie wiadro, a druga
ListBucket
PutObject/DeleteObject
działania wymagają uprawnienia na obiektach wewnątrz wiadra.
Pierwszy element Resource określa arn:aws:s3:::<Bucket-Name>
dlaListBucket
działania, dzięki czemu aplikacje mogą wymienić wszystkie obiekty w wiadrze.
Drugi element Resource określa arn:aws:s3:::<Bucket-Name>/*
dla PutObject
iDeletObject
działania dzięki czemu aplikacje mogą pisać lub usuwać żadnych obiektów w wiadrze.
Rozdzielenie na dwie różne „arny” jest ważne ze względów bezpieczeństwa w celu określenia szczegółowych uprawnień na poziomie zasobnika i obiektu.
Zauważ, że gdybym określił tylko GetObject
w drugim bloku, co by się stało, to w przypadku dostępu programistycznego otrzymałem błąd taki jak:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
.
aws
dla jednego użytkownika i użyłem go w skrypcie bash o nazwie cronjob od innego użytkownika, co oznacza, że klucz dostępu i token dostępu były nieprawidłowe / nieustawione. Moim rozwiązaniem było bezpośrednie umieszczenie poświadczeń (AWS_ACCESS_KEY_ID
iAWS_SECRET_ACCESS_KEY
) w moim pliku skryptu bash, jak opisano tutaj .