Automatize as mensagens do Amazon SNS para o Amazon SQS com AWS CloudFormation
O CloudFormation permite que você use um arquivo de modelo para criar e configurar um conjunto de recursos da AWS como uma unidade única. Esta seção tem um modelo de exemplo que facilita a implantação de tópicos que publicam em filas. Os modelos processam as etapas de configuração para você, criando duas filas, criando um tópico com inscrições das filas, adicionando uma política às filas para que o tópico possa enviar mensagens para as filas e criando usuários e grupos do IAM para controlar o acesso a esses recursos.
Para obter mais informações sobre a implantação de recursos da AWS usando um modelo do CloudFormation, consulte Get Started (“Conceitos básicos”) no Manual do usuário do CloudFormation.
Uso de um modelo do CloudFormation para definir tópicos e filas dentro de uma Conta da AWS
O modelo de exemplo cria um tópico do Amazon SNS que pode enviar mensagens para duas filas do Amazon SQS com as permissões adequadas para que os membros de um grupo do IAM publiquem no tópico e os membros do outro leiam mensagens das filas. O modelo também cria usuários do IAM que são adicionados a cada grupo.
Copie o conteúdo do modelo em um arquivo. Também é possível fazer download do modelo na página Modelos do AWS CloudFormation
MySNSTopic está configurado para publicar dois endpoints inscritos, que são duas filas do Amazon SQS (MyQueue1 e MyQueue2). MyPublishTopicGroup é um grupo do IAM cujos membros têm permissão para publicar no MySNSTopic usando a ação da API Publish ou o comando sns-publish. O modelo cria os usuários do IAM MyQueueUser e MyPublishUser e oferece a eles perfis de login e chaves de acesso. O usuário que cria uma pilha com esse modelo especifica as senhas para os perfis de login como parâmetros de entrada. O modelo cria chaves de acesso para os dois usuários do IAM com MyQueueUserKey e MyPublishUserKey. AddUserToMyPublishTopicGroup adiciona MyPublishUser ao MyPublishTopicGroup para que o usuário tenha as permissões atribuídas ao grupo.
MyRDMessageQueueGroup é um grupo do IAM cujos membros têm permissão para ler e excluir mensagens das duas filas do Amazon SQS usando as ações da API ReceiveMessage e DeleteMessage. AddUserToMyQueueGroup adiciona MyQueueUser ao MyRDMessageQueueGroup para que o usuário tenha as permissões atribuídas ao grupo. MyQueuePolicy concede permissão para MySNSTopic publicar suas notificações nas duas filas.
A listagem a seguir mostra o conteúdo de modelos do CloudFormation.
{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "AWS CloudFormation Sample Template SNSToSQS: This Template creates an SNS topic that can send messages to two SQS queues with appropriate permissions for one IAM user to publish to the topic and another to read messages from the queues. MySNSTopic is set up to publish to two subscribed endpoints, which are two SQS queues (MyQueue1 and MyQueue2). MyPublishUser is an IAM user that can publish to MySNSTopic using the Publish API. MyTopicPolicy assigns that permission to MyPublishUser. MyQueueUser is an IAM user that can read messages from the two SQS queues. MyQueuePolicy assigns those permissions to MyQueueUser. It also assigns permission for MySNSTopic to publish its notifications to the two queues. The template creates access keys for the two IAM users with MyPublishUserKey and MyQueueUserKey. ***Warning*** you will be billed for the AWS resources used if you create a stack from this template.", "Parameters": { "MyPublishUserPassword": { "NoEcho": "true", "Type": "String", "Description": "Password for the IAM user MyPublishUser", "MinLength": "1", "MaxLength": "41", "AllowedPattern": "[a-zA-Z0-9]*", "ConstraintDescription": "must contain only alphanumeric characters." }, "MyQueueUserPassword": { "NoEcho": "true", "Type": "String", "Description": "Password for the IAM user MyQueueUser", "MinLength": "1", "MaxLength": "41", "AllowedPattern": "[a-zA-Z0-9]*", "ConstraintDescription": "must contain only alphanumeric characters." } }, "Resources": { "MySNSTopic": { "Type": "AWS::SNS::Topic", "Properties": { "Subscription": [{ "Endpoint": { "Fn::GetAtt": ["MyQueue1", "Arn"] }, "Protocol": "sqs" }, { "Endpoint": { "Fn::GetAtt": ["MyQueue2", "Arn"] }, "Protocol": "sqs" } ] } }, "MyQueue1": { "Type": "AWS::SQS::Queue" }, "MyQueue2": { "Type": "AWS::SQS::Queue" }, "MyPublishUser": { "Type": "AWS::IAM::User", "Properties": { "LoginProfile": { "Password": { "Ref": "MyPublishUserPassword" } } } }, "MyPublishUserKey": { "Type": "AWS::IAM::AccessKey", "Properties": { "UserName": { "Ref": "MyPublishUser" } } }, "MyPublishTopicGroup": { "Type": "AWS::IAM::Group", "Properties": { "Policies": [{ "PolicyName": "MyTopicGroupPolicy", "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Action": [ "sns:Publish" ], "Resource": { "Ref": "MySNSTopic" } }] } }] } }, "AddUserToMyPublishTopicGroup": { "Type": "AWS::IAM::UserToGroupAddition", "Properties": { "GroupName": { "Ref": "MyPublishTopicGroup" }, "Users": [{ "Ref": "MyPublishUser" }] } }, "MyQueueUser": { "Type": "AWS::IAM::User", "Properties": { "LoginProfile": { "Password": { "Ref": "MyQueueUserPassword" } } } }, "MyQueueUserKey": { "Type": "AWS::IAM::AccessKey", "Properties": { "UserName": { "Ref": "MyQueueUser" } } }, "MyRDMessageQueueGroup": { "Type": "AWS::IAM::Group", "Properties": { "Policies": [{ "PolicyName": "MyQueueGroupPolicy", "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage" ], "Resource": [{ "Fn::GetAtt": ["MyQueue1", "Arn"] }, { "Fn::GetAtt": ["MyQueue2", "Arn"] } ] }] } }] } }, "AddUserToMyQueueGroup": { "Type": "AWS::IAM::UserToGroupAddition", "Properties": { "GroupName": { "Ref": "MyRDMessageQueueGroup" }, "Users": [{ "Ref": "MyQueueUser" }] } }, "MyQueuePolicy": { "Type": "AWS::SQS::QueuePolicy", "Properties": { "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": ["sqs:SendMessage"], "Resource": "*", "Condition": { "ArnEquals": { "aws:SourceArn": { "Ref": "MySNSTopic" } } } }] }, "Queues": [{ "Ref": "MyQueue1" }, { "Ref": "MyQueue2" }] } } }, "Outputs": { "MySNSTopicTopicARN": { "Value": { "Ref": "MySNSTopic" } }, "MyQueue1Info": { "Value": { "Fn::Join": [ " ", [ "ARN:", { "Fn::GetAtt": ["MyQueue1", "Arn"] }, "URL:", { "Ref": "MyQueue1" } ] ] } }, "MyQueue2Info": { "Value": { "Fn::Join": [ " ", [ "ARN:", { "Fn::GetAtt": ["MyQueue2", "Arn"] }, "URL:", { "Ref": "MyQueue2" } ] ] } }, "MyPublishUserInfo": { "Value": { "Fn::Join": [ " ", [ "ARN:", { "Fn::GetAtt": ["MyPublishUser", "Arn"] }, "Access Key:", { "Ref": "MyPublishUserKey" }, "Secret Key:", { "Fn::GetAtt": ["MyPublishUserKey", "SecretAccessKey"] } ] ] } }, "MyQueueUserInfo": { "Value": { "Fn::Join": [ " ", [ "ARN:", { "Fn::GetAtt": ["MyQueueUser", "Arn"] }, "Access Key:", { "Ref": "MyQueueUserKey" }, "Secret Key:", { "Fn::GetAtt": ["MyQueueUserKey", "SecretAccessKey"] } ] ] } } } }