Comment créer un abonnement entre ma file d'attente Amazon SQS et une rubrique Amazon SNS dans AWS CloudFormation ?
Date de la dernière mise à jour : 02/10/2019
Comment créer un abonnement entre ma file d'attente Amazon Simple Queue Service (Amazon SQS) et une rubrique Amazon Simple Notification Service (Amazon SNS) dans AWS CloudFormation ?
Solution
Choisissez l'une des solutions suivantes en fonction de votre cas d'utilisation :
- Si la rubrique SNS et la file d'attente SQS se trouvent dans la même pile, utilisez un modèle AWS CloudFormation pour créer une rubrique qui envoie des messages aux files d'attente SQS.
- Si la rubrique SNS se trouve dans une pile et que la file d'attente SQS qui doit s'abonner à la rubrique SNS se trouve dans une autre pile au sein de la même région AWS, créez une référence entre piles.
Remarque : lorsque vous créez une référence entre piles, exportez le nom Amazon Resource Name (ARN) de la file d'attente SQS dans une pile. Importez ensuite ce nom ARN de file d'attente SQS dans la propriété de point de terminaison d'abonnement de la rubrique SNS dans l'autre pile. - Si la rubrique SNS et la file d'attente SQS se trouvent dans des régions AWS différentes, suivez les étapes reprises dans la section Utiliser la ressource AWS::SNS::Subscription pour configurer un abonnement inter-région.
- Si la rubrique SNS et la file d'attente SQS se trouvent dans des comptes AWS différents, suivez les étapes reprises dans la section Utiliser la ressource AWS::SNS::Subscription pour configurer un abonnement inter-comptes.
Utilisation de la ressource AWS::SNS::Subscription pour configurer un abonnement inter-région
1. Dans le modèle AWS CloudFormation de la pile dans une région AWS, déclarez la rubrique SNS dans cette région, puis créez une ressource de sortie pour annoter le nom ARN de la rubrique SNS.
Reportez-vous aux exemples de modèles JSON et YAML suivants.
JSON :
{
"Resources": {
"SnsTopic": {
"Type": "AWS::SNS::Topic"
}
},
"Outputs": {
"SnsTopicArn": {
"Value": "SnsTopic"
}
}
}
YAML :
Resources:
SnsTopic:
Type: AWS::SNS::Topic
Outputs:
SnsTopicArn:
Value: !Ref SnsTopic
2. Dans un modèle AWS CloudFormation de l'autre pile dans l'autre région AWS, définissez la ressource AWS::SNS::Subscription et la file d'attente SQS.
Remarque : remplacez awsSNSTopicArnExample par le nom ARN de votre rubrique SNS, et us-east-1 par votre région AWS.
Reportez-vous aux exemples de modèles JSON et YAML suivants.
JSON :
{
"Parameters": {
"SNSTopicARN": {
"Type": "String",
"Description": "awsSNSTopicArnExample"
},
"TopicRegion": {
"Type": "String",
"Description": "us-east-1"
}
},
"Resources": {
"Queue": {
"Type": "AWS::SQS::Queue"
},
"SnsSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"Protocol": "sqs",
"Endpoint": {
"Fn::GetAtt": [
"Queue",
"Arn"
]
},
"Region": {
"Ref": "TopicRegion"
},
"TopicArn": {
"Ref": "SNSTopicARN"
}
}
}
}
}
YAML :
Parameters:
SNSTopicARN:
Type: String
Description: awsSNSTopicArnExample
TopicRegion:
Type: String
Description: us-east-1
Resources:
Queue:
Type: AWS::SQS::Queue
SnsSubscription:
Type: AWS::SNS::Subscription
Properties:
Protocol: sqs
Endpoint: !GetAtt Queue.Arn
Region: !Ref TopicRegion
TopicArn: !Ref SNSTopicARN
Votre abonnement inter-région est désormais configuré.
Utilisation de la ressource AWS::SNS::Subscription pour configurer un abonnement inter-comptes
1. Dans le modèle AWS CloudFormation de la pile dans un compte source AWS, déclarez la rubrique SNS et la stratégie AWS::SNS::TopicPolicy. Créez ensuite une ressource de sortie afin d'annoter le nom ARN de la rubrique SNS et saisissez votre compte AWS de destination comme paramètre.
Reportez-vous aux exemples de modèles JSON et YAML suivants.
JSON :
{
"Parameters": {
"CrossAccountNumber": {
"AllowedPattern": "[0-9]+",
"Description": "The 12 digit AWS account number to grant access to.",
"MaxLength": "12",
"MinLength": "12",
"Type": "String",
"Default": 123456789101
}
},
"Resources": {
"SnsTopic": {
"Type": "AWS::SNS::Topic"
},
"SnsTopicPolicy": {
"Type": "AWS::SNS::TopicPolicy",
"DependsOn": "SnsTopic",
"Properties": {
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SnsTopicPolicy",
"Effect": "Allow",
"Principal": {
"AWS": {
"Fn::Sub": "arn:aws:iam::${CrossAccountNumber}:root"
}
},
"Action": [
"sns:Subscribe"
],
"Resource": {
"Ref": "SnsTopic"
}
}
]
},
"Topics": [
{
"Ref": "SnsTopic"
}
]
}
}
},
"Outputs": {
"SnsTopicArn": {
"Value": {
"Ref": "SnsTopic"
}
}
}
}
YAML :
Parameters:
CrossAccountNumber:
AllowedPattern: '[0-9]+'
Description: The 12 digit AWS account number to grant access to.
MaxLength: '12'
MinLength: '12'
Type: String
Default: 123456789101
Resources:
SnsTopic:
Type: AWS::SNS::Topic
SnsTopicPolicy:
Type: AWS::SNS::TopicPolicy
DependsOn: SnsTopic
Properties:
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: SnsTopicPolicy
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${CrossAccountNumber}:root
Action:
- sns:Subscribe
Resource: !Ref SnsTopic
Topics:
- !Ref SnsTopic
Outputs:
SnsTopicArn:
Value: !Ref SnsTopic
2. Dans un modèle AWS CloudFormation de la pile dans le compte AWS dans lequel vous souhaitez étendre votre abonnement, définissez la ressource AWS::SNS::Subscription la file d'attente SQS et la stratégie AWS::SQS::QueuePolicy.
Remarque : remplacez awsSNSTopicArn par le nom ARN de votre rubrique SNS, et us-east-1 par votre région AWS.
Reportez-vous aux exemples de modèles JSON et YAML suivants.
JSON :
{
"Parameters": {
"SNSTopicARN": {
"Type": "String",
"Default": "awsSNSTopicArn"
},
"TopicRegion": {
"Type": "String",
"Default": "us-east-1"
}
},
"Resources": {
"Queue": {
"Type": "AWS::SQS::Queue"
},
"SqsQueuePolicy": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"PolicyDocument": {
"Version": "2012-10-17",
"Id": "MyQueuePolicy",
"Statement": [
{
"Sid": "Allow-SNS-SendMessage",
"Effect": "Allow",
"Principal": "*",
"Action": [
"sqs:SendMessage"
],
"Resource": {
"Fn::GetAtt": [
"Queue",
"Arn"
]
},
"Condition": {
"ArnEquals": {
"aws:SourceArn": {
"Ref": "SNSTopicARN"
}
}
}
}
]
},
"Queues" : [
{
"Ref" : "Queue"
}
]
}
},
"SnsSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"Protocol": "sqs",
"Endpoint": {
"Fn::GetAtt": [
"Queue",
"Arn"
]
},
"Region": {
"Ref": "TopicRegion"
},
"TopicArn": {
"Ref": "SNSTopicARN"
}
}
}
}
}
YAML :
Parameters:
SNSTopicARN:
Type: String
Default: awsSNSTopicArn
TopicRegion:
Type: String
Default: us-east-1
Resources:
Queue:
Type: AWS::SQS::Queue
SqsQueuePolicy:
Type: AWS::SQS::QueuePolicy
Properties:
PolicyDocument:
Version: '2012-10-17'
Id: MyQueuePolicy
Statement:
- Sid: Allow-SNS-SendMessage
Effect: Allow
Principal: "*"
Action:
- sqs:SendMessage
Resource: !GetAtt Queue.Arn
Condition:
ArnEquals:
aws:SourceArn: !Ref SNSTopicARN
Queues:
- !Ref Queue
SnsSubscription:
Type: AWS::SNS::Subscription
Properties:
Protocol: sqs
Endpoint: !GetAtt Queue.Arn
Region: !Ref TopicRegion
TopicArn: !Ref SNSTopicARN
Cet article vous a-t-il été utile ?
Cette page peut-elle être améliorée ?
Vous avez besoin d'aide ?