Я додаю відповідь у тому ж напрямку, що і прийнята відповідь, але з невеликими (важливими) відмінностями та додаю більше деталей.
Розглянемо конфігурацію нижче:
{
"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>/*"]
}
]
}
Політика надає програмні записи-видалення доступу і розділяється на дві частини: дія забезпечує дозволу на рівні відра та інші дії вимагають дозволу на доступ до об'єктів всередині відра.
ListBucket
PutObject/DeleteObject
Перший елемент ресурсу вказує arn:aws:s3:::<Bucket-Name>
на ListBucket
дію, щоб додатки могли перелічити всі об'єкти у відрі.
Другий елемент ресурсу вказує arn:aws:s3:::<Bucket-Name>/*
на дії PutObject
та DeletObject
дії, щоб програми могли записувати чи видаляти будь-які об’єкти у відрі.
Розділення на дві різні «арни» важливо з міркувань безпеки для того, щоб вказати дозволи на тонкий вміст на рівні ковша та об'єкта.
Зауважте, що якби я вказав саме GetObject
у другому блоці, що трапиться, це те, що у випадках програмного доступу я отримаю помилку на зразок:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
.
aws
одного користувача та використав його у башті-скрипті, який називається cronjob, від іншого користувача, тобто ключ доступу та маркер доступу були неправильними / невідобраними. Моє рішення полягало в тому, щоб безпосередньо поставити облікові дані (AWS_ACCESS_KEY_ID
іAWS_SECRET_ACCESS_KEY
) у мій файл скриптів bash, як описано тут .