
與本文[0]中描述的類似,我工作的公司使用堡壘AWS帳戶來儲存IAM用戶和其他AWS帳戶來分隔不同的運作環境(生產、開發等)。這很重要的原因是我們有多個 AWS 帳戶,並且在某些特殊情況下這些 AWS 帳戶需要存取單一 S3 儲存桶。
使其正常運作的一種方法是設定儲存桶策略,允許特定 AWS 帳戶的 VPC 從 S3 終端節點存取儲存桶。
儲存桶策略
data-warehouse
{ "Sid": "access-from-dev-VPCE", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::data-warehouse", "arn:aws:s3:::data-warehouse/*" ], "Condition": { "StringEquals": { "aws:sourceVpce": "vpce-d95b05b0" } } }
角色的角色策略
EMRRole
{ "Sid": "AllowRoleToListBucket", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::data-warehouse", ] }, { "Sid": "AllowRoleToGetBucketObjects", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::data-warehouse/*" }
不幸的是,除非我明確設定 ACL,否則這不起作用每個對象允許我存取的 AWS 帳戶的擁有者完全控制該物件。如果我不這樣做,我會得到:
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
我正在運行的實例 (EMR) 具有正確的角色:
[hadoop@ip-10-137-221-91 tmp]$ aws sts get-caller-identity
{
"Account": "1234567890",
"UserId": "AROAIGVIL6ZDI6SR87KXO:i-0eaf8a5ca52876835",
"Arn": "arn:aws:sts::1234567890:assumed-role/EMRRole/i-0eaf8a5ca52876835"
}
儲存桶中物件的 ACLdata-warehouse
如下所示:
aws s3api get-object-acl --bucket=data-warehouse --key=content_category/build=2017-11-23/part0000.gz.parquet
{
"Owner": {
"DisplayName": "aws+dev",
"ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
},
"Grants": [
{
"Grantee": {
"Type": "CanonicalUser",
"DisplayName": "aws+dev",
"ID": "YXJzdGFyc3RhcnRzadc6frYXJzdGFyc3RhcnN0"
},
"Permission": "FULL_CONTROL"
}
]
}
在上面的 ACL 中,dev
AWS 帳戶將能夠讀取該對象,但另一個 AWS 帳戶(例如prod
)將能夠讀取該物件。不是能夠讀取該對象,直到他們被添加為“受讓人”。
我的問題:有沒有辦法從多個 AWS 帳戶向 S3 儲存桶讀取/寫入對象,而無需在每個單獨的對像上設定 ACL?
注意:我們使用spark使用s3a寫入s3。
答案1
雖然我還沒有找到針對每個物件設定 ACL 的方法,但有一種方法可以強制使用儲存桶策略在上傳時正確設定 ACL。此範例策略顯示如何允許 AWS 帳戶將物件上傳到您的儲存桶,並要求儲存桶擁有者被授予對所有上傳物件的完全控制權:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSourceAccount0123456789ToPutObjects",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::0123456789:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::data-warehouse/*"
},
{
"Sid": "RequireAllUploadedObjectsToAssignFullControlToBucketOwner",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::data-warehouse/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
關鍵是明確拒絕,它會檢查x-amz-acl: bucket-owner-full-control
標頭(Michael-sqlbot 在評論中提到),並在未設定標頭的情況下使任何上傳失敗。使用 AWS CLI 上傳檔案時,需要--acl 儲存桶擁有者完全控制要設置的標誌。
例子:
aws s3 cp example-file.txt s3://data-warehouse/example-file.txt --profile aws-profile-name --acl bucket-owner-full-control
希望 AWS 在某個時候能夠提供一種更優雅地處理 ACL 的方法。