在 CloudFormation 中将多个 IAM 角色与 AWS::IAM::InstanceProfile 相关联
Associating multiple IAM role with AWS::IAM::InstanceProfile in CloudFormation
我有一个 CloudFormation 模板可以调出一个自动缩放组。它具有以下实例配置文件以及关联的角色和策略。有没有办法将现有的 IAM 角色也添加到 InstanceProfile? AWS 文档似乎说不:
Currently, a maximum of one role can be assigned to an instance profile.
基本上我想在模板中保留以下角色和策略创建,以便策略可以引用 SQS 资源(即 "Resource": [{ "Fn::GetAtt" : ["LifecycleSQS", "Arn"] }]) 由模板创建,同时还分配一个预先存在的角色,该角色将为实例上的应用程序授予权限。我不想在 CloudFormation 模板中创建这些特定于应用程序的权限。
"InstanceRole":{
"Type":"AWS::IAM::Role",
"Properties":{
"AssumeRolePolicyDocument":{
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":[
"autoscaling.amazonaws.com"
]
},
"Action":[
"sts:AssumeRole"
]
}
]
},
"Path":"/"
}
},
"RolePolicies":{
"Type":"AWS::IAM::Policy",
"Properties":{
"PolicyName": "MyRolePolicy,
"PolicyDocument":{
"Statement":[
{
"Effect": "Allow",
"Resource": [{ "Fn::GetAtt" : ["LifecycleSQS", "Arn"] }],
"Action": [
"sqs:SendMessage",
"sqs:GetQueueUrl",
"sns:Publish"
]
}
]
},
"Roles":[
{
"Ref":"InstanceRole"
}
]
}
},
"InstanceProfile":{
"Type":"AWS::IAM::InstanceProfile",
"Properties":{
"Path":"/",
"Roles":[
{
"Ref":"InstanceRole"
}
]
}
}
没错,Roles in an instance profile 限制为 1。你无法绕过这个。
我发现如果您创建离散的策略然后将其应用于给定的实例角色,那么限制就更少了。
例如,我有一个 ApplicationServer 实例角色。然后我可以创建以下策略并将其附加到该角色:CodeDeployInstance(允许该实例接受代码部署),DomainJoinInstance(允许加入域的实例)和 AppCredentialsInstance(允许实例通过安全的 S3 存储桶访问应用凭证)。通过这种方式,您最多可以将 10 个策略附加到角色。
您可以在 CF 模板之外创建这些策略,并将它们应用到实例 Role/Instance 配置文件 as/when 需要。
我以这种方式定义我的所有实例:一个特定的角色名称,然后 add/subtract/combine 我自己的 pre-defined 根据需要针对任何角色的策略。
这些更改会立即被 运行 实例识别,需要重新启动或重新启动。
希望对您有所帮助。
我有一个 CloudFormation 模板可以调出一个自动缩放组。它具有以下实例配置文件以及关联的角色和策略。有没有办法将现有的 IAM 角色也添加到 InstanceProfile? AWS 文档似乎说不:
Currently, a maximum of one role can be assigned to an instance profile.
基本上我想在模板中保留以下角色和策略创建,以便策略可以引用 SQS 资源(即 "Resource": [{ "Fn::GetAtt" : ["LifecycleSQS", "Arn"] }]) 由模板创建,同时还分配一个预先存在的角色,该角色将为实例上的应用程序授予权限。我不想在 CloudFormation 模板中创建这些特定于应用程序的权限。
"InstanceRole":{
"Type":"AWS::IAM::Role",
"Properties":{
"AssumeRolePolicyDocument":{
"Statement":[
{
"Effect":"Allow",
"Principal":{
"Service":[
"autoscaling.amazonaws.com"
]
},
"Action":[
"sts:AssumeRole"
]
}
]
},
"Path":"/"
}
},
"RolePolicies":{
"Type":"AWS::IAM::Policy",
"Properties":{
"PolicyName": "MyRolePolicy,
"PolicyDocument":{
"Statement":[
{
"Effect": "Allow",
"Resource": [{ "Fn::GetAtt" : ["LifecycleSQS", "Arn"] }],
"Action": [
"sqs:SendMessage",
"sqs:GetQueueUrl",
"sns:Publish"
]
}
]
},
"Roles":[
{
"Ref":"InstanceRole"
}
]
}
},
"InstanceProfile":{
"Type":"AWS::IAM::InstanceProfile",
"Properties":{
"Path":"/",
"Roles":[
{
"Ref":"InstanceRole"
}
]
}
}
没错,Roles in an instance profile 限制为 1。你无法绕过这个。
我发现如果您创建离散的策略然后将其应用于给定的实例角色,那么限制就更少了。
例如,我有一个 ApplicationServer 实例角色。然后我可以创建以下策略并将其附加到该角色:CodeDeployInstance(允许该实例接受代码部署),DomainJoinInstance(允许加入域的实例)和 AppCredentialsInstance(允许实例通过安全的 S3 存储桶访问应用凭证)。通过这种方式,您最多可以将 10 个策略附加到角色。
您可以在 CF 模板之外创建这些策略,并将它们应用到实例 Role/Instance 配置文件 as/when 需要。
我以这种方式定义我的所有实例:一个特定的角色名称,然后 add/subtract/combine 我自己的 pre-defined 根据需要针对任何角色的策略。
这些更改会立即被 运行 实例识别,需要重新启动或重新启动。
希望对您有所帮助。