Amazon SQS 대기열과 CloudFormation의 Amazon SNS 주제 간에 구독을 생성하려면 어떻게 해야 합니까?
내 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 템플릿에서 다음 설정을 구성합니다.
- 파라미터에서 설명에 대상 계정 ID를 입력합니다.
- 리소스에서 AWS::SNS::Topic 및 AWS::SNS::TopicPolicy를 선언합니다.
- 출력 섹션을 생성하여 SNS TopicArn을 반환합니다.
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::Queue 및 AWS::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의 스택 리전으로 바꿉니다.
관련 콘텐츠
- 질문됨 6달 전lg...
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 일 년 전
- AWS 공식업데이트됨 6달 전