HTTP/S 엔드포인트가 구독자인 경우 시스템 간 메시징에 Amazon SNS 사용 - Amazon Simple Notification Service

HTTP/S 엔드포인트가 구독자인 경우 시스템 간 메시징에 Amazon SNS 사용

Amazon SNS를 사용하여 하나 이상의 HTTP 엔드포인트 또는 HTTPS 엔드포인트에 알림 메시지를 전송할 수 있습니다. 주제에 대한 엔드포인트를 구독할 때 사용자는 주제에 대한 알림을 게시할 수 있으며 Amazon SNS는 HTTP POST 요청을 전송하는 한편 구독된 엔드포인트에 알림 콘텐츠를 전송합니다. 사용자는 엔드포인트 구독 시 Amazon SNS가 엔드포인트에 POST 요청을 전송하기 위해 HTTP를 사용하는지 또는 HTTPS를 사용하는지 여부를 선택합니다. HTTPS를 사용할 경우 Amazon SNS에서 다음에 대한 지원을 이용할 수 있습니다.

  • 서버 이름 표시(SNI) - Amazon SNS는 이 기능을 사용하여 여러 도메인을 호스팅하기 위해 여러 인증서가 필요한 서버와 같이 SNI가 필요한 HTTPS 엔드포인트를 지원합니다.— SNI에 대한 자세한 내용은 서버 이름 표시를 참조하십시오.

  • 기본 및 다이제스트 액세스 인증 - HTTP POST 요청에 대해 HTTPS URL에 사용자 이름과 암호를 지정할 수 있습니다(예: https://user:password@domain.com 또는 https://user@domain.com). 사용자 이름과 암호는 HTTPS를 사용할 때 설정되는 SSL 연결을 통해 암호화됩니다.— 도메인 이름만 일반 텍스트로 전송됩니다. 기본 및 다이제스트 액세스 인증에 대한 자세한 내용은 RFC-2617을 참조하십시오.

    참고

    클라이언트 서비스는 HTTP/1.1 401 Unauthorized 헤더 응답을 지원할 수 있어야 합니다.

요청은 JSON 문서의 알림에 대한 메타데이터와 함께 주제에 게시된 제목 및 메시지를 포함합니다. 요청은 다음의 HTTP POST 요청과 유사합니다. 요청 본문의 HTTP 헤더 및 JSON 형식에 대한 세부 정보는 HTTP/HTTPS 헤더HTTP/HTTPS 알림 JSON 형식을 참조하십시오.

POST / HTTP/1.1 x-amz-sns-message-type: Notification x-amz-sns-message-id: da41e39f-ea4d-435a-b922-c6aae3915ebe x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55 Content-Length: 761 Content-Type: text/plain; charset=UTF-8 Host: ec2-50-17-44-49.compute-1.amazonaws.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "Notification", "MessageId" : "da41e39f-ea4d-435a-b922-c6aae3915ebe", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "test", "Message" : "test message", "Timestamp" : "2012-04-25T21:49:25.719Z", "SignatureVersion" : "1", "Signature" : "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55" }

HTTP 엔드포인트 또는 HTTPS 엔드포인트에 메시지를 전송하기 위해 Amazon SNS 주제를 활성화하려면 다음의 단계를 따라야합니다.

Amazon SNS 메시지를 처리하도록 엔드포인트 준비

HTTP/HTTPS 엔드포인트를 Amazon SNS 주제에 구독 설정

3단계: 구독 확인

단계 4: 구독의 전송 재시도 정책 설정(옵션)

단계 5: 사용자에게 주제를 게시할 권한 부여(옵션)

단계 6: HTTP/HTTPS 엔드포인트에 메시지 전송

단계 1: Amazon SNS 메시지를 처리하도록 엔드포인트를 준비합니다.

사용자는 주제에 대한 HTTP 엔드포인트 또는 HTTPS 엔드포인트를 구독하기 전에 HTTP 엔드포인트 또는 HTTPS 엔드포인트가 구독 확인 및 알림 메시지를 전송하기 위해 Amazon SNS가 사용하는 HTTP POST 요청을 처리할 수 있는 능력이 있는지 확인해야 합니다. 일반적으로 이는 에서 HTTP 요청을 처리하는 웹 애플리케이션의 생성 및 배포(예. endpoint host가 Linux, Apache 및 Tomcat을 실행할 경우 Java servlet)를 의미합니다. HTTP 엔드포인트 구독 시 Amazon SNS는 이를 구독 확인 요청에 전송합니다. 사용자가 구독을 생성할 때 Amazon SNS는 이 요청을 전송하므로 엔드포인트는 이 요청을 수신하고 처리하도록 준비되어야 합니다. Amazon SNS는 사용자가 구독을 확인하기 전에는 엔드포인트에 알림을 전송하지 않습니다. 구독을 확인하고 나면 Amazon SNS는 구독하는 주제에 대해 게시 작업이 수행될 때 엔드포인트에 알림을 전송합니다.

구독 확인 및 알림 메시지 처리를 위한 엔드포인트 설정

  1. 사용자의 코드는 Amazon SNS가 엔드포인트에 전송한 HTTP POST 요청의 HTTP 헤더를 읽어야 합니다. 사용자의 코드는 Amazon SNS가 사용자에게 전송한 메시지 유형을 나타내는 헤더 필드 x-amz-sns-message-type을 찾아야 합니다. 헤더를 확인함으로써 사용자는 HTTP 요청의 본문을 분석하지 않고도 메시지 유형을 결정할 수 있습니다. 처리해야 할 두 가지 유형 SubscriptionConfirmationNotification가 있습니다. UnsubscribeConfirmation 메시지는 주제에서 구독이 삭제된 때에만 사용됩니다.

    HTTP 헤더에 대한 세부 정보는 HTTP/HTTPS 헤더를 참조하십시오. 다음의 HTTP POST 요청은 구독 확인 메시지의 예입니다.

    POST / HTTP/1.1 x-amz-sns-message-type: SubscriptionConfirmation x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic Content-Length: 1336 Content-Type: text/plain; charset=UTF-8 Host: example.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "SubscriptionConfirmation", "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b", "Token" : "2336412f37f...", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...", "Timestamp" : "2012-04-26T20:45:04.751Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEpH+...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem" }
  2. 사용자의 코드는 HTTP POST 요청 본문의 JSON 문서를 분석하여 Amazon SNS 메시지를 구성하는 이름/값 쌍을 읽어야 합니다. JSON 분석을 사용해 제어 문자의 escaped 상태를 ASCII 문자 값으로 변환 처리합니다(예. \n을 줄바꿈 문자로 변환). Jackson JSON Processor 등의 기존 JSON 구문 분석기를 사용하거나 자체적으로 쓸 수 있습니다. 제목 및 메시지 필드의 문자를 유효한 JSON으로 보내려면 는 제어 문자를 JSON 문서에 포함될 수 있는 escaped 상태로 변환해야 합니다. 엔드포인트에 전송된 POST 요청의 본문에 있는 JSON 문서를 수신하면 사용자는 escaped 문자를 다시 원본 문자 값으로 변환해야 합니다. 서명은 원본 형식의 메시지 및 제목을 서명할 스트링의 일부로 사용하기 때문에 이는 알림의 서명을 확인하고자 할 경우 아주 중요합니다.

  3. 사용자의 코드는 Amazon SNS가 보낸 알림의 신뢰성, 구독 확인 또는 구독 해지 확인 메시지를 확인해야 합니다. 엔드포인트는 Amazon SNS 메시지에 포함된 정보를 사용해 서명을 재생성할 수 있으며 사용자는 Amazon SNS가 메시지로 보낸 서명을 자신의 서명과 비교함으로써 메시지의 콘텐츠를 확인할 수 있습니다. 메시지의 서명 확인에 대한 자세한 내용은 Amazon SNS 메시지의 서명 확인을 참조하십시오.

  4. 사용자의 코드는 헤더 필드 x-amz-sns-message-type가 지정하는 유형에 기초하여 HTTP 요청의 본문에 담긴 JSON 문서를 읽고 메시지를 처리해야 합니다. 다음은 두 가지 주요 메시지 유형 처리 지침입니다.

    SubscriptionConfirmation

    SubscribeURL의 값을 읽고 해당 URL을 방문합니다. 구독을 확인하고 엔드포인트에서 알림 수신을 시작하려면 SubscribeURL URL을 방문해야 합니다(예. URL에 HTTP GET 요청을 전송). SubscribeURL를 확인하려면 이전 단계의 HTTP 요청 예제를 확인합니다. SubscriptionConfirmation메시지의 형식에 대한 자세한 내용은 HTTP/HTTPS 구독 확인 JSON 형식을 참조하십시오. URL을 방문하면 다음의 XML 문서와 같은 응답을 받게 됩니다. 문서는 ConfirmSubscriptionResult 요소 내 엔드포인트에 대한 구독 ARN을 되돌립니다.

    <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/"> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>

    사용자는 SubscribeURL 방문 외에도 ConfirmSubscription 작업과 함께 Token(SubscriptionConfirmation 메시지의 해당 값으로 설정된)을 사용해 구독을 확인할 수 있습니다. 주제 소유자 및 구독 소유자만 엔드포인트를 구독 해지할 수 있도록 허용하고자 하는 경우 AWS 서명을 사용해 ConfirmSubscription 작업을 호출합니다.

    알림

    SubjectMessage에 대한 값을 읽어 주제에 게시된 알림 정보를 획득합니다.

    Notification 메시지 형식에 대한 세부 정보는 HTTP/HTTPS 헤더를 참조하십시오. 다음의 HTTP POST 요청은 endpoint example.com에 전송된 알림 메시지의 예입니다.

    POST / HTTP/1.1 x-amz-sns-message-type: Notification x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324 x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96 Content-Length: 773 Content-Type: text/plain; charset=UTF-8 Host: example.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent { "Type" : "Notification", "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "My First Message", "Message" : "Hello world!", "Timestamp" : "2012-05-02T00:54:06.655Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEw6JRN...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96" }
  5. 엔드포인트가 적절한 상태 코드로 Amazon SNS의 HTTP POST 메시지에 응답하도록 확인해야 합니다. 연결은 15초 내에 끊어집니다. 엔드포인트가 연결 시간이 끊기기 전까지 응답하지 않거나 엔드포인트가 상태 코드를 200–4xx 범주 외로 되돌릴 경우 Amazon SNS는 메시지 전송이 실패한 것으로 간주합니다.

  6. Amazon SNS로부터의 메시지 전송 재시도를 처리할 수 있도록 코드를 확인해야 합니다. Amazon SNS는 엔드포인트에서 성공적인 응답을 수신하지 않을 경우 메시지를 다시 전송하는 시도를 합니다. 이는 구독 확인 메시지를 포함한 모든 메시지에 적용됩니다. 기본 설정에서 메시지의 초기 전송이 실패할 경우 Amazon SNS는 최대 3회 재시도를 실시하며 실패한 시도 사이에 설정된 지연 시간은 20초 입니다.

    참고

    15초가 경과하면 메시지 요청 시간이 초과됩니다. 따라서 시간이 초과되어 메시지 전송이 실패하는 경우 Amazon SNS는 이전 전송 시도의 약 35초 후에 재시도를 합니다. 엔드포인트에 대해 다른 전송 정책을 설정할 수 있습니다.

    다시 말하자면, Amazon SNS는 전송 x-amz-sns-message-id 헤더 필드 이후에만 재전송을 시도합니다. 사용자는 수신 메시지와 처리한 메시지의 ID를 비교함으로써 메시지가 재전송을 시도하는지 여부를 판단할 수 있습니다.

  7. HTTPS 엔드포인트를 구독할 경우 엔드포인트에 신뢰할 수 있는 인증 기관(CA)의 서버 인증서가 있는지 확인해야 합니다. Amazon SNS는 Amazon SNS가 신뢰하는 CA의 서명이 있는 서버 인증서를 보유한 HTTPS 엔드포인트에만 메시지를 보냅니다.

  8. Amazon SNS 메시지를 수신하기 위해 생성한 코드를 배포합니다. 엔드포인트를 구독할 때 엔드포인트는 적어도 구독 확인 메시지를 받을 준비가 되어야 합니다.

단계 2: Amazon SNS 주제에 대한 HTTP/HTTPS 엔드포인트 구독

주제를 통해 메시지를 HTTP 엔드포인트 또는 HTTPS 엔드포인트에 전송하려면 사용자는 Amazon SNS 주제에 대한 엔드포인트를 구독해야 합니다. 사용자는 해당 URL을 사용하여 엔드포인트를 지정합니다. 주제를 구독하려면 Amazon SNS 콘솔, sns-subscribe 명령 또는 Subscribe API 작업을 사용할 수 있습니다. 시작하기 전에 사용자는 구독하고자 하는 엔드포인트의 URL을 보유하는지 확인해야 하며 단계 1에서 설명한 대로 엔드포인트가 확인 및 알림 메시지를 수신할 수 있도록 준비되어야 합니다.

Amazon SNS 콘솔을 이용한 주제에 대한 HTTP 엔드포인트 또는 HTTPS 엔드포인트 구독

  1. Amazon SNS 콘솔에 로그인합니다.

  2. 탐색 창에서 주제를 선택한 후 주제를 선택합니다.

  3. 기타 작업 드롭다운 목록을 선택하고 주제 구독을 선택합니다.

  4. [Protocol] 드롭다운 목록에서 [HTTP] 또는 [HTTPS]를 선택합니다.

  5. 엔드포인트 상자에서 주제가 메시지를 전송하려는 엔드포인트의 URL을 붙여 넣은 다음 구독 생성을 선택합니다.

  6. Subscription request received!(구독 요청 수신!) 메시지에서 닫기를 선택합니다.

    새 구독의 Subscription ID는 PendingConfirmation에 표시됩니다. 구독 확인 시 Subscription ID는 Subscription ID에 표시됩니다.

3단계: 구독 확인

엔드포인트를 구독한 후 Amazon SNS는 엔드포인트에 구독 확인 메시지를 전송합니다. 사용자는 이미 Step 1에서 설명한 작업을 수행하는 엔드포인트에 배포될 코드를 보유해야 합니다. 구체적으로 엔드포인트의 코드는 구독 확인 메시지로부터의 SubscribeURL 값을 검색하고 SubscribeURL이 자체적으로 지정한 위치를 방문하거나 사용자가 수동으로 SubscribeURL(예: 웹 브라우저)을 방문할 수 있도록 해야 합니다. Amazon SNS는 구독이 확인되기 전에는 엔드포인트에 메시지를 보내지 않습니다. SubscribeURL 방문 시, 응답은 구독에 대한 ARN을 지정하는 요소 SubscriptionArn를 담고 있는 XML 문서를 포함합니다. 사용자는 Amazon SNS 콘솔을 사용하여 구독 확인을 검증할 수도 있습니다. Subscription ID는 구독에 대한 ARN을 표시합니다(구독을 처음 추가했을 때 확인한 PendingConfirmation 값 대신).

단계 4: 구독의 전송 재시도 정책 설정(옵션)

기본 설정에서 메시지의 초기 전송이 실패할 경우 Amazon SNS는 최대 3회 재시도를 실시하며 실패한 시도 사이에 설정된 지연 시간은 20초 입니다. 단계 1에서 논의되었듯 엔드포인트는 재시도되는 메시지를 처리할 수 있는 코드를 보유해야 합니다. 사용자는 주제 또는 구독에 대한 전송 정책을 설정함으로써 가 전송 실패 메시지를 재전송하는 빈도 및 간격을 제어할 수 있습니다. 전송 정책은 주제 또는 특정 구독에 대해 설정할 수 있습니다.

단계 5: 사용자에게 주제를 게시할 권한 부여(옵션)

기본 설정에서 주제 소유자는 주제를 게시할 권한을 갖습니다. 다른 사용자 및 애플리케이션을 활성화하여 주제를 게시하려면 AWS Identity and Access Management(IAM)을 사용하여 주제에 대한 게시 권한을 부여해야 합니다. IAM 사용자에게 Amazon SNS 작업에 대한 권한을 부여하는 방법에 대한 자세한 내용은 Amazon SNS에 대한 자격 증명 기반 정책 사용 단원을 참조하십시오.

주제에 대한 액세스를 제어하는 다음의 두 가지 방법이 있습니다.

  • IAM 사용자 또는 그룹에 정책을 추가합니다. 사용자에게 주제에 대한 권한을 부여하는 가장 간단한 방법은 그룹을 생성하고 그룹에 적절한 정책을 추가한 후 사용자를 추가하는 것입니다. 그룹에서 사용자를 추가하거나 제거하는 것이 각각의 사용자에 대해 설정한 정책을 추적하는 것보다 훨씬 쉽습니다.

  • 주제에 정책을 추가합니다. 또 다른 AWS 계정에 주제에 대한 권한을 부여하고자 할 경우 사용할 수 있는 유일한 방법은 권한을 부여하고자 하는 AWS 계정과 같은 정책을 추가하는 것입니다.

사용자는 대부분의 경우 첫 번째 방법을 사용해야 합니다(그룹에 정책을 적용하여 해당 그룹에 적절한 사용자를 추가 및 제거함으로써 사용자에 대한 권한을 관리). 또 다른 계정의 사용자에게 권한을 부여해야할 경우에는 두 번째 방법을 사용합니다.

IAM 사용자 또는 그룹에 다음의 정책을 추가할 경우 해당 사용자 또는 그룹 구성원에게 MyTopic에 대한 sns:Publish 작업을 수행할 권한을 부여할 것입니다.

{ "Statement":[{ "Sid":"AllowPublishToMyTopic", "Effect":"Allow", "Action":"sns:Publish", "Resource":"arn:aws:sns:us-east-2:123456789012:MyTopic" }] }

다음의 정책 예제는 또 다른 계정에 주제에 대한 권한을 부여하는 방법을 나타냅니다.

참고

사용자 계정에 있는 리소스에 대한 액세스 권한을 또 다른 AWS 계정에 부여할 때 해당 리소스에 대해 관리자 레벨의 액세스(와일드카드 액세스) 권한을 보유한 IAM 사용자에게도 권한을 부여합니다. 다른 계정의 다른 모든 사용자는 자동으로 사용자 리소스에 대한 액세스가 거부됩니다. 해당 AWS 계정의 특정 IAM 사용자에게 사용자의 리소스에 대한 액세스 권한을 부여하고자 할 경우 관리자 레벨의 액세스 권한을 보유한 계정 또는 IAM 사용자는 이러한 IAM 사용자들에게 리소스에 대한 권한을 위임해야 한다. 교차 계정 위임에 대한 자세한 정보는 Using IAM GuideEnabling Cross-Account Access를 참조하십시오.

계정 123456789012의 주제 MyTopic에 다음 정책을 추가한 경우 계정 111122223333에 해당 주제에 대한 sns:Publish 작업을 수행할 수 있는 권한을 부여한 것입니다.

{ "Statement":[{ "Sid":"Allow-publish-to-topic", "Effect":"Allow", "Principal":{ "AWS":"111122223333" }, "Action":"sns:Publish", "Resource":"arn:aws:sns:us-east-2:123456789012:MyTopic" }] }

단계 6: HTTP/HTTPS 엔드포인트에 메시지 전송

주제를 게시함으로써 주제의 구독에 메시지를 전송할 수 있습니다. 주제에 게시하려면 Amazon SNS 콘솔, sns-publish CLI 명령 또는 Publish API 작업을 사용할 수 있습니다.

단계 1을 따랐다면 엔드포인트에 배포한 코드는 알림을 처리해야 합니다.

Amazon SNS 콘솔을 사용하여 주제 게시

  1. AWS 계정 또는 주제에 게시할 권한을 가진 IAM 사용자의 자격 증명을 통해 AWS Management 콘솔에 등록하고 Amazon SNS 콘솔을 https://console.aws.amazon.com/sns/에서 엽니다.

  2. 탐색 창에서 주제를 선택한 후 주제를 선택합니다.

  3. 메시지 게시 버튼을 선택합니다.

  4. 제목 상자에 제목을 입력합니다(예: Testing publish to my endpoint).

  5. 메시지 상자에 텍스트를 입력하고(예: Hello world!), 메시지 게시를 선택합니다.

    다음의 메시지가 나타납니다. Your message has been successfully published.