Comment créer un abonnement entre ma file d'attente Amazon SQS et une rubrique Amazon SNS dans CloudFormation ?

Dernière mise à jour : 06/05/2021

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 SNS se trouve dans une autre pile de 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 ?