AWS CloudFormation IAM策略和SQS策略似乎有类似的设置,但不确定为什么?

时间:2014-09-01 16:36:19

标签: amazon-web-services amazon-sqs amazon-cloudformation

我是AWS CloudFormation的新手,我试图找出一些预先存在的CloudFormation JSON。我已多次阅读文档,但我似乎最终得到的问题多于答案。

  

以下是我的CloudFormation文件的修改版本。我试图尽可能地从CloudFormation示例中删除,以期有望减少视觉噪音。我感谢读者不知道为什么某些事情已经完成的原因,但是我希望我的问题(下文)将突出显示关于如何编写CF的更基本的问题。

CF JSON创建SQS队列,SQS队列策略和IAM策略。

SQS队列策略允许对SQS队列进行完整的API访问(它还限制通过条件访问某些IP地址),并且似乎将这些权限分配给队列本身。

但我们也有一个IAM政策似乎做了类似的事情?它分配特定的SQS队列权限,但这次是一个角色而不是像SQS队列策略那样的队列本身。

我的问题是为什么重复?我们不仅可以将访问权限应用于SQS队列策略,而且只需删除" QueuesPolicy" IAM政策?

我可以理解为什么IAM政策" QueuesPolicy"将设置SQS队列访问权限:因为您可以有多个角色访问单个队列,并且您希望它们具有不同的权限集(而不是队列具有所有角色的具体权限集)。但如果是这样的话那么为什么还要在队列上设置权限呢?这看起来像是一个错误还是被用作某种"后备"?

我还假设我们可以保留SQS队列策略,但只是删除API权限并保留限制自己对某些IP地址的访问权限的能力。这会在这个例子中起作用吗?

此外,AWS :: IAM :: Role让我感到困惑,因为我并不确定我理解它在做什么。它似乎表明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"
                ]
              }
            }
          ]
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

我会尝试按顺序提出您的问题,但首先要对此代码段进行一般性解释。这可能是基于AWS的应用程序的模板,该应用程序将在与代码段中的角色关联的实例配置文件下运行,并将使用SQS与已知IP范围内的某些脱云系统集成。据推测,它会更新以使用SDK,但显然无法像通过元数据端点那样轻松获取临时凭证。

  1. 队列策略和IAM策略资源引用相同的队列,但它们看起来并不冗余。匿名用户(IAM政策无法完成),另一个用于您的EC2实例。

  2. 您可以扩展队列策略以涵盖两种明显需求,但我个人更喜欢以主体为中心的IAM策略。同样,我也会使用旧版S3控制选项,例如,只有在您无法使用IAM策略时。但它主要是一种偏好,除非你必须使用与资源相关的政策。