我是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"
]
}
}
]
}
}
}
}
}
答案 0 :(得分:1)
我会尝试按顺序提出您的问题,但首先要对此代码段进行一般性解释。这可能是基于AWS的应用程序的模板,该应用程序将在与代码段中的角色关联的实例配置文件下运行,并将使用SQS与已知IP范围内的某些脱云系统集成。据推测,它会更新以使用SDK,但显然无法像通过元数据端点那样轻松获取临时凭证。
队列策略和IAM策略资源引用相同的队列,但它们看起来并不冗余。匿名用户(IAM政策无法完成),另一个用于您的EC2实例。
您可以扩展队列策略以涵盖两种明显需求,但我个人更喜欢以主体为中心的IAM策略。同样,我也会使用旧版S3控制选项,例如,只有在您无法使用IAM策略时。但它主要是一种偏好,除非你必须使用与资源相关的政策。