Comment créer un abonnement entre ma file d'attente Amazon SQS et une rubrique Amazon SNS dans CloudFormation ?
Dernière mise à jour : 11-11-2022
Je souhaite créer un abonnement entre ma file d'attente Amazon Simple Queue Service (Amazon SQS) et la rubrique Amazon Simple Notification Service (Amazon SNS) dans AWS CloudFormation.
Résolution
En fonction de votre cas d'utilisation, choisissez l'une des solutions suivantes :
- Vous avez une rubrique SNS et une file d'attente SQS dans la même pile. Pour résoudre ce problème, utilisez un modèle CloudFormation pour créer une rubrique qui envoie des messages aux files d'attente SQS.
- Votre rubrique SNS se trouve dans une pile et la file d'attente SQS qui s'abonnera à cette rubrique se trouve dans une autre pile. Les deux piles se trouvent dans la même région AWS. Pour résoudre ce problème, 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 cet ARN de file d'attente SQS dans la propriété du point de terminaison d'abonnement de la rubrique SNS dans l'autre pile. - Votre rubrique SNS et la file d'attente SQS se trouvent dans des régions distinctes. Pour résoudre ce problème, suivez les étapes décrites dans la section Utilisez la ressource AWS::SNS::Subscription pour configurer un abonnement inter-régions.
- Votre rubrique SNS et la file d'attente SQS se trouvent dans des comptes AWS distincts. Pour résoudre ce problème, suivez les étapes décrites dans la section Utilisez la ressource AWS::SNS::Subscription pour configurer un abonnement inter-comptes.
Utilisation de la ressource AWS::SNS::Subscription pour configurer un abonnement inter-régions
1. Dans le modèle CloudFormation pour la pile dans une région AWS, déclarez la rubrique SNS dans cette région. Créez ensuite une ressource de sortie pour annoter l'ARN de rubrique SNS.
Reportez-vous aux exemples de modèles JSON et YAML suivants.
JSON :
{
"Resources": {
"SnsTopic": {
"Type": "AWS::SNS::Topic"
}
},
"Outputs": {
"SnsTopicArn": {
"Value": {
"Ref": "SnsTopic"
}
}
}
}
YAML :
Resources:
SnsTopic:
Type: AWS::SNS::Topic
Outputs:
SnsTopicArn:
Value: !Ref SnsTopic
2. Dans un modèle CloudFormation pour l'autre pile de l'autre région, définissez la ressource AWS::SNS::Subscription et la file d'attente SQS.
Remarque : dans Parameters (Paramètres), remplacez awsSNSTopicArnExample par votre ARN de rubrique SNS. Remplacez us-east-1 par la région de la pile de l'étape 1.
Reportez-vous aux exemples de modèles JSON et YAML suivants.
JSON :
{
"Parameters": {
"SNSTopicARN": {
"Type": "String",
"Default": "awsSNSTopicArnExample"
},
"TopicRegion": {
"Type": "String",
"Default": "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
Default: awsSNSTopicArnExample
TopicRegion:
Type: String
Default: 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égions est désormais configuré.
Utilisation de la ressource AWS::SNS::Subscription pour configurer un abonnement inter-comptes
1. Dans le modèle CloudFormation pour 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 l'ARN de 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 le modèle CloudFormation de la pile du compte AWS où vous souhaitez prolonger votre abonnement, définissez la ressource AWS::SNS::Subscription. Définissez également la file d'attente SQS et la stratégie AWS።SQS።QueuePolicy.
Remarque : dans Parameters (Paramètres), remplacez awsSNSTopicArn par votre ARN de rubrique SNS. Remplacez us-east-1 par la région de la pile de l'étape 1.
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 ?
Besoin d'aide pour une question technique ou de facturation ?