AWS S3 bucket設定object可被公開讀取。
下面兩種方法皆要關閉Block all public access及設定Object Ownership ACLs enabled:
事前要求
參考「AWS 建立S3 bucket並上傳檔案」建立S3 bucket s3-demo-bucket-202112151320
並上傳hello.txt
。
在未設定object的公開讀取權限時,用瀏覽器無痕模式開啟hello.txt
的object URL會得到Access Denied沒有權限讀取內容。
關閉Block all public access
Bucket內的object要能空開讀取必須關閉bucket的[Block all public access]。
前往bucket的[Permissions]頁籤。
點選[Block public access(bucket settings)]的[Edit]。
取消勾選[Block all public access]然後按最下面的[Save changes]儲存。
取消[Block all public access]則bucket可被任何人透過網路存取,所以跳出確認提示。輸入"confirm"按[Confirm]確定。
確認後可看到bucket多了[Publicly accessible]的警示。
不過仍需設定bucket的[Object Ownership]為[ACLs enabled]及設定object的ACL [Everyone(public access)]為[Read]公開讀取權限或設定policy讀取權限才可被任何人讀取。
設定Object Ownership ACLs enabled
在bucket [Permissions]頁籤下找到[Object Ownership]點選[Edit]。
把[Object Owndership]修改為[ACLs enabled]並勾選[I acknowledge that ACLs will be enabled]。
勾選[Bucket owner prefered],意思是object上傳時若指名bucket-owner-full-control-canned ACL則控制權歸屬bucket owner,否則為object writer上傳檔案的人。
方法ㄧ - 設定Object ACL
在要公開讀取的object的[Permission]頁籤的[Access control list(ACL)]點選[Edit]。
勾選[Everyone(public access)]的[Read]。
勾選[I understand the effects of these changes on this object]。按最下面的[Save changes]儲存。
回到object的[Permissions]頁籤可看到[Everyone(public access)]變成[Read]。
方法二 - 設定Bucket policy
此為官方建議的方式,利用policy允許擁有特定tag的object可公開讀取。
在hello.txt
設定一個tag key=public
,,value=yes
。
然後在bucket的[Permissions]標籤的[Bucket policy]設定以下policy statement,意思為:「定義一個名為PublicGetObject
的statement來允許所有principle讀取S3資源arn:aws:s3:::s3-demo-bucket-202112151320/*
中objects有tag public:yes
的請求。」
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::s3-demo-bucket-202112151320/*",
"Condition": {
"StringEquals": {
"s3:ExistingObjectTag/public": "yes"
}
}
}
]
}
測試
完成以上任一方法的設定後用Chrome無痕模式貼上object的URL即可看到內容。
沒有留言:
張貼留言