Я новичок в AWS CloudFormation, и я пытаюсь выяснить некоторые ранее существовавшие CloudSormation JSON. Я читал документацию много раз, но, похоже, у меня больше вопросов, чем ответов.Политика AWS CloudFormation IAM и политика SQS, похоже, имеют аналогичные настройки, но не уверены, почему?
Ниже приведена модифицированная версия моего файла CloudFormation. Я попытался вырезать как можно больше из примера CloudFormation, чтобы, надеюсь, уменьшить визуальный шум. Я ценю, что читатели не будут знать причины, по которым делаются определенные вещи, но я надеюсь, что мои вопросы (см. Ниже) осветят более фундаментальную проблему с тем, как CF был написан.
CF JSON создает очередь SQS, политику очереди SQS и политику IAM.
Политика очереди SQS обеспечивает полный доступ к API в очередь SQS (также ограничивает доступ к определенным IP-адресам через условие) и, как представляется, назначает эти разрешения самой очереди.
Но у нас также есть политика IAM, которая, похоже, делает подобную вещь? Он назначает определенные разрешения очереди SQS, но на этот раз для роли, а не для самой очереди, как, например, для политики очередей SQS.
Мой вопрос, почему дублирование? Могли бы мы просто не иметь разрешения доступа, применяемые к политике очереди SQS, и просто удалить политику IAM «QueuesPolicy»?
Я могу понять, почему политика 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"
]
}
}
]
}
}
}
}
}
Кажется, что блок 'Statement' * должен иметь ключ' Action', который объясняет, почему в политике очереди SQS он включил то, что кажется дубликатом действий. НО кто-то вчера объяснил мне, что «Условие» эффективно говорит «ограничивает доступ к ресурсу очереди SQS этим наборам ips и позволяет этим ips иметь полный доступ» – Integralist