我是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