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

Lecture de 5 minute(s)
0

Je souhaite 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.

Résolution

Si la rubrique et la file d'attente se trouvent dans la même pile, vous devez utiliser un modèle CloudFormation pour créer une rubrique qui envoie des messages aux files d'attente SQS.

Si la rubrique se trouve dans une pile différente de celle de la file d'attente, vous devez créer une référence entre piles. Les deux piles doivent se trouver dans la même région AWS. Lorsque vous créez une référence entre piles, exportez l'ARN de la file d'attente SQS dans une pile. Importez ensuite l'ARN dans la propriété du point de terminaison d'abonnement de la rubrique SNS de l'autre pile.

Si votre rubrique SNS et votre file d'attente SQS se trouvent dans des régions ou des comptes AWS différents, utilisez AWS::SNS::Subscription pour configurer un abonnement intercompte ou interrégional.

Configuration d’un abonnement intercompte

Configuration du compte A

Dans le modèle CloudFormation de la pile source, configurez les paramètres suivants :

  • Sous Paramètres, dans Description, saisissez l'ID du compte de destination.
  • Dans les Ressources, déclarez les éléments AWS::SNS::Topic et AWS::SNS::TopicPolicy.
  • Créez une section Sorties pour renvoyer le TopicArn SNS.

Exemple de modèle 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"
      }
    }
  }
}

Exemple de modèle 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

Configuration du compte B

Dans le modèle CloudFormation de la pile de destination, dans Ressources, déclarez la ressource AWS::SNS::Subscription ainsi que les éléments AWS::SQS::Queue et AWS::SQS::QueuePolicy.

Exemple de modèle 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"
    }
   }
  }
 }
}

Exemple de modèle 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

Remarque : dans les exemples de modèles précédents, sous Paramètres, remplacez awsSNSTopicArn par l'ARN de votre rubrique SNS. Remplacez également us-east-1 par la région de la pile dans le compte source (compte A).

Configuration d’un abonnement interrégional

Configuration de la région A

Dans le modèle CloudFormation de la pile d'une région, configurez les paramètres suivants :

  • Dans Ressources, déclarez l’élément AWS::SNS::Topic.
  • Créez une section Sorties pour renvoyer le SnsTopicArn.

Exemple de modèle JSON :

{
 "Resources": {
  "SnsTopic": {
   "Type": "AWS::SNS::Topic"
  }
 },
 "Outputs": {
  "SnsTopicArn": {
   "Value": {
     "Ref": "SnsTopic"
   }
  }
 }
}

Exemple de modèle YAML :

Resources:
  SnsTopic:
    Type: AWS::SNS::Topic
Outputs:
  SnsTopicArn:
    Value: !Ref SnsTopic

Configuration de la région B

Dans le modèle CloudFormation de la pile de l'autre région, dans Ressources, déclarez la ressource AWS::SNS::Subscription et l’élément AWS::SQS::Queue.

Exemple de modèle 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"
    }
   }
  }
 }
}

Exemple de modèle 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

Remarque : dans les exemples de modèles précédents, sous Paramètres, remplacez awsSNSTopicArnExample par l'ARN de votre rubrique SNS. Remplacez également us-east-1 par la région de la pile de la région A.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 6 mois