我已成功创建了用户,凭据和存储桶 现在我需要向该用户授予存储桶访问权限。
有没有办法从代码中获取此CanonicalUser值?
IAM用户对象仅提供ARN,Path,UserId和UserName值,但这些值均不适用于授权。
using (var s3 = new Amazon.S3.AmazonS3Client("[user_key]", "[secret_user_key]", RegionEndpoint.GetBySystemName("eu-west-1")))
{
var response = s3.GetACL("[bucket_id]");
var acl = response.AccessControlList;
acl.AddGrant(
new S3Grantee() {
CanonicalUser = **???**
},
new S3Permission(S3Permission.FULL_CONTROL)
);
s3.PutACL(
new PutACLRequest() {
AccessControlList = acl,
BucketName = "[bucket_id]"
}
);
}
答案 0 :(得分:3)
您可以使用ListAllMyBuckets API调用[1]轻松获取CanonicalUser ID(s3:需要ListAllMyBuckets权限):
[('uid', 'aaa'), ('sid', 'bbb'), ('bid', 'ccc'), ('cid', 'ddd'), ('pid', 'eee'), ('uid', 'aaa2'), ('sid', 'bbb2'), ('bid', 'ccc2'), ('cid', 'ddd2'), ('pid', 'eee2')]
在AWS SDK for .NET中,使用类似[2]的代码:
$ aws s3api list-buckets --query Owner
{
"DisplayName": "lord-vader",
"ID": "f420064cb076f772e10584fc40ab777c09f6b7d154342cf358f1bd1e573c9cf7"
}
在AWSJavaSDK中,您可以使用AmazonS3.getS3AccountOwner包装器方法[3]。
答案 1 :(得分:2)
不,从代码中获取规范用户ID是不可能的 - 由于manage access permissions for S3 resources的方式不同,您已经遇到了一些奇怪且可能遗留的方面,请参阅AWS团队对{{3}的回复}}:
您无法将IAM用户作为受助者添加到ACL。我将更新文档以阐明ACL中不支持IAM用户。您可以使用一些解决方案授予此用户访问您的Amazon S3内容的权限:[...]
您可能确实想重新考虑使用更通用的How to find out Canonical ID for an IAM user?(请参阅下文) - 但是,如果您有权访问帐户的根凭据,则可能找到与您的AWS关联的规范用户ID S3 bucket policies中概述的帐户(请注意,这不适用于IAM用户凭据):
- 转到Specifying a Principal in a Policy,然后从我的帐户/控制台下拉菜单中选择安全凭据。
- 使用适当的帐户凭据登录。
- 点击帐户标识符。
醇>
我将再次强调,AWS强烈建议最近仅使用IAM用户,请参阅例如http://aws.amazon.com:
因为您无法控制root帐户的权限 凭证,您应该将它们存储在安全的地方,而不是使用AWS 用于日常的身份和访问管理(IAM)用户凭据 与AWS的互动。
S3的规范用户ID要求是一个罕见的例外,正如我所说,由于S3的ACL层早于IAM,可能会被视为遗留工件,因此如果可能,最好避免使用。