我是AWS CloudFormation的新手,我试图找出一些预先存在的CloudFormation JSON。我已经多次阅读过这些文档,但我似乎最终得到的答案比答案还要多。AWS CloudFormation IAM策略和SQS策略似乎有类似的设置,但不知道为什么?
下面是我的CloudFormation文件的修改版本。我试图尽可能地从CloudFormation示例中去除,以期望减少视觉噪音。我很感谢读者不知道为什么某些事情已经完成的原因,但我希望我的问题(下文)会突出CF如何写出更基本的问题。
CF JSON创建一个SQS队列,一个SQS队列策略和一个IAM策略。
的SQS队列策略允许的SQS队列(这也限制了通过条件访问特定的IP地址)完整的API访问,似乎这些权限分配给队列本身。
但我们也有这似乎做类似的事情的IAM策略?它分配特定的SQS队列权限,但这次是分配给一个角色,而不是像队列本身一样,像SQS队列策略似乎正在做的那样。
我的问题是为什么重复?我们是否可以将访问权限应用于SQS队列策略并只删除“QueuesPolicy”IAM策略?
我可以理解为什么IAM策略“QueuesPolicy”会设置SQS队列访问权限:因为您可以让多个角色访问单个队列并且希望他们拥有一组不同的权限(而不是Queue所有角色的一组具体权限)。但是,如果是这样的话,为什么还要在队列上设置权限?这看起来像是一个错误还是用作某种“后备”?
我也认为我们能保持SQS队列策略,但只是删除API权限,并保持以限制其自身的访问某些IP地址的能力。这个例子能起作用吗?
此外,AWS :: IAM ::角色混淆了我,因为我真的不知道我的理解它在做什么。似乎表明EC2实例将有能力承担FooRole
,这是否正确?我想,因为我们有一组AWS凭证,即在EC2实例中运行的应用程序可能使用的凭据,以获得我们的AWS账户的访问,但因为没有单独的“用户”,我们将需要有一个角色创建并且EC2实例有权访问该角色以获得授权请求(例如从应用程序向队列发送消息)?
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"EC2ComponentPolicy": {
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "EC2ComponentPolicy",
"PolicyDocument": {
"Statement": [
{
"Action": [
"cloudformation:Describe*"
],
"Resource": [
"*"
],
"Effect": "Allow"
},
{
"Action": [
"ec2:Describe*"
],
"Resource": [
"*"
],
"Effect": "Allow"
}
]
},
"Roles": [
{
"Ref": "FooRole"
}
]
}
},
"SQSFooQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"MessageRetentionPeriod": 86400,
"VisibilityTimeout": {
"Ref": "VisibilityTimeout"
}
}
},
"ComponentInstanceProfile": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"Path": "/",
"Roles": [
{
"Ref": "FooRole"
}
]
}
},
"SQSFooQueuePolicy": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"Queues": [
{
"Ref": "SQSFooQueue"
}
],
"PolicyDocument": {
"Version": "2012-10-17",
"Id": "SQSFooQueuePolicy",
"Statement": [
{
"Resource": [
{
"Fn::GetAtt": [
"SQSFooQueue",
"Arn"
]
}
],
"Effect": "Allow",
"Sid": "Allow-User-SendMessage",
"Action": [
"sqs:*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"xxx.xx.xxx.x/xx",
"xxx.xx.xxx.x/xx",
"xxx.xx.xxx.x/xx"
]
}
},
"Principal": {
"AWS": "*"
}
}
]
}
}
},
"QueuesPolicy": {
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "QueuesPolicy",
"PolicyDocument": {
"Statement": [
{
"Action": [
"sqs:AddPermission",
"sqs:ChangeMessageVisibility",
"sqs:ChangeMessageVisibilityBatch",
"sqs:CreateQueue",
"sqs:DeleteMessage",
"sqs:DeleteMessageBatch",
"sqs:DeleteQueue",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl",
"sqs:ListQueues",
"sqs:ListDeadLetterSourceQueues",
"sqs:ReceiveMessage",
"sqs:RemovePermission",
"sqs:SendMessage",
"sqs:SendMessageBatch",
"sqs:SetQueueAttributes"
],
"Resource": [
{
"Fn::GetAtt": [
"SQSFooQueue",
"Arn"
]
}
],
"Effect": "Allow"
}
]
},
"Roles": [
{
"Ref": "FooRole"
}
]
}
},
"FooRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"Path": "/",
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Effect": "Allow",
"Principal": {
"Service": [
"ec2.amazonaws.com"
]
}
}
]
}
}
}
}
}
似乎'Statement'块*必须*有一个'Action'关键,这可以解释为什么在SQS队列策略它包含的内容似乎是操作的副本。但昨天有人向我解释说,“Condition”实际上是说“限制对SQS队列资源的访问权限给这些IPS,让这些IPS拥有完全访问权限” – Integralist 2014-09-02 08:44:32