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 ?