2014-09-01 68 views
1

我是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" 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

似乎'Statement'塊*必須*有一個'Action'關鍵,這可以解釋爲什麼在SQS隊列策略它包含的內容似乎是操作的副本。但昨天有人向我解釋說,「Condition」實際上是說「限制對SQS隊列資源的訪問權限給這些IPS,讓這些IPS擁有完全訪問權限」 – Integralist 2014-09-02 08:44:32

回答

1

我會盡量按順序排列您的問題,但請首先對此代碼段進行一般性解釋。這可能是基於AWS的應用程序的模板,該應用程序將在與代碼片段中的角色關聯的實例配置文件下運行,並將使用SQS與已知IP範圍中的某個離線雲系統進行集成。據推測,它將被更新爲使用SDK,但顯然無法像通過元數據端點一樣容易地獲得臨時證書。

  1. 隊列策略和IAM策略資源引用同一個隊列,但它們似乎不是多餘的。一個用於匿名用戶(IAM策略無法完成),另一個用於您的EC2實例。

  2. 您可以擴展隊列策略以涵蓋兩個明顯需求,但我個人更喜歡以委託人爲中心的IAM策略。同樣,我會使用傳統的S3控制選項,例如,只有當您不能使用IAM策略時。但除非您必須使用資源綁定策略,否則它主要是一種偏好。