

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon SNS 메시지 전송
<a name="message-delivery"></a>

이 주제에서는 Amazon SNS가 다양한 시나리오에서 메시지 전송을 처리하는 방법을 설명합니다. Amazon SNS가 수정되지 않은 원래 형식으로 엔드포인트에 메시지를 전달하는 원시 메시지 전송에 대해 알아봅니다. 또한 Amazon SNS 주제의 메시지를 다른의 Amazon SQS 대기열로 전송하여 교차 계정 메시징에 대한 인사이트를 AWS 계정제공하는 방법을 알아봅니다.

이 주제에서는 Amazon SNS 메시지를 다른의 Amazon SQS 대기열 또는 Lambda 함수로 전송하는 방법 AWS 리전, 교차 리전 전송의 작동 방식 및 관련 고려 사항에 대한 정보를 제공합니다.

또한 메시지 전송 상태를 모니터링하고 해석하는 방법을 알아봅니다. 이 방법은 메시지가 성공적으로 전송되었는지 또는 문제가 발생했는지에 대한 중요한 정보를 제공합니다. 메시지 전송이 실패하는 경우 Amazon SNS가 의도한 대상에 도달하도록 메시지를 자동으로 다시 전송하려고 시도하는 방법을 포함하여 메시지 전송 재시도 프로세스를 이해할 수 있습니다. 또한 이 주제에서는 데드 레터 대기열을 사용하여 여러 번 시도한 후에도 전달할 수 없는 메시지를 캡처하여 이러한 실패를 효과적으로 분석하고 해결할 수 있도록 하는 방법에 대해서도 설명합니다.

# Amazon SNS 원시 메시지 전송
<a name="sns-large-payload-raw-message-delivery"></a>

[Firehose 전송 스트림으로 팬아웃](sns-firehose-as-subscriber.md), [Amazon SQS](sns-sqs-as-subscriber.md) 및 [HTTP/S](sns-http-https-endpoint-as-subscriber.md) 엔드포인트가 메시지의 JSON 형식을 처리하지 않도록 Amazon SNS는 원시 메시지 전송을 허용합니다.
+ Amazon SQS 엔드포인트에 대해 원시 메시지 전송을 사용하면 게시된 메시지에서 모든 Amazon SNS 메타데이터가 제거되고 메시지가 있는 그대로 전송됩니다.
+ HTTP/S 엔드포인트에 대해 원시 메시지 전송을 활성화하면 값이 `true`로 설정된 HTTP 헤더 `x-amz-sns-rawdelivery`가 메시지에 추가됩니다. 이는 메시지가 JSON 형식 지정 없이 게시되었음을 나타냅니다.
+ HTTP/S 엔드포인트에 대해 원시 메시지 전송을 활성화하면 메시지 본문, 클라이언트 IP 및 필수 헤더가 전송되지만, 메시지 속성을 지정하면 전송되지 않습니다.
+ Firehose 엔드포인트에 대해 원시 메시지 전송을 사용하면 메시지 본문이 전송됩니다. 메시지 속성을 지정하면 전송되지 않습니다.

 AWS SDK를 사용하여 원시 메시지 전송을 활성화하려면 `SetSubscriptionAttribute` API 작업을 사용하고 `RawMessageDelivery` 속성 값을 로 설정해야 합니다`true`.

## 를 사용하여 원시 메시지 전송 활성화 AWS Management Console
<a name="raw-message-console"></a>

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 탐색 창에서 **주제(Topics)**를 선택합니다.

1. **주제** 페이지에서 Firehose, Amazon SQS, HTTP/S 엔드포인트를 구독하는 주제를 선택합니다.

1. ***내 주제*** 페이지의 **구독** 섹션에서 구독을 선택하고 **편집**을 선택합니다.

1. **Edit *EXAMPLE1-23bc-4567-d890-ef12g3hij456*(예제 1-23bc-4567-d890-ef12g3hij456 편집)** 페이지의 **세부 정보** 섹션에서 **Enable raw message delivery(원시 메시지 전송 활성화)**를 선택합니다.

1. **변경 사항 저장**을 선택합니다.

## 메시지 형식 예제
<a name="raw-message-examples"></a>

다음 예에서는 동일한 메시지가 동일한 Amazon SQS 대기열로 두 번 전송됩니다. 유일한 차이점은 원시 메시지 전송이 첫 번째 메시지에 대해 사용 중지되고 두 번째 메시지에 대해 사용된다는 것입니다.
+ 원시 메시지 전송이 **사용 중지됨**

  ```
  {
    "Type": "Notification",
    "MessageId": "dc1e94d9-56c5-5e96-808d-cc7f68faa162",
    "TopicArn": "arn:aws:sns:us-east-2:111122223333:ExampleTopic1",
    "Subject": "TestSubject",
    "Message": "This is a test message.",
    "Timestamp": "2021-02-16T21:41:19.978Z",
    "SignatureVersion": "1",
    "Signature": "FMG5tlZhJNHLHUXvZgtZzlk24FzVa7oX0T4P03neeXw8ZEXZx6z35j2FOTuNYShn2h0bKNC/zLTnMyIxEzmi2X1shOBWsJHkrW2xkR58ABZF+4uWHEE73yDVR4SyYAikP9jstZzDRm+bcVs8+T0yaLiEGLrIIIL4esi1llhIkgErCuy5btPcWXBdio2fpCRD5x9oR6gmE/rd5O7lX1c1uvnv4r1Lkk4pqP2/iUfxFZva1xLSRvgyfm6D9hNklVyPfy+7TalMD0lzmJuOrExtnSIbZew3foxgx8GT+lbZkLd0ZdtdRJlIyPRP44eyq78sU0Eo/LsDr0Iak4ZDpg8dXg==",
    "SigningCertURL": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-010a507c1833636cd94bdb98bd93083a.pem",
    "UnsubscribeURL": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:111122223333:ExampleTopic1:e1039402-24e7-40a3-a0d4-797da162b297"
  }
  ```
+ 원시 메시지 전송이 **사용됨**

  ```
  This is a test message.
  ```

## Amazon SQS 구독에 대한 메시지 속성 및 원시 메시지 전송
<a name="message-atttributes-raw-message-delivery-sqs"></a>

Amazon SNS는 메시지에 대한 정형화된 메타데이터 항목(예: 타임스탬프, 지형 정보 데이터, 서명, 식별자)을 제공하도록 해주는 메시지 속성의 전송을 지원합니다. Amazon SQS 구독의 경우 **원시 메시지 전송**이 사용 설정되면 최대 10개의 메시지 속성을 보낼 수 있습니다. 10개가 넘는 메시지 속성을 보내려면 원시 메시지 전송을 사용 중지해야 합니다. 원시 메시지 전송이 사용 설정된 Amazon SQS 구독으로 전달되는 메시지 속성이 10개를 초과하는 메시지는 클라이언트 측 오류로 간주되어 삭제됩니다.

# 다른 계정의 Amazon SQS 대기열로 Amazon SNS 메시지 전송
<a name="sns-send-message-to-sqs-cross-account"></a>

이 문서에서는 다른 계정의 Amazon SQS 대기열에 하나 이상의 구독을 가진 Amazon SNS 주제에 알림을 게시하는 방법을 설명합니다. 동일한 계정에서와 같은 방법으로 주제 및 대기열을 설정합니다([비동기 처리를 위해 Amazon SNS 알림을 Amazon SQS 대기열에 팬아웃](sns-sqs-as-subscriber.md) 참조). 주요 차이점은 구독 확인을 처리하는 방법이며 주제에 대한 대기열을 구독하는 방법에 따라 다릅니다.

대기열 소유자가 구독을 생성할 때 확인이 자동으로 이루어지므로, 가능하다면 [대기열 소유자가 구독 생성](#SendMessageToSQS.cross.account.queueowner) 섹션에서 참조하는 단계를 따르는 것이 좋습니다.

**참고**  
Amazon SQS 대기열의 메시지 양이 많은 경우 대기열 소유자가 구독을 생성하는 것이 좋습니다.

## 대기열 소유자 구독 생성
<a name="SendMessageToSQS.cross.account.queueowner"></a>

Amazon SQS 대기열을 생성한 계정이 대기열 소유자입니다. 대기열 소유자가 구독을 생성할 경우 구독 확인은 필요하지 않습니다. 대기열은 `Subscribe` 작업이 완료되자마자 주제로부터의 알림 수신을 시작합니다. 대기열 소유자가 주제 소유자의 주제를 구독하려면 해당 주제 소유자가 대기열 소유자의 계정에 해당 주제에 대한 `Subscribe` 작업을 호출할 수 있는 권한을 부여해야 합니다.

### 1단계:를 사용하여 주제 정책 설정 AWS Management Console
<a name="sns-tutorial-set-topic-policy"></a>

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 탐색 창에서 **주제(Topics)**를 선택합니다.

1. 주제를 선택한 다음 **편집**을 선택합니다.

1. ***MyTopic* 편집** 페이지에서 **액세스 정책** 섹션을 확장합니다.

1. 다음 정책을 입력합니다.

   ```
   {
      "Statement": [
         {
            "Effect": "Allow",
            "Principal": {
               "AWS": "111122223333"
            },
            "Action": "sns:Subscribe",
            "Resource": "arn:aws:sns:us-east-2:123456789012:MyTopic"
         }
      ]
   }
   ```

   이 정책은 계정 `111122223333`에 계정 `123456789012`에서 `MyTopic`에 대해 `sns:Subscribe`를 호출할 수 있는 권한을 부여합니다.

   계정 `111122223333`에 대한 자격 증명을 가진 사용자가 `MyTopic`을 구독할 수 있습니다. 이 권한을 사용하면 계정 ID에서 해당 IAM 사용자/역할에 권한을 위임할 수 있습니다. 루트 계정 또는 관리자 사용자만 `sns:Subscribe`를 호출할 수 있습니다. IAM 사용자/역할도 대기열에서 구독하려면 `sns:subscribe` 권한이 있어야 합니다.

1. **변경 사항 저장**을 선택합니다.

   계정 `111122223333`에 대한 자격 증명을 가진 사용자가 MyTopic을 구독할 수 있습니다.

### 2단계:를 AWS 계정 사용하여 다른의 주제에 Amazon SQS 대기열 구독 추가 AWS Management Console
<a name="sns-tutorial-add-sqs-subscription-to-sns-topic-another-account"></a>

시작하기 전에 주제 및 대기열에 대한 ARN이 있고 [대기열에 메시지를 보낼 수 있는 주제에 대한 권한을 부여](subscribe-sqs-queue-to-sns-topic.md#SendMessageToSQS.sqs.permissions)했는지 확인합니다.

1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs/home)에 로그인합니다.

1. 탐색 창에서 **대기열(Queues)**을 선택합니다.

1.  대기열 목록에서 Amazon SNS 주제를 구독할 **대기열**을 선택합니다.

1. **Subscribe to Amazon SNS topic**(Amazon SNS 주제 구독)을 선택합니다.

1. **이 대기열 메뉴에 사용 가능한 Amazon SNS 주제 지정(Specify an Amazon SNS topic available for this queue menu)**에서 대기열에 대해 **Amazon SNS 주제(Amazon SNS topic)**를 선택합니다.

1. **Amazon SNS 주제 ARN 입력(Enter Amazon SNS topic ARN)**을 선택한 다음 주제의 **Amazon 리소스 이름(ARN)**을 입력합니다.

1. **저장**을 선택합니다.
**참고**  
서비스와 통신할 수 있으려면 대기열에 Amazon SNS에 대한 권한이 있어야 합니다.
사용자가 대기열의 소유자이므로 구독을 확인할 필요가 없습니다.

## 대기열을 소유하지 않지만 구독을 생성하는 사용자
<a name="SendMessageToSQS.cross.account.notqueueowner"></a>

구독을 생성하지만 대기열 소유자가 아닌 사용자는 구독을 확인해야 합니다.

`Subscribe` 작업을 사용하면 Amazon SNS에서 대기열에 구독 확인을 보냅니다. 구독이 Amazon SNS 콘솔에 표시되고 해당 구독 ID가 **확인 보류 중**으로 설정되어 있습니다.

구독을 확인하려면 대기열로부터의 메시지를 읽을 수 있는 권한이 있는 사용자가 구독 확인 URL을 검색해야 하며, 구독 소유자는 구독 확인 URL을 사용하여 구독을 확인해야 합니다. 구독이 확인되기 전에는 주제에 게시된 알림은 대기열로 전송되지 않습니다. 구독을 확인하려면 Amazon SQS 콘솔 또는 `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html)` 작업을 사용합니다.

**참고**  
주제에 엔드포인트를 구독하기 전에 대기열에 대한 `sqs:SendMessage` 권한을 설정하여 대기열이 주제로부터 메시지를 받을 수 있는지 확인합니다. 자세한 내용은 [2단계: Amazon SQS 대기열에 메시지를 전송하도록 Amazon SNS 주제에 권한 부여](subscribe-sqs-queue-to-sns-topic.md#SendMessageToSQS.sqs.permissions) 단원을 참조하십시오.

### 1단계:를 AWS 계정 사용하여 다른의 주제에 Amazon SQS 대기열 구독 추가 AWS Management Console
<a name="sns-tutorial-add-sqs-subscription-to-sns-topic-another-account"></a>

시작하기 전에 주제 및 대기열에 대한 ARN이 있고 [대기열에 메시지를 보낼 수 있는 주제에 대한 권한을 부여](subscribe-sqs-queue-to-sns-topic.md#SendMessageToSQS.sqs.permissions)했는지 확인합니다.

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 탐색 창에서 **구독**을 선택합니다.

1. **구독** 페이지에서 **구독 생성**을 선택합니다.

1.  **구독 생성** 페이지의 **세부 정보** 섹션에서 다음을 수행합니다.

   1. **주제 ARN**에 주제의 ARN을 입력합니다.

   1. **프로토콜**에서 **Amazon SQS**를 선택합니다.

   1. **엔드포인트**에 대기열의 ARN을 입력합니다.

   1. **구독 생성**을 선택합니다.
**참고**  
서비스와 통신할 수 있으려면 대기열에 Amazon SNS에 대한 권한이 있어야 합니다.

다음은 Amazon SNS 주제가 Amazon SQS 대기열에 메시지를 전송하도록 허용하는 정책 문 예제입니다.

```
{
   "Sid": "Stmt1234",
   "Effect": "Allow",
   "Principal": "*",
   "Action": "sqs:SendMessage",
   "Resource": "arn:aws:sqs:us-west-2:111111111111:QueueName",
   "Condition": {
      "ArnEquals": {
         "aws:SourceArn": "arn:aws:sns:us-west-2:555555555555:TopicName"
      }
   }
}
```

### 2단계:를 사용하여 구독 확인 AWS Management Console
<a name="sns-tutorial-confirm-subscription-console"></a>

1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs/)에 로그인합니다.

1. 주제에 대한 대기 중인 구독을 보유한 대기열을 선택합니다.

1. **Send and receive messages**(메시지 보내기 및 받기)를 선택한 다음 **Poll for messages**(메시지 폴링)를 선택합니다.

   대기열에서 구독 확인 메시지가 수신됩니다.

1. **본문** 열에서 다음을 수행합니다.

   1. **추가 정보**를 선택합니다.

   1. **메시지 세부 정보(Message Details)** 대화 상자에서 **SubscribeURL** 값을 찾아서 확인합니다. 이 링크는 구독 링크입니다(아래 예). API 토큰 유효성 검사에 대한 자세한 내용은 Amazon SNS API 참조의 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 섹션을 참조하세요.

      ```
      https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:MyTopic&Token=2336412f37fb...
      ```

   1. 구독 확인 링크를 기록해 둡니다. URL을 대기열 소유자에서 구독 소유자에게로 전달해야 합니다. 구독 소유자는 URL을 [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/v3/home)에 입력해야 합니다.

1. **구독 소유자**로 [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/v3/home)에 로그인하여 구독 소유자가 확인을 수행합니다.

1. 관련 **주제**를 선택합니다.

1. 주제의 구독 목록 테이블에서 관련 **구독**을 선택합니다. '확인 보류 중(Pending confirmation)'으로 표시됩니다.

1. **구독 확인(Confirm subscription)**을 선택합니다.

1. 구독 확인 링크를 요청하는 모달이 나타납니다. 구독 확인 링크를 **붙여넣습니다**.

1. 모달에서 **구독 확인(Confirm subscription)**을 선택합니다.

   XML 응답이 표시됩니다. 예를 들면 다음과 같습니다.

   ```
   <ConfirmSubscriptionResponse>
      <ConfirmSubscriptionResult>
         <SubscriptionArn>arn:aws:sns:us-east-2:123456789012:MyTopic:1234a567-bc89-012d-3e45-6fg7h890123i</SubscriptionArn>
      </ConfirmSubscriptionResult>
      <ResponseMetadata>
         <RequestId>abcd1efg-23hi-jkl4-m5no-p67q8rstuvw9</RequestId>
      </ResponseMetadata>
   </ConfirmSubscriptionResponse>
   ```

   구독된 대기열은 주제로부터 메시지를 수신할 준비가 되었습니다.

1. (선택 사항) Amazon SNS 콘솔에서 주제 구독을 보는 경우 **확인 보류 중** 메시지가 **구독 ID** 열의 구독 ARN으로 대체되었음을 확인할 수 있습니다.

## 구독 취소 요청에 대한 인증을 요구하도록 구독을 강제하려면 어떻게 해야 합니까?
<a name="sns-send-message-to-sqs-cross-account-AuthenticateOnUnsubscribe"></a>

구독 소유자는 구독 확인 시 `AuthenticateOnUnsubscribe` 플래그를 true로 설정해야 합니다.
+ `AuthenticateOnUnsubscribe`는 대기열 소유자가 구독을 생성할 때 자동으로 true로 설정됩니다.
+ 인증 없이 구독 확인 링크로 이동하는 경우 `AuthenticateOnUnsubscribe`를 true로 설정할 수 없습니다.

# 다른 리전의 Amazon SQS 대기열 또는 AWS Lambda 함수로 Amazon SNS 메시지 전송 Amazon SQS
<a name="sns-cross-region-delivery"></a>

Amazon SNS는 기본적으로 사용되는 리전과 [옵트인 리전](#opt-in-regions) 모두에 대해 교차 리전 전송을 지원합니다. 옵트인 리전을 포함하여 Amazon SNS가 지원하는 AWS 리전의 현재 목록은 **Amazon Web Services 일반 참조에서 [Amazon Simple Notification Service 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/sns.html)을 참조하세요.

Amazon SNS는 Amazon SQS 대기열 및 AWS Lambda 함수에 대한 알림의 교차 리전 전송을 지원합니다. 리전 중 하나가 옵트인 리전인 경우 구독 리소스의 정책에서 다른 Amazon SNS 서비스 보안 주체를 지정해야 합니다.

Amazon SNS 구독 명령은 Amazon SNS가 호스팅되는 리전의 해당 리전에서 실행되어야 합니다. 예를 들어 Amazon SNS가 us-east-1 리전의 계정'A'에 있고 Lambda 함수가 us-east-2 리전의 계정 'B'에 있는 경우 구독 CLI 명령은 us-east-1 리전의 계정 'A'에서 실행되어야 합니다.

## 옵트인 리전
<a name="opt-in-regions"></a>

Amazon SNS는 다음과 같은 옵트인 리전을 지원합니다.


| 리전 이름 | 리전 | 
| --- | --- | 
|  아프리카(케이프타운) 리전  |  af-south-1  | 
|  아시아 태평양(홍콩)  |  ap-east-1  | 
|  아시아 태평양(하이데라바드) 리전  |  ap-south-2  | 
|  아시아 태평양(자카르타)  |  ap-southeast-3  | 
|  Asia Pacific (Melbourne) Region  |  ap-southeast-4  | 
|  유럽(밀라노) 리전  |  eu-south-1  | 
|  유럽(스페인) 리전  |  eu-south-2  | 
|  유럽(취리히) 리전  |  eu-central-2  | 
|  Israel (Tel Aviv) Region  |  il-central-1  | 
|  중동(바레인)  |  me-south-1  | 
|  Middle East (UAE) Region  |  me-central-1  | 

옵트인 리전 활성화에 대한 자세한 내용은의 [AWS 리전 관리를 참조하세요](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)*Amazon Web Services 일반 참조.*

옵트인 리전에서 기본적으로 사용되는 리전으로 메시지를 전송하는 데 Amazon SNS를 사용하는 경우, 대기열에 생성된 리소스 정책을 변경해야 합니다. 보안 주체 `sns.amazonaws.com`을 `sns.<opt-in-region>.amazonaws.com`으로 바꿉니다. 예: 
+  미국 동부(버지니아 북부)의 Amazon SQS 대기열을 아시아 태평양(홍콩)의 Amazon SNS 주제에 구독하려면 대기열 정책의 보안 주체를 `sns.ap-east-1.amazonaws.com`으로 변경하세요. 옵트인 리전은 2019년 3월 20일 이후에 시작된 모든 리전으로 구성됩니다. 여기에는 아시아 태평양(홍콩), 아시아 태평양(자카르타), 중동(바레인), 유럽(밀라노), 아프리카(케이프타운)가 포함됩니다. 2019년 3월 20일 이전에 시작된 리전은 기본적으로 활성화되어 있습니다.  
**Amazon SQS에 대한 교차 리전 전송 지원**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-cross-region-delivery.html)

  다음은 옵트인 리전(af-south-1)의 Amazon SNS 주제가 기본적으로 활성화된 리전(us-east-1)의 Amazon SQS 대기열로 전송될 수 있도록 허용하는 액세스 정책 문의 예제입니다. 경로 `Statement`/`Principal`/`Service` 아래에 지역화된 필수 서비스 보안 주체 구성이 포함되어 있습니다.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Id": "__default_policy_ID",
      "Statement": [
          {
              "Sid": "allow_sns_arn:aws:sns:af-south-1:111111111111:source_topic_name",
              "Effect": "Allow",
              "Principal": {
                  "Service": "sns.af-south-1.amazonaws.com"
              },
              "Action": "SQS:SendMessage",
              "Resource": "arn:aws:sqs:us-west-1:111111111111:destination_queue_name",
              "Condition": {
                  "ArnLike": {
                      "aws:SourceArn": "arn:aws:sns:af-south-1:111111111111:source_topic_name"
                  }
              }
          }
      ]
  }
  ```

------
+  미국 동부(버지니아 북부)의 AWS Lambda 함수를 아시아 태평양(홍콩)의 Amazon SNS 주제에 구독하려면 AWS Lambda 함수 정책의 보안 주체를 로 변경합니다`sns.ap-east-1.amazonaws.com`. 옵트인 리전은 2019년 3월 20일 이후에 시작된 모든 리전으로 구성됩니다. 여기에는 아시아 태평양(홍콩), 아시아 태평양(자카르타), 중동(바레인), 유럽(밀라노), 아프리카(케이프타운)가 포함됩니다. 2019년 3월 20일 이전에 시작된 리전은 기본적으로 활성화되어 있습니다.  
**에 대한 리전 간 전송 지원 AWS Lambda**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-cross-region-delivery.html)

# Amazon SNS 메시지 전송 상태
<a name="sns-topic-attributes"></a>

Amazon SNS는 다음 Amazon SNS 엔드포인트가 있는 주제에 전송된 알림 메시지의 전송 상태를 로깅하기 위한 지원을 제공합니다.
+ Amazon Data Firehose
+ Amazon Simple Queue Service
+ AWS Lambda
+ HTTPS
+ 플랫폼 애플리케이션 엔드포인트

전송 상태 로그는 Amazon CloudWatch Logs로 전송되어 메시지 전송 작업에 대한 인사이트를 제공합니다. 이러한 로그는 다음을 수행하는 데 도움이 됩니다.
+ 메시지가 엔드포인트에 성공적으로 전달되었는지 확인합니다.
+ Amazon SNS 엔드포인트의 응답을 식별합니다.
+ 메시지 유지 시간(게시 타임스탬프와 엔드포인트로의 핸드오프 사이의 시간)을 측정합니다.

 AWS Management Console, AWS SDKs, 쿼리 API 또는를 사용하여 전송 상태 로깅을 구성할 수 있습니다 AWS CloudFormation.

# 전송 상태 로깅을 위한 전제 조건
<a name="topics-attrib-prereq"></a>

이 주제에서는 Amazon SNS가 CloudWatch에 전송 로그를 쓸 수 있도록 하는 데 필요한 IAM 권한을 간략하게 설명하고 기본 로그 그룹 명명 규칙에 대해 설명합니다. 이렇게 하면 CloudWatch 로그에서 메시지 전송 로그를 모니터링하고 분석할 수 있는 올바른 설정 및 액세스 권한을 확보할 수 있습니다.

**필수 IAM 권한**

전송 상태 로깅에 연결된 IAM 역할에는 Amazon SNS가 CloudWatch Logs에 쓸 수 있도록 하는 다음 권한이 포함되어야 합니다. 설정 중 새 역할을 만들거나 해당 권한이 있는 기존 역할을 사용할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

------

**로그 그룹 명명 규칙**

기본적으로 Amazon SNS는 다음 명명 규칙을 사용하여 전송 상태 로그에 대한 CloudWatch 로그 그룹을 생성합니다. 이 그룹 내의 로그 스트림은 엔드포인트 프로토콜(예: Lambda, Amazon SQS)에 해당합니다. CloudWatch Logs 콘솔에서 이러한 로그를 볼 수 있는 권한이 있는지 확인합니다.

```
sns/<region>/<account-id>/<topic-name>
```

# 를 사용하여 전송 상태 로깅 구성 AWS Management Console
<a name="topics-attrib"></a>

이 주제에서는 로깅 설정 구성, IAM 역할 할당, CloudWatch Logs가 모니터링 및 문제 해결을 위해 전송 로그를 캡처하는지 확인하는 등 Amazon SNS 주제에 대한 메시지 전송 상태 로깅을 활성화하는 방법을 설명합니다.

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 탐색 창에서 **주제(Topics)**를 선택합니다.

1. 원하는 **주제**를 선택하고 **편집**을 선택합니다.

1. **전송 상태 로깅** 섹션을 확장합니다.

1. 로깅을 활성화할 **프로토콜**을 선택합니다(예: HTTP, Lambda, Amazon SQS).

1. **성공 샘플 비율**(CloudWatch Logs를 수신하려는 성공한 메시지의 비율)을 입력합니다.

1. **IAM 역할** 섹션에서 **성공** 및 **실패** 로깅 모두에 대한 역할을 구성해야 합니다.
   + **기존 서비스 역할 사용** - Amazon SNS가 CloudWatch에 로그를 작성하는 데 필요한 권한이 있는 기존 IAM 역할을 선택합니다.
   + **새 서비스 역할 생성** - **새 서비스 역할 생성**을 선택하여 IAM 콘솔에서 성공한 전송과 실패한 전송의 IAM 역할을 정의합니다. 권한 세부 정보는 [전송 상태 로깅을 위한 전제 조건](topics-attrib-prereq.md)섹션을 참조하세요.

1. **변경 사항 저장**을 선택합니다.

   로깅 활성화 후에는 메시지 전송 상태가 포함된 CloudWatch Logs를 보고 구문 분석할 수 있습니다. CloudWatch 사용에 대한 자세한 정보는 [CloudWatch 설명서](https://aws.amazon.com/documentation/cloudwatch)를 참조하세요.

**로그 설정 확인**

1. CloudWatch Logs 콘솔에 로그인합니다.

1. `sns/<region>/<account-id>/<topic-name>`이라는 로그 그룹을 찾습니다.

1. 구성된 엔드포인트 프로토콜에 대한 로그 스트림이 존재하는지 확인합니다.

1. 주제에 테스트 메시지를 보내고 로그 항목이 나타나 전송 성공 또는 실패를 나타내는지 확인합니다.

# AWS SDKs를 사용하여 전송 상태 로깅 구성
<a name="msg-status-sdk"></a>

 AWS SDKs는 메시지 전송 상태 로깅을 위한 주제 속성을 설정하기 위해 여러 언어로 APIs를 제공합니다. 예를 들어 [SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API를 사용하여 다음을 구성합니다.
+ `LambdaSuccessFeedbackRoleArn` - Lambda 엔드포인트로 메시지를 성공적으로 전송하기 위한 IAM 역할입니다.
+ `LambdaSuccessFeedbackSampleRate` - Lambda 엔드포인트에 대한 성공적인 메시지의 샘플링 비율입니다.
+ `LambdaFailureFeedbackRoleArn` - Lambda 엔드포인트로 실패한 메시지 전송을 위한 IAM 역할입니다.

**예제 AWS CLI 명령**

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name LambdaSuccessFeedbackRoleArn \
    --attribute-value arn:aws:iam::123456789012:role/MyFeedbackRole
```

## 주제 속성
<a name="topic-attributes"></a>

메시지 전송 상태를 위해 다음 주제 속성 이름 값을 사용합니다.

**HTTP**
+ `HTTPSuccessFeedbackRoleArn` - HTTP 엔드포인트를 구독하는 Amazon SNS 주제에 대해 성공한 메시지 전송 상태입니다.
+ `HTTPSuccessFeedbackSampleRate` - HTTP 엔드포인트를 구독하는 Amazon SNS 주제에 대해 샘플링할 성공한 메시지의 비율입니다.
+ `HTTPFailureFeedbackRoleArn` - HTTP 엔드포인트를 구독하는 Amazon SNS 주제에 대해 실패한 메시지 전송 상태입니다.

**Amazon Data Firehose**
+ `FirehoseSuccessFeedbackRoleArn` - Amazon Data Firehose 엔드포인트를 구독하는 Amazon SNS 주제에 대해 성공한 메시지 전송 상태입니다.
+ `FirehoseSuccessFeedbackSampleRate` - Amazon Data Firehose 엔드포인트를 구독하는 Amazon SNS 주제에 대해 샘플링할 성공한 메시지의 비율입니다.
+ `FirehoseFailureFeedbackRoleArn` - Amazon Data Firehose 엔드포인트를 구독하는 Amazon SNS 주제에 대해 실패한 메시지 전송 상태입니다.

**AWS Lambda**
+ `LambdaSuccessFeedbackRoleArn` - Lambda 엔드포인트를 구독하는 Amazon SNS 주제에 대해 성공한 메시지 전송 상태입니다.
+ `LambdaSuccessFeedbackSampleRate` - Lambda 엔드포인트를 구독하는 Amazon SNS 주제에 대해 샘플링할 성공한 메시지의 비율입니다.
+ `LambdaFailureFeedbackRoleArn` - Lambda 엔드포인트를 구독하는 Amazon SNS 주제에 대해 실패한 메시지 전송 상태입니다.

**플랫폼 애플리케이션 엔드포인트**
+ `ApplicationSuccessFeedbackRoleArn` - AWS 애플리케이션 엔드포인트를 구독하는 Amazon SNS 주제에 대한 성공적인 메시지 전송 상태입니다.
+ `ApplicationSuccessFeedbackSampleRate` - AWS 애플리케이션 엔드포인트를 구독하는 Amazon SNS 주제에 대해 샘플링할 성공한 메시지의 비율입니다.
+ `ApplicationFailureFeedbackRoleArn` - AWS 애플리케이션 엔드포인트를 구독하는 Amazon SNS 주제에 대한 메시지 전송 실패 상태입니다.
**참고**  
또한 전송 상태를 푸시 알림 서비스에 직접 로깅하도록 애플리케이션 속성을 구성할 수 있습니다. 자세한 정보는 [메시지 전송 상태를 위한 Amazon SNS 애플리케이션 속성 사용](https://docs.aws.amazon.com/sns/latest/dg/sns-msg-status.html)을 참조하세요.

** Amazon SQS**
+ `SQSSuccessFeedbackRoleArn` – Amazon SQS 엔드포인트를 구독하는 Amazon SNS 주제에 대해 성공한 메시지 전송 상태입니다.
+ `SQSSuccessFeedbackSampleRate` – Amazon SQS 엔드포인트를 구독하는 Amazon SNS 주제에 대해 샘플링할 성공한 메시지의 비율입니다.
+ `SQSFailureFeedbackRoleArn` – Amazon SQS 엔드포인트를 구독하는 Amazon SNS 주제에 대해 실패한 메시지 전송 상태입니다.

플랫폼 애플리케이션 엔드포인트에 대한 로그는 다른 엔드포인트와 동일한 CloudWatch Logs 그룹에 기록됩니다.

**참고**  
 `<ENDPOINT>SuccessFeedbackRoleArn` 및 `<ENDPOINT>FailureFeedbackRoleArn` 속성은 사용자 대신 CloudWatch Logs를 사용할 수 있는 쓰기 액세스 권한을 Amazon SNS에 부여하는 데 사용됩니다. `<ENDPOINT>SuccessFeedbackSampleRate` 속성은 성공적으로 전송된 메시지의 샘플 비율(0-100)을 지정할 때 사용됩니다. `<ENDPOINT>FailureFeedbackRoleArn` 속성을 구성하고 나면, 메시지의 전송 실패가 CloudWatch Logs를 생성합니다.

# AWS 주제 속성을 구성하는 SDK 예제
<a name="topic-attributes-sdks"></a>

다음 코드 예시는 `SetTopicAttributes`의 사용 방법을 보여 줍니다.

------
#### [ CLI ]

**AWS CLI**  
**주제에 대한 속성을 설정하려면**  
다음 `set-topic-attributes`예제에서는 지정된 주제에 `DisplayName`속성을 설정합니다.  

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-west-2:123456789012:MyTopic \
    --attribute-name DisplayName \
    --attribute-value MyTopicDisplayName
```
이 명령은 출력을 생성하지 않습니다.  
+  API 세부 정보는 *AWS CLI 명령 참조*의 [SetTopicAttributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sns/set-topic-attributes.html)를 참조하세요.

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sns.SnsClient;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesRequest;
import software.amazon.awssdk.services.sns.model.SetTopicAttributesResponse;
import software.amazon.awssdk.services.sns.model.SnsException;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class SetTopicAttributes {

    public static void main(String[] args) {
        final String usage = """

                Usage:    <attribute> <topicArn> <value>

                Where:
                   attribute - The attribute action to use. Valid parameters are: Policy | DisplayName | DeliveryPolicy .
                   topicArn - The ARN of the topic.\s
                   value - The value for the attribute.
                """;

        if (args.length < 3) {
            System.out.println(usage);
            System.exit(1);
        }

        String attribute = args[0];
        String topicArn = args[1];
        String value = args[2];

        SnsClient snsClient = SnsClient.builder()
                .region(Region.US_EAST_1)
                .build();

        setTopAttr(snsClient, attribute, topicArn, value);
        snsClient.close();
    }

    public static void setTopAttr(SnsClient snsClient, String attribute, String topicArn, String value) {
        try {
            SetTopicAttributesRequest request = SetTopicAttributesRequest.builder()
                    .attributeName(attribute)
                    .attributeValue(value)
                    .topicArn(topicArn)
                    .build();

            SetTopicAttributesResponse result = snsClient.setTopicAttributes(request);
            System.out.println(
                    "\n\nStatus was " + result.sdkHttpResponse().statusCode() + "\n\nTopic " + request.topicArn()
                            + " updated " + request.attributeName() + " to " + request.attributeValue());

        } catch (SnsException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+  API 세부 정보는 *AWS SDK for Java 2.x API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForJavaV2/sns-2010-03-31/SetTopicAttributes)를 참조하세요.

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.
별도의 모듈에서 클라이언트를 생성하고 내보냅니다.  

```
import { SNSClient } from "@aws-sdk/client-sns";

// The AWS Region can be provided here using the `region` property. If you leave it blank
// the SDK will default to the region set in your AWS config.
export const snsClient = new SNSClient({});
```
SDK 및 클라이언트 모듈을 가져오고 API를 호출합니다.  

```
import { SetTopicAttributesCommand } from "@aws-sdk/client-sns";
import { snsClient } from "../libs/snsClient.js";

export const setTopicAttributes = async (
  topicArn = "TOPIC_ARN",
  attributeName = "DisplayName",
  attributeValue = "Test Topic",
) => {
  const response = await snsClient.send(
    new SetTopicAttributesCommand({
      AttributeName: attributeName,
      AttributeValue: attributeValue,
      TopicArn: topicArn,
    }),
  );
  console.log(response);
  // {
  //   '$metadata': {
  //     httpStatusCode: 200,
  //     requestId: 'd1b08d0e-e9a4-54c3-b8b1-d03238d2b935',
  //     extendedRequestId: undefined,
  //     cfId: undefined,
  //     attempts: 1,
  //     totalRetryDelay: 0
  //   }
  // }
  return response;
};
```
+  자세한 정보는 [AWS SDK for JavaScript 개발자 안내서](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/sns-examples-managing-topics.html#sns-examples-managing-topicsstttopicattributes)를 참조하세요.
+  API 세부 정보는 *AWS SDK for JavaScript API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sns/command/SetTopicAttributesCommand)를 참조하세요.

------
#### [ Kotlin ]

**SDK for Kotlin**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
suspend fun setTopAttr(
    attribute: String?,
    topicArnVal: String?,
    value: String?,
) {
    val request =
        SetTopicAttributesRequest {
            attributeName = attribute
            attributeValue = value
            topicArn = topicArnVal
        }

    SnsClient.fromEnvironment { region = "us-east-1" }.use { snsClient ->
        snsClient.setTopicAttributes(request)
        println("Topic ${request.topicArn} was updated.")
    }
}
```
+  API 세부 정보는 *AWS SDK for Kotlin API 참조*의 [SetTopicAttributes](https://sdk.amazonaws.com/kotlin/api/latest/index.html)를 참조하세요.

------
#### [ PHP ]

**SDK for PHP**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
require 'vendor/autoload.php';

use Aws\Exception\AwsException;
use Aws\Sns\SnsClient;


/**
 * Configure the message delivery status attributes for an Amazon SNS Topic.
 *
 * This code expects that you have AWS credentials set up per:
 * https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html
 */

$SnSclient = new SnsClient([
    'profile' => 'default',
    'region' => 'us-east-1',
    'version' => '2010-03-31'
]);
$attribute = 'Policy | DisplayName | DeliveryPolicy';
$value = 'First Topic';
$topic = 'arn:aws:sns:us-east-1:111122223333:MyTopic';

try {
    $result = $SnSclient->setTopicAttributes([
        'AttributeName' => $attribute,
        'AttributeValue' => $value,
        'TopicArn' => $topic,
    ]);
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}
```
+  API 세부 정보는 *AWS SDK for PHP API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForPHPV3/sns-2010-03-31/SetTopicAttributes)를 참조하세요.

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
# Service class to enable an SNS resource with a specified policy
class SnsResourceEnabler
  # Initializes the SnsResourceEnabler with an SNS resource client
  #
  # @param sns_resource [Aws::SNS::Resource] The SNS resource client
  def initialize(sns_resource)
    @sns_resource = sns_resource
    @logger = Logger.new($stdout)
  end

  # Sets a policy on a specified SNS topic
  #
  # @param topic_arn [String] The ARN of the SNS topic
  # @param resource_arn [String] The ARN of the resource to include in the policy
  # @param policy_name [String] The name of the policy attribute to set
  def enable_resource(topic_arn, resource_arn, policy_name)
    policy = generate_policy(topic_arn, resource_arn)
    topic = @sns_resource.topic(topic_arn)

    topic.set_attributes({
                           attribute_name: policy_name,
                           attribute_value: policy
                         })
    @logger.info("Policy #{policy_name} set successfully for topic #{topic_arn}.")
  rescue Aws::SNS::Errors::ServiceError => e
    @logger.error("Failed to set policy: #{e.message}")
  end

  private

  # Generates a policy string with dynamic resource ARNs
  #
  # @param topic_arn [String] The ARN of the SNS topic
  # @param resource_arn [String] The ARN of the resource
  # @return [String] The policy as a JSON string
  def generate_policy(topic_arn, resource_arn)
    {
      Version: '2008-10-17',
      Id: '__default_policy_ID',
      Statement: [{
        Sid: '__default_statement_ID',
        Effect: 'Allow',
        Principal: { "AWS": '*' },
        Action: ['SNS:Publish'],
        Resource: topic_arn,
        Condition: {
          ArnEquals: {
            "AWS:SourceArn": resource_arn
          }
        }
      }]
    }.to_json
  end
end

# Example usage:
if $PROGRAM_NAME == __FILE__
  topic_arn = 'MY_TOPIC_ARN' # Should be replaced with a real topic ARN
  resource_arn = 'MY_RESOURCE_ARN' # Should be replaced with a real resource ARN
  policy_name = 'POLICY_NAME' # Typically, this is "Policy"

  sns_resource = Aws::SNS::Resource.new
  enabler = SnsResourceEnabler.new(sns_resource)

  enabler.enable_resource(topic_arn, resource_arn, policy_name)
end
```
+  자세한 정보는 [AWS SDK for Ruby 개발자 안내서](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/sns-example-enable-resource.html)를 참조하세요.
+  API 세부 정보는 *AWS SDK for Ruby API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/goto/SdkForRubyV3/sns-2010-03-31/SetTopicAttributes)를 참조하세요.

------
#### [ SAP ABAP ]

**SDK for SAP ABAP API**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap/services/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
    TRY.
        lo_sns->settopicattributes(
            iv_topicarn = iv_topic_arn
            iv_attributename  = iv_attribute_name
            iv_attributevalue = iv_attribute_value ).
        MESSAGE 'Set/updated SNS topic attributes.' TYPE 'I'.
      CATCH /aws1/cx_snsnotfoundexception.
        MESSAGE 'Topic does not exist.' TYPE 'E'.
    ENDTRY.
```
+  API에 대한 세부 정보는 [SAP ABAP용AWS SDK API 참조](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)의 *SetTopicAttributes*를 참조하세요.

------

# 를 사용하여 전송 상태 로깅 구성 CloudFormation
<a name="msg-status-cloudformation"></a>

를 `DeliveryStatusLogging` 사용하여를 구성하려면 JSON 또는 YAML 템플릿을 CloudFormation사용하여 CloudFormation 스택을 생성합니다. 자세한 내용은 CloudFormation 사용 설명서의 `AWS::SNS::Topic` 리소스 `DeliveryStatusLogging` 속성을 참조하세요. 다음은 Amazon SQS 프로토콜의 모든 `DeliveryStatusLogging` 속성으로 새 주제를 생성하거나 기존 주제를 업데이트하기 위한 JSON 및 YAML CloudFormation 템플릿의 예입니다.

`SuccessFeedbackRoleArn` 및 `FailureFeedbackRoleArn`에서 참조되는 IAM 역할에 필요한 CloudWatch Logs 권한이 있는지 확인합니다.

------
#### [ JSON ]

```
"Resources": {
    "MySNSTopic" : {
        "Type" : "AWS::SNS::Topic",
        "Properties" : {
            "TopicName" : "TestTopic",
            "DisplayName" : "TEST",
            "SignatureVersion" : "2",
            "DeliveryStatusLogging" : [{
                "Protocol": "sqs",
                "SuccessFeedbackSampleRate": "45",
                "SuccessFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1",
                "FailureFeedbackRoleArn": "arn:aws:iam::123456789012:role/SNSFailureFeedback_test2"
            }]
        }
    }
}
```

------
#### [ YAML ]

```
Resources:
  MySNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName:TestTopic
      DisplayName:TEST
      SignatureVersion:2
      DeliveryStatusLogging:
       - Protocol: sqs
         SuccessFeedbackSampleRate: 45
         SuccessFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSSuccessFeedback_test1
         FailureFeedbackRoleArn: arn:aws:iam::123456789012:role/SNSFailureFeedback_test2
```

------

# Amazon SNS 메시지 전송 재시도
<a name="sns-message-delivery-retries"></a>

Amazon SNS에서는 각 전송 프로토콜에 대한 *전송 정책*을 정의합니다. 서버 측 오류가 발생할 경우(즉, 구독 엔드포인트를 호스팅하는 시스템을 사용할 수 없게 될 경우) Amazon SNS가 메시지 전송을 재시도하는 방식이 전송 정책에 따라 결정됩니다. 전송 정책이 소진되면 Amazon SNS는 전송 재시도를 중지하고 배달 못한 편지 대기열이 구독에 연결되어 있지 않는 한 메시지를 삭제합니다. 자세한 정보는 [Amazon SNS Dead Letter Queue(DLQ)](sns-dead-letter-queues.md)에서 확인하세요.

## 전송 프로토콜 및 정책
<a name="delivery-policies-for-protocols"></a>

**참고**  
HTTP/S를 제외하고 Amazon SNS에서 정의하는 전송 정책을 변경할 수 없습니다. HTTP/S만 사용자 지정 정책을 지원합니다. [HTTP/S 전송 정책 생성](#creating-delivery-policy)에서 확인하세요.
Amazon SNS는 전송 재시도에 지터링을 적용합니다. 자세한 정보는 *AWS 아키텍처 블로그*의 [지수 백오프 및 지터](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/) 게시물을 참조하세요.
**HTTP/S 엔드포인트에 대한 전체 정책 재시도 시간은 3,600초를 초과할 수 없습니다. 이 값은 고정 한도이며 늘릴 수 없습니다**.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-message-delivery-retries.html)

¹ Firehose 프로토콜을 통한 오류 스로틀링의 경우 Amazon SNS는 고객 관리형 엔드포인트와 동일한 전송 정책을 사용합니다.

## 전송 정책 단계
<a name="delivery-policy-stages"></a>

다음 다이어그램은 전송 정책의 단계를 보여줍니다.

![\[시간을 x 값으로, 초기 전송 시도를 y 값으로 표시하는 x, y축 다이어그램입니다. 전송 정책은 y축에서 즉시 재시도 단계로 시작되고, x축에서 사전 백오프 단계, 백오프 단계, 사후 백오프 단계로 이어집니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-delivery-policy-phases.png)


각 전송 정책은 4단계로 구성됩니다.

1. **즉각 재시도 단계(지연 없음)** – 이 단계는 첫 전송 시도 직후에 발생합니다. 이 단계에서는 재시도 간에 지연이 없습니다.

1. **프리 백오프 단계** – 이 단계는 즉시 재시도 단계 후에 이어집니다. Amazon SNS는 이 단계를 사용하여 백오프 기능을 적용하기 전에 일련의 재시도를 시도합니다. 이 단계에서는 재시도 횟수와 재시도 간의 지연 시간을 지정합니다.

1. **백오프 단계** – 이 단계에서는 재시도 백오프 함수를 사용하여 재시도 간 지연을 제어합니다. 최소 지연 시간과 최대 지연 시간을 설정한 다음 재시도 백오프 함수를 설정하여 최소 지연 시간부터 최대 지연 시간까지 어느 정도 간격으로 지연을 늘릴 것인지를 정의합니다. 백오프 함수는 Arithmetic, Exponential, Geometric 또는 Linear가 될 수 있습니다.

1. **포스트 백오프 단계** – 이 단계에서는 백오프 단계를 따릅니다. 재시도 횟수와 재시도 간의 지연 시간을 지정합니다. 이것이 마지막 단계입니다.

## HTTP/S 전송 정책 생성
<a name="creating-delivery-policy"></a>

*지연 없음*, *프리 백오프*, *백오프*, *포스트 백오프*의 4단계로 구성된 전송 정책을 사용하여 Amazon SNS가 HTTP/S 엔드포인트로 메시지 전송을 재시도하는 방법을 정의할 수 있습니다. 이 정책을 사용하면 기본 재시도 설정을 재정의하고 HTTP 서버의 용량에 맞게 사용자 지정할 수 있습니다.

**주제** 또는 **구독** 수준에서 HTTP/S 전송 정책을 JSON 객체로 설정할 수 있습니다.
+ **주제 수준 정책** - 주제에 연결된 모든 HTTP/S 구독에 적용됩니다. [https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html](https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html) 또는 [https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API 작업을 사용하여 이 정책을 설정합니다.
+ **구독 수준 정책** - 특정 구독에만 적용됩니다. [https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html) 또는 [https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html) API 작업을 사용하여 이 정책을 설정합니다.

또는 CloudFormation 템플릿에서 [AWS::SNS::Subscription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-subscription.html) 리소스를 사용할 수도 있습니다.

HTTP/S 서버의 용량에 따라 전송 정책을 사용자 지정해야 합니다.
+ **모든 구독에 대한 단일 서버** - 주제의 모든 HTTP/S 구독이 동일한 서버를 사용하는 경우 모든 구독에서 일관성을 보장하기 위해 전송 정책을 주제 속성으로 설정합니다.
+ **구독을 위한 다른 서버** - 구독이 다른 서버를 대상으로 하는 경우 특정 서버의 용량에 맞게 각 구독에 대해 고유한 전송 정책을 생성합니다.

요청 정책에서 `Content-Type` 헤더에 대해서도 알림의 미디어 유형을 지정할 수 있습니다. 기본적으로 Amazon SNS 콘텐츠 유형이 `text/plain; charset=UTF-8`로 설정된 HTTP/S 엔드포인트로 모든 알림을 보냅니다. 그러나 요청 정책의 [`headerContentType`](#header-content-type) 필드를 사용하여 이 기본값을 재정의할 수 있습니다.

다음 JSON 객체는 4단계로 구성된 재시도를 사용하여 전송 정책을 정의합니다.

1. **지연 없음 단계** - 즉시 3회를 재시도합니다.

1. **프리 백오프 단계** - 1초 간격으로 2회 재시도합니다.

1. **백오프 단계** - 1\$160초 범위의 지수 지연으로 10회 재시도합니다.

1. **백오프 후 단계** - 고정된 60초 간격으로 35회 재시도합니다.

Amazon SNS는 메시지를 삭제하기 전에 총 **50번의 시도**를 합니다. 모든 재시도 후 전송할 수 없는 메시지를 유지하려면 전송할 수 없는 메시지를 Dead Letter Queue(DLQ)로 이동하도록 구독을 구성합니다. 자세한 내용은 [Amazon SNS Dead Letter Queue(DLQ)](sns-dead-letter-queues.md) 단원을 참조하십시오.

Amazon SNS는 5XX 오류와 429(요청이 너무 많음) 오류를 모두 재시도 가능한 것으로 간주합니다. 이러한 오류에는 전송 정책이 적용됩니다. 다른 모든 오류는 영구 실패로 간주되며 재시도는 시도되지 않습니다.

**참고**  
이 전송 정책은 `maxReceivesPerSecond` 속성을 사용하여 전송 트래픽을 구독당 초당 평균 10개의 메시지로 제한합니다. 이 메커니즘은 높은 트래픽으로 인해 HTTP/S 엔드포인트가 압도되는 것을 방지하는 데 도움이 되지만 평균 전송률을 유지하도록 설계되었으며 엄격한 한도를 적용하지 않습니다. 때때로 전송 트래픽이 지정된 한도를 초과하여 급증할 수 있습니다. 특히 게시 속도가 스로틀링 한도보다 훨씬 높은 경우 더욱 그렇습니다.  
게시(인바운드) 트래픽이 전송(아웃바운드) 속도를 초과하면 메시지 백로그가 생성되고 전송 지연 시간이 길어질 수 있습니다. 이러한 문제를 방지하려면 `maxReceivesPerSecond` 값이 HTTP/S 서버의 용량 및 워크로드 요구 사항에 맞는지 확인합니다.

다음 전송 정책 예제는 `application/json`에 HTTP/S 알림을 위한 기본 콘텐츠 유형을 재정의합니다.

```
{
    "healthyRetryPolicy": {
        "minDelayTarget": 1,
        "maxDelayTarget": 60,
        "numRetries": 50,
        "numNoDelayRetries": 3,
        "numMinDelayRetries": 2,
        "numMaxDelayRetries": 35,
        "backoffFunction": "exponential"
    },
    "throttlePolicy": {
        "maxReceivesPerSecond": 10
    },
    "requestPolicy": {
        "headerContentType": "application/json"
    }
}
```

전송 정책은 **재시도 정책**, **제한 정책** 및 **요청 정책**으로 구성됩니다. 전송 정책에는 **9개의 속성**이 있습니다.


| 정책  | 설명 | 제약 조건 | 
| --- | --- | --- | 
| minDelayTarget | 재시도의 최소 지연 시간입니다.**단위:** 초 | 1\$1최대 지연 시간**기본값:** 20 | 
| maxDelayTarget | 재시도의 최대 지연 시간입니다.**단위:** 초 | 최소 지연 시간\$13,600**기본값:** 20 | 
| numRetries | 즉각 재시도, 프리 백오프, 백오프, 포스트 백오프 단계의 재시도를 모두 포함한 총 재시도 횟수입니다. | 0\$1100**기본값:** 3 | 
| numNoDelayRetries | 재시도 간 지연 없이 즉각 수행되는 재시도 횟수입니다. | 0 이상**기본값:** 0 | 
| numMinDelayRetries | 재시도 간 지정된 최소 지연 시간으로 프리 백오프 단계에서 수행되는 재시도 횟수입니다. | 0 이상**기본값:** 0 | 
| numMaxDelayRetries | 재시도 간 지정된 최대 지연 시간으로 포스트 백오프 단계에서 수행되는 재시도 횟수입니다. | 0 이상**기본값:** 0 | 
| backoffFunction | 재시도 간 백오프에 사용되는 모델입니다. |  다음 4가지 옵션 중 하나: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-message-delivery-retries.html) **기본값:** Linear  | 
| maxReceivesPerSecond  | 구독별 초당 최대 평균 메시지 전송 수입니다. | 1 이상**기본값:** 스로틀링 없음(전송 속도 제한 없음) | 
| headerContentType  | HTTP/S 엔드포인트로 전송되는 알림의 콘텐츠 유형입니다. |  요청 정책이 정의되지 않은 경우 콘텐츠 유형의 기본값은 `text/plain; charset=UTF-8`입니다. 구독에 대해 원시 메시지 전송을 비활성화하거나(기본값) 전송 정책이 주제 수준에서 정의된 경우 지원되는 헤더 콘텐츠 유형은 `application/json` 및 `text/plain`입니다. 구독에서 원시 메시지 전송을 활성화하면 다음과 같은 콘텐츠 유형이 지원됩니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-message-delivery-retries.html)  | 

Amazon SNS에서는 다음 수식을 사용하여 백오프 단계의 재시도 횟수를 계산합니다.

```
numRetries - numNoDelayRetries - numMinDelayRetries - numMaxDelayRetries
```

3가지 파라미터를 사용하여 백오프 단계의 재시도 빈도를 제어할 수 있습니다.
+ **`minDelayTarget`** - 백오프 단계에서 첫 번째 재시도의 지연을 설정합니다.
+ **`maxDelayTarget`** - 백오프 단계에서 마지막 재시도의 지연을 설정합니다.
+ **`backoffFunction`** – Amazon SNS가 첫 번째 재시도부터 마지막 재시도까지의 모든 재시도에 대한 지연을 계산하는 데 사용할 알고리즘을 결정합니다. 가용한 네 가지 재시도 백오프 함수 중에서 선택할 수 있습니다.

다음 다이어그램은 서로 다른 재시도 백오프 함수가 백오프 단계 중 재시도 간의 지연에 미치는 영향을 보여줍니다. 이 예제에 사용되는 전송 정책에는 **총 재시도 횟수 10회**, **최소 지연 시간 5초**, **최대 지연 시간 260초**의 설정이 포함됩니다.
+ **세로 축**에는 각 재시도의 지연(초)이 표시됩니다.
+ **가로 축**은 첫 번째 시도에서 열 번째 시도까지의 재시도 시퀀스를 나타냅니다.

![\[이 다이어그램은 지수, 산술, 선형 및 기하학이라는 네 가지 백오프 함수를 기반으로 10회의 시도에서 재시도 지연 진행이 어떻게 지연되는지 보여줍니다. 색상이 지정된 각 선은 함수의 지연 패턴을 나타냅니다. 지수는 가장 빠른 최대 지연에 도달하여 빠르게 증가하고, 선형은 재시도할 때마다 꾸준히 증가하며, 산술 및 기하는 선형보다 가파르지만 지수보다 덜 빠른 중간 정도의 증가를 나타냅니다. 모든 선은 최소 지연 시간인 5초 경에 시작되어 10번째 재시도까지 최대 지연 시간인 260초로 이동합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/backoff-graph.png)


# Amazon SNS Dead Letter Queue(DLQ)
<a name="sns-dead-letter-queues"></a>

배달 못한 편지 대기열은 Amazon SNS 구독이 구독자에게 성공적으로 배달할 수 없는 메시지를 저장하는 Amazon SQS 대기열입니다. 클라이언트 오류 또는 서버 오류로 인해 배달할 수 없는 메시지는 추가 분석 또는 재처리를 위해 배달 못한 편지 대기열에 보관됩니다. 자세한 내용은 [구독에 대한 Amazon SNS 배달 못한 편지 대기열 구성](sns-configure-dead-letter-queue.md) 및 [Amazon SNS 메시지 전송 재시도](sns-message-delivery-retries.md) 섹션을 참조하세요.

**참고**  
Amazon SNS 구독 및 Amazon SQS 대기열은 동일한 AWS 계정 및 리전에 있어야 합니다.
[FIFO 주제](sns-fifo-topics.md)의 경우 Amazon SQS 대기열을 Amazon SNS 구독에 대한 DLQ(Dead Letter Queue)로 사용할 수 있습니다. FIFO 주제 구독은 FIFO 대기열을 사용하고, 표준 주제 구독은 표준 대기열을 사용합니다.
암호화된 Amazon SQS 대기열을 배달 못한 편지 대기열로 사용하려면 Amazon SNS 서비스 보안 주체에게 AWS KMS API 작업에 대한 액세스 권한을 부여하는 키 정책과 함께 사용자 지정 KMS를 사용해야 합니다. 자세한 정보는 이 가이드의 [서버 측 암호화를 사용한 Amazon SNS 데이터 보안](sns-server-side-encryption.md) 및 *Amazon Simple Queue Service 개발자 안내서*의 [서버 측 암호화(SSE) 및 AWS KMS를 사용하여 Amazon SQS 데이터 보호](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-server-side-encryption.html)를 참조하세요.

## 메시지 전송이 실패하는 이유
<a name="why-do-message-deliveries-fail"></a>

일반적으로 Amazon SNS가 *클라이언트 측* 또는 *서버 측 오류*로 인해 구독된 엔드포인트에 액세스할 수 없으면 메시지 전송이 실패합니다. Amazon SNS 에서 클라이언트 측 오류를 수신하거나 해당 재시도 정책에 지정된 재시도 횟수 이상의 메시지에 대해 서버 측 오류가 계속 수신되면 Amazon SNS는 구독에 배달 못한 편지 대기열이 연결되어 있지 않는 한 메시지를 삭제합니다. 전송이 실패해도 구독의 상태는 바뀌지 않습니다. 자세한 내용은 [Amazon SNS 메시지 전송 재시도](sns-message-delivery-retries.md) 단원을 참조하십시오.

### 클라이언트 측 오류
<a name="client-side-errors"></a>

Amazon SNS에 부실 구독 메타데이터가 있으면 클라이언트 측 오류가 발생할 수 있습니다. 이러한 오류는 일반적으로 소유자가 엔드포인트(예: Amazon SNS 주제를 구독하는 Lambda 함수)를 삭제하거나 소유자가 구독 엔드포인트에 연결된 정책을 변경하여 Amazon SNS에서 엔드포인트에 메시지를 전송하지 못하게 될 경우에 발생합니다. Amazon SNS는 클라이언트 측 오류로 인해 실패한 메시지 전송을 다시 시도하지 않습니다.

### 서버 측 오류
<a name="server-side-errors"></a>

구독 엔드포인트를 담당하는 시스템이 사용 불가능하게 되거나 Amazon SNS의 유효한 요청을 처리할 수 없음을 나타내는 예외를 반환하는 경우 서버 측 오류가 발생할 수 있습니다. 서버 측 오류가 발생하면 Amazon SNS는 선형 또는 지수 백오프 함수를 사용하여 실패한 전송을 재시도합니다. Amazon SQS 또는에서 지원하는 AWS 관리형 엔드포인트로 인해 발생하는 서버 측 오류의 경우 AWS Lambda Amazon SNS 23일 동안 최대 100,015회까지 전송을 재시도합니다.

고객 관리형 엔드포인트(예: HTTP, SMTP, SMS 또는 모바일 푸시)도 서버 측 오류가 발생하는 원인이 될 수 있습니다. Amazon SNS는 이러한 유형의 엔드포인트로 전송 역시 재시도합니다. HTTP 엔드포인트에서 고객이 정의하는 재시도 정책이 지원되지만 Amazon SNS는 SMTP, SMS 및 모바일 푸시 엔드포인트에 대해 내부 전송 재시도 정책을 6시간 동안 50회로 설정합니다.

## DLQ(Dead Letter Queue)의 작동 방식
<a name="how-do-dead-letter-queues-work"></a>

메시지 전송은 구독 수준에서 이루어지기 때문에 배달 못한 편지 대기열은 주제가 아닌 Amazon SNS 구독에 연결됩니다. 이를 통해 각 메시지의 원래 대상 엔드포인트를 보다 쉽게 식별할 수 있습니다.

Amazon SNS 구독에 연결된 배달 못한 편지 대기열은 일반 Amazon SQS 대기열입니다. 메시지 보존 기간에 대한 자세한 정보는 *Amazon Simple Queue Service 개발자 안내서*의 [메시지 관련 할당량](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-quotas.html#quotas-messages)을 참조하세요. Amazon SQS `[SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)` API 작업을 사용하여 메시지 보존 기간을 변경할 수 있습니다. 애플리케이션의 복원력을 높이려면 배달 못한 편지 대기열의 최대 보존 기간을 14일로 설정하는 것이 좋습니다.

## 메시지가 배달 못한 편지 대기열로 이동하는 방식
<a name="how-messages-moved-into-dead-letter-queue"></a>

메시지는 *리드라이브 정책*을 사용하여 배달 못한 편지 대기열로 이동합니다. 리드라이브 정책은 배달 못한 편지 대기열의 ARN을 참조하는 JSON 객체입니다. `deadLetterTargetArn` 속성을 통해 ARN이 지정됩니다. ARN은 Amazon SNS 구독과 동일한 및 리전의 Amazon SQS Amazon SNS 대기열을 가리켜야 합니다. AWS 계정 자세한 내용은 [구독에 대한 Amazon SNS 배달 못한 편지 대기열 구성](sns-configure-dead-letter-queue.md) 단원을 참조하십시오.

다음 JSON 객체는 SNS 구독에 연결된 샘플 리드라이브 정책입니다.

```
{
  "deadLetterTargetArn": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"
}
```

## 배달 못한 편지 대기열로부터 메시지를 이동하는 방법
<a name="how-to-move-messages-out-of-dead-letter-queue"></a>

다음 두 가지 방법을 사용하여 메시지를 배달 못한 편지 대기열로부터 이동할 수 있습니다.
+ **Amazon SQS 소비자 로직 작성 방지** – 배달 못한 편지 대기열을 Lambda 함수에 대한 이벤트 소스로 설정하여 배달 못한 편지 대기열을 비웁니다.
+ **Amazon SQS 소비자 로직 작성 **- Amazon SQS API, AWS SDK 또는 AWS CLI 를 사용하여 배달 못한 편지 대기열의 메시지를 폴링, 처리 및 삭제하기 위한 사용자 지정 소비자 로직을 작성합니다.

## 배달 못한 편지 대기열을 모니터링 및 로깅하는 방법
<a name="how-to-monitor-log-dead-letter-queues"></a>

Amazon CloudWatch 지표를 사용하여 Amazon SNS 구독에 연결된 배달 못한 편지 대기열을 모니터링할 수 있습니다. 모든 Amazon SQS 대기열은 1분 간격으로 CloudWatch 지표를 보냅니다. 자세한 정보는 *Amazon Simple Queue Service 개발자 안내서*의 [Amazon SQS에 사용 가능한 CloudWatch 지표](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-available-cloudwatch-metrics.html)를 참조하세요. 배달 못한 편지 대기열이 있는 모든 Amazon SNS 구독에서도 CloudWatch 지표를 내보냅니다. 자세한 내용은 [CloudWatch를 사용하여 Amazon SNS 주제 모니터링](sns-monitoring-using-cloudwatch.md) 단원을 참조하십시오.

배달 못한 편지 대기열의 활동에 대한 알림을 받으려면 CloudWatch 지표와 경보를 사용할 수 있습니다. 이 지표는 처리 시도 실패로 인해 DLQ로 전송된 메시지를 캡처하지 않으므로 `NumberOfMessagesSent` 지표에 대한 경보를 설정하는 것은 적합하지 않습니다. 대신 처리 실패로 인해 이동한 메시지를 포함하여 DLQ에서 현재 사용할 수 있는 모든 메시지를 캡처하는 `ApproximateNumberOfMessagesVisible` 지표를 사용합니다.

**CloudWatch 경보 설정 예제**

1. `ApproximateNumberOfMessagesVisible` 지표에 대한 [CloudWatch 경보](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)를 만듭니다.

1. 경보 임곗값을 **1**(또는 기대치 및 DLQ 트래픽에 따라 다른 적절한 값)로 설정합니다.

1. 경보가 개시될 경우 알림을 받을 Amazon SNS **주제**를 지정합니다. 이 Amazon SNS 주제는 모든 엔드포인트 유형(예: 이메일 주소, 전화번호 또는 모바일 호출기 앱)에 경보 알림을 전송할 수 있습니다.

CloudWatch Logs를 사용하면 Amazon SNS 전송이 실패하고 메시지가 배달 못한 편지 대기열로 이동한 원인이 되는 예외적인 상황을 조사할 수 있습니다. Amazon SNS는 CloudWatch에 성공한 전송과 실패한 전송을 모두 로그할 수 있습니다. 자세한 내용은 [Amazon SNS 모바일 앱 속성](sns-msg-status.md) 단원을 참조하십시오.

# 구독에 대한 Amazon SNS 배달 못한 편지 대기열 구성
<a name="sns-configure-dead-letter-queue"></a>

배달 못한 편지 대기열은 Amazon SNS 구독이 구독자에게 성공적으로 배달할 수 없는 메시지를 저장하는 Amazon SQS 대기열입니다. 클라이언트 오류 또는 서버 오류로 인해 배달할 수 없는 메시지는 추가 분석 또는 재처리를 위해 배달 못한 편지 대기열에 보관됩니다. 자세한 내용은 [Amazon SNS Dead Letter Queue(DLQ)](sns-dead-letter-queues.md) 및 [Amazon SNS 메시지 전송 재시도](sns-message-delivery-retries.md) 섹션을 참조하세요.

이 페이지에서는 AWS Management Console, AWS SDK, AWS CLI및를 사용하여 Amazon SNS 구독 CloudFormation 에 대한 배달 못한 편지 대기열을 구성하는 방법을 보여줍니다.

**참고**  
[FIFO 주제](sns-fifo-topics.md)의 경우 Amazon SQS 대기열을 Amazon SNS 구독에 대한 DLQ(Dead Letter Queue)로 사용할 수 있습니다. FIFO 주제 구독은 FIFO 대기열을 사용하고, 표준 주제 구독은 표준 대기열을 사용합니다.

## 사전 조건
<a name="dead-letter-queue-prerequisites"></a>

배달 못한 편지 대기열을 구성하려면 먼저 다음 사전 조건을 완료합니다.

1. `MyTopic`이라는 [Amazon SNS 주제 생성](sns-create-topic.md)

1. Amazon SNS 구독의 엔드포인트로 사용할 `MyEndpoint`이라는 [Amazon SQS 대기열을 생성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)합니다.

1. ( 건너뛰기 CloudFormation) [대기열에서 주제를 구독합니다](sns-sqs-as-subscriber.md).

1. Amazon SNS 구독의 배달 못한 편지 대기열로 사용할 `MyDeadLetterQueue`이라는 다른 [Amazon SQS 대기열을 생성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)합니다.

1. Amazon SNS 보안 주체에 Amazon SQS API 작업에 대한 액세스 권한을 부여하려면 `MyDeadLetterQueue`에 대해 다음 대기열 정책을 설정합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "sns.amazonaws.com"
         },
         "Action": "SQS:SendMessage",
         "Resource": "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue",
         "Condition": {
           "ArnEquals": {
             "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:MyTopic"
           }
         }
       }
     ]
   }
   ```

------

## 를 사용하여 Amazon SNS 구독에 대한 배달 못한 편지 대기열을 구성하려면 AWS Management Console
<a name="configure-dead-letter-queue-aws-console"></a>

이 자습서를 시작하기 전에 [사전 조건](#dead-letter-queue-prerequisites)을 완료해야 합니다.

1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs/)에 로그인합니다.

1. [Amazon SQS 대기열을 생성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html)하거나 기존 대기열을 사용하여 대기열의 **세부 정보** 탭에서 대기열의 ARN을 확인합니다.

   ```
   arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue
   ```

1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home)에 로그인합니다.

1. 탐색 창에서 **구독**을 선택합니다.

1. [**구독**] 페이지에서 기존 구독을 선택한 다음 [**편집**]을 선택합니다.

1. **편집 *1234a567-bc89-012d-3e45-6fg7h890123i*** 페이지 에서 **리드라이브 정책(배달 못한 편지 대기열** 섹션을 확장하고 다음을 수행합니다.

   1. **활성**을 선택합니다.

   1. Amazon SQS 대기열의 ARN을 지정합니다.

1. **변경 사항 저장**을 선택합니다.

   구독이 배달 못한 편지 대기열을 사용하도록 구성됩니다.

## AWS SDK를 사용하여 Amazon SNS 구독에 대한 배달 못한 편지 대기열을 구성하려면
<a name="configure-dead-letter-queue-aws-sdk"></a>

이 예제를 실행하기 전에 [사전 조건](#dead-letter-queue-prerequisites)을 완료해야 합니다.

 AWS SDK를 사용하려면 자격 증명으로 구성해야 합니다. [자세한 정보는 *AWS SDK 및 도구 참조 가이드*의 공유 구성 및 자격 증명 파일](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)을 참조하세요.

다음 코드 예시에서는 `SetSubscriptionAttributesRedrivePolicy`를 사용하는 방법을 보여 줍니다.

------
#### [ Java ]

**SDK for Java 1.x**  
 GitHub에 더 많은 내용이 있습니다. [AWS 코드 예 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/java/example_code/sns#code-examples)에서 전체 예를 찾고 설정 및 실행하는 방법을 배워보세요.

```
// Specify the ARN of the Amazon SNS subscription.
String subscriptionArn =
    "arn:aws:sns:us-east-2:123456789012:MyEndpoint:1234a567-bc89-012d-3e45-6fg7h890123i";

// Specify the ARN of the Amazon SQS queue to use as a dead-letter queue.
String redrivePolicy =
    "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}";

// Set the specified Amazon SQS queue as a dead-letter queue
// of the specified Amazon SNS subscription by setting the RedrivePolicy attribute.
SetSubscriptionAttributesRequest request = new SetSubscriptionAttributesRequest()
    .withSubscriptionArn(subscriptionArn)
    .withAttributeName("RedrivePolicy")
    .withAttributeValue(redrivePolicy);
sns.setSubscriptionAttributes(request);
```

------

## 를 사용하여 Amazon SNS 구독에 대한 배달 못한 편지 대기열을 구성하려면 AWS CLI
<a name="configure-dead-letter-queue-aws-cli"></a>

이 자습서를 시작하기 전에 [사전 조건](#dead-letter-queue-prerequisites)을 완료해야 합니다.

1.  AWS CLI를 설치하고 구성합니다. 자세한 정보는 [https://docs.aws.amazon.com/cli/latest/userguide/](https://docs.aws.amazon.com/cli/latest/userguide/)를 참조하세요.

1. 다음 명령을 사용합니다.

   ```
   aws sns set-subscription-attributes \
   --subscription-arn arn:aws:sns:us-east-2:123456789012:MyEndpoint:1234a567-bc89-012d-3e45-6fg7h890123i
   --attribute-name RedrivePolicy
   --attribute-value "{\"deadLetterTargetArn\": \"arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue\"}"
   ```

## 를 사용하여 Amazon SNS 구독에 대한 배달 못한 편지 대기열을 구성하려면 CloudFormation
<a name="configure-dead-letter-queue-aws-cloudformation"></a>

이 자습서를 시작하기 전에 [사전 조건](#dead-letter-queue-prerequisites)을 완료해야 합니다.

1. 다음 JSON 코드를 `MyDeadLetterQueue.json`이라는 파일에 복사합니다.

   ```
   {
     "Resources": {
       "mySubscription": {
         "Type" : "AWS::SNS::Subscription",
         "Properties" : {
           "Protocol": "sqs",
           "Endpoint": "arn:aws:sqs:us-east-2:123456789012:MyEndpoint",
           "TopicArn": "arn:aws:sns:us-east-2:123456789012:MyTopic",
           "RedrivePolicy": {
             "deadLetterTargetArn":
               "arn:aws:sqs:us-east-2:123456789012:MyDeadLetterQueue"
           }
         }
       }
     }
   }
   ```

1. [CloudFormation 콘솔](https://console.aws.amazon.com/cloudformation/)에 로그인합니다.

1. [**Select Template**] 페이지에서 [**Upload a template to Amazon S3**]를 선택하고, `MyDeadLetterQueue.json` 파일을 선택하고 나서 [**Next**]를 선택합니다.

1. **세부 정보 지정** 페이지에서 **스택 이름**에 `MyDeadLetterQueue`를 입력한 후 **다음**을 선택합니다.

1. **옵션** 페이지에서 **다음**을 선택합니다.

1. **검토** 페이지에서 **생성**을 선택합니다.

   CloudFormation 가 `MyDeadLetterQueue` 스택 생성을 시작하고 **CREATE\$1IN\$1PROGRESS** 상태를 표시합니다. 프로세스가 완료되면 **CREATE\$1COMPLETE** 상태가 CloudFormation 표시됩니다.