AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

Amazon SQS 대기열과 CloudFormation의 Amazon SNS 주제 간에 구독을 생성하려면 어떻게 해야 합니까?

4분 분량
0

내 Amazon Simple Queue Service(Amazon SQS) 대기열과 AWS CloudFormation의 Amazon Simple Notification Service(Amazon SNS) 주제 간에 구독을 생성하려고 합니다.

해결 방법

주제와 대기열이 동일한 스택에 있는 경우, CloudFormation 템플릿을 사용하여 SQS 대기열에 메시지를 보내는 주제를 생성합니다.

주제가 한 스택에 있고 대기열이 다른 스택에 있는 경우, 스택 간 참조를 생성합니다. 두 스택 모두 동일한 AWS 리전에 있어야 합니다. 교차 스택 참조를 생성할 경우, SQS 대기열의 ARN을 하나의 스택으로 내보냅니다. 그런 다음 다른 스택에 있는 SNS 주제의 구독 엔드포인트 속성에 있는 ARN을 가져옵니다.

SNS 주제와 SQS 대기열이 다른 리전 또는 AWS 계정에 있는 경우, AWS::SNS::Subscription을 사용하여 교차 계정 또는 교차 리전 구독을 설정하세요.

교차 계정 구독 설정

계정 A 구성

소스 스택용 CloudFormation 템플릿에서 다음 설정을 구성합니다.

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

계정 B 구성

대상 스택에 대한 CloudFormation 템플릿에서 리소스에 대해 AWS::SNS::Subscription 리소스, AWS::SQS::QueueAWS::SQS::QueuePolicy을 선언합니다.

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

참고: 앞의 예시 템플릿에서 파라미터 아래의 awsSNSTopicArn을 SNS 토픽 ARN으로 바꿉니다. 또한 us-east-1을 소스 계정(계정 A)에서 스택의 리전으로 바꿉니다.

리전 간 구독 설정

리전 A 구성

한 리전의 스택에 대한 CloudFormation 템플릿에서 다음 설정을 구성합니다.

  • 리소스에서 AWS::SNS::Topic을 선언합니다.
  • 출력 섹션을 생성하여 SnsTopicArn을 반환합니다.

JSON 템플릿 예시:

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

YAML 템플릿 예제:

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

리전 B 구성

다른 리전의 스택에 대한 CloudFormation 템플릿에서 리소스에 대해 AWS::SNS::Subscription 리소스 및 AWS::SQS::Queue을 선언합니다.

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

**참고:**위의 예제 템플릿의 파라미터에서 awsSNSTopicArnExample 예제를 SNS 주제 ARN으로 바꿉니다. 또한 us-east-1을 리전 A의 스택 리전으로 바꿉니다.

AWS 공식
AWS 공식업데이트됨 2달 전