ฉันกำลังเพิ่มคำตอบในทิศทางเดียวกับคำตอบที่ยอมรับ แต่มีความแตกต่างเล็กน้อย (สำคัญ) และเพิ่มรายละเอียดเพิ่มเติม
พิจารณาการกำหนดค่าด้านล่าง:
{
"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
การดำเนินการเพื่อให้แอปพลิเคชันสามารถเขียนหรือลบวัตถุใด ๆ ในที่เก็บข้อมูล
การแยกออกเป็นสอง 'arns' ที่แตกต่างกันมีความสำคัญจากเหตุผลด้านความปลอดภัยเพื่อระบุสิทธิ์แบบละเอียดระดับที่เก็บข้อมูลและระดับออบเจ็กต์
สังเกตว่าถ้าฉันจะระบุGetObject
ในบล็อกที่ 2 สิ่งที่จะเกิดขึ้นคือในกรณีของการเข้าถึงแบบเป็นโปรแกรมฉันจะได้รับข้อผิดพลาดเช่น:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
.
aws
สำหรับผู้ใช้รายหนึ่งและใช้มันภายในสคริปต์ bash ที่เรียกว่า cronjob จากผู้ใช้รายอื่นซึ่งหมายความว่าคีย์การเข้าถึงและโทเค็นการเข้าถึงไม่ถูกต้อง / ไม่ได้ตั้งค่า วิธีการแก้ปัญหาของฉันคือการโดยตรงใส่ข้อมูลประจำตัว (AWS_ACCESS_KEY_ID
และAWS_SECRET_ACCESS_KEY
) ลงในไฟล์สคริปต์ทุบตีฉันตามที่อธิบายไว้ที่นี่