我有一个 AWS S3 已经与所有实例关联,以获得对所有 S3 存储桶的读取权限。现在,我需要向写入权限(Put 对象)的角色添加一个策略,以便其中一些实例可以对 S3 中的某些文件夹具有写入权限。有没有办法通过实例标签(对我来说更好的选择)或实例 ID 来实现它。
我尝试添加 IAM 策略,但在设置条件时,我的实例未获得所需的权限。
我使用的 IAM 策略是:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1456567757624",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::testbucket/testfolder1/*",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:ec2:eu-west-1:<accountno>:instance/<instanceid1>"
}
}
},
{
"Sid": "Stmt1456567757625",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::testbucket/testfolder2/*",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:ec2:eu-west-1:<accountno>:instance/<instanceid2>"
}
}
}
]
}
下面是一种替代方法,基于根据角色名称授予对 S3 资源的访问权限...
不要使用aws:SourceArn
,而是使用aws:userid
!
可用于策略变量的请求信息文档有一个表,其中显示了各种aws:userid
值,包括:
对于分配给 Amazon EC2 实例的角色,它设置为
role-id:ec2-instance-id
因此,您可以使用用于启动 Amazon EC2 实例的角色的角色 ID 或实例 ID 来允许访问。
例如,这个基于角色 ID:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SID123",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"*"
],
"Condition": {
"StringLike": {
"aws:userid": [
"AROAIIPEUJOUGITIU5BB6*"
]
}
}
}
]
}
当然,如果要根据角色 ID 分配权限,则可以轻松地在角色本身中授予权限。
这个基于实例 ID:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SID123",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"*"
],
"Condition": {
"StringLike": {
"aws:userid": [
"*:i-03c9a5f3fae4b630a"
]
}
}
}
]
}
实例 ID 将保留在实例中,但如果启动新实例,即使从同一 Amazon 系统映像 (AMI) 启动,也会分配一个新实例 ID。
IAM 策略元素参考文档说:
aws:SourceArn
– 使用源的 Amazon 资源名称 (ARN) 检查请求的来源。(此值仅适用于某些服务。
但是,该文档没有说明哪些服务可以使用它。
有一些示例可用于 SQS 和 SNS,使用 Amazon S3 存储桶的源ARN,以及将源ARN与 Lambda 一起使用。但是,Amazon EC2 似乎不支持它。