

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

# 애플리케이션 간 메시징에 Amazon SNS 사용
<a name="sns-system-to-system-messaging"></a>

Amazon SNS는 마이크로서비스, 분산 시스템 및 서버리스 애플리케이션을 지원하는 구독자와 게시자를 분리하여 애플리케이션 간(A2A) 메시징을 간소화합니다. 메시지는 Amazon SNS 주제로 전송되며, 여기서 필터링하여 Lambda, Amazon SQS 또는 HTTP 엔드포인트와 같은 구독자에게 전달할 수 있습니다. 전송에 실패하면 추가 분석 또는 재처리를 위해 메시지가 데드 레터 대기열에 저장됩니다.

![\[Amazon SNS는 주제를 사용하여 구독자로부터 게시자를 분리하여 애플리케이션 간 메시징을 용이하게 합니다. 시스템 또는 서비스의 메시지는 Amazon SNS 주제를 통해 라우팅되며, 여기서 필터링하여 Lambda, Amazon SQS 또는 이메일 시스템과 같은 구독자에게 배포할 수 있습니다. 전송에 실패하면 메시지가 나중에 분석하거나 재처리할 수 있도록 데드 레터 대기열에 저장됩니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-a2a-overview.png)


# Firehose 전송 스트림으로 팬아웃
<a name="sns-firehose-as-subscriber"></a>

[전송 스트림](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html)에서 Amazon SNS 주제를 구독하면 추가 스토리지 및 분석 엔드포인트에 알림을 보낼 수 있습니다. Amazon SNS 주제에 게시된 메시지는 구독한 Firehose 전송 스트림으로 전송되고 Firehose에 구성된 대로 대상에 전송됩니다. 구독 소유자는 최대 5개의 Firehose 전송 스트림에서 Amazon SNS 주제를 구독할 수 있습니다. 각 Firehose 전송 스트림에는 초당 요청 및 처리량에 대한 [기본 할당량](https://docs.aws.amazon.com/firehose/latest/dev/limits.html)이 있습니다. 이 제한으로 인해 전달된 메시지(아웃바운드 트래픽)보다 게시된 메시지(인바운드 트래픽)가 더 많을 수 있습니다. 아웃바운드 트래픽보다 인바운드 트래픽이 더 많은 경우 구독에 큰 메시지 백로그가 누적되어 메시지 전송 대기 시간이 길어집니다. 워크로드에 부정적인 영향을 미치지 않도록 게시 속도에 따라 [할당량 증가](https://support.console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase)를 요청할 수 있습니다.

Firehose 전송 스트림을 통해 Amazon SNS 알림을 Amazon Simple Storage Service(Amazon S3), Amazon Redshift, Amazon OpenSearch Service(OpenSearch Service) 및 Datadog, New Relic, MongoDB, Splunk와 같은 서드 파티 서비스 공급자로 팬아웃할 수 있습니다.

예를 들어 이 기능을 사용하여 규정 준수, 아카이브 또는 기타 목적을 위해 Amazon S3 버킷의 주제로 전송된 메시지를 영구 저장할 수 있습니다. 이 작업을 수행하려면 Amazon S3 버킷 대상이 있는 Firehose 전송 스트림을 만들고 해당 전송 스트림에서 Amazon SNS 주제를 구독합니다. 또 다른 예로 Amazon SNS 주제로 전송된 메시지에 대한 분석을 수행하려면 OpenSearch Service 인덱스 대상이 있는 전송 스트림을 만듭니다. 그런 다음 Firehose 전송 스트림에서 Amazon SNS 주제를 구독할 수 있습니다.

Amazon SNS는 Firehose 엔드포인트로 전송된 알림에 대한 메시지 전송 상태 로깅도 지원합니다. 자세한 내용은 [Amazon SNS 메시지 전송 상태](sns-topic-attributes.md) 섹션을 참조하세요.

# Firehose 전송 스트림에서 Amazon SNS 주제를 구독하기 위한 사전 조건
<a name="prereqs-kinesis-data-firehose"></a>

전송 스트림에서 SNS 주제를 구독하려면에 다음이 있어야 AWS 계정 합니다.
+ 표준 SNS 주제. 자세한 내용은 [Amazon SNS 주제 생성](sns-create-topic.md) 단원을 참조하십시오.
+ Firehose 전송 스트림 자세한 정보는 *Amazon Data Firehose 개발자 안내서*의 [전송 스트림 생성](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html) 및 [애플리케이션에 Firehose 리소스에 대한 액세스 권한 부여](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html#access-to-firehose) 섹션을 참조하세요.
+ Amazon SNS 서비스 보안 주체를 신뢰하고 전송 스트림에 쓸 수 있는 권한이 있는 AWS Identity and Access Management (IAM) 역할입니다. 구독을 생성할 때 이 역할의 Amazon 리소스 이름(ARN)을 `SubscriptionRoleARN`으로 입력합니다. Amazon SNS는 이 역할을 맡아 Amazon SNS가 Firehose 전송 스트림에 레코드를 넣을 수 있도록 합니다.

  다음 정책 예는 권장 권한을 보여 줍니다.

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": [
          "firehose:DescribeDeliveryStream",
          "firehose:ListDeliveryStreams",
          "firehose:ListTagsForDeliveryStream",
          "firehose:PutRecord",
          "firehose:PutRecordBatch"
        ],
        "Resource": [
          "arn:aws:firehose:us-east-1:111111111111:deliverystream/firehose-sns-delivery-stream"
        ],
        "Effect": "Allow"
      }
    ]
  }
  ```

------

  Firehose 사용에 대한 전체 권한을 제공하려면 AWS 관리형 정책를 사용할 수도 있습니다`AmazonKinesisFirehoseFullAccess`. 또는 Firehose 사용에 대한 더 엄격한 권한을 제공하기 위해 자체 정책을 만들 수 있습니다. 정책은 최소한 특정 전송 스트림에서 `PutRecord` 작업을 실행할 수 있는 권한을 제공해야 합니다.

  어떤 경우든 Amazon SNS 서비스 주체를 포함하도록 신뢰 관계를 편집해야 합니다. 예제:

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

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "sns.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }
  ```

------

  역할 생성에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스에 권한을 위임할 역할 생성을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html).

이러한 요구 사항을 완료한 후 [전송 스트림에서 SNS 주제를 구독](firehose-endpoints-subscribe.md)할 수 있습니다.

# Firehose 전송 스트림에서 Amazon SNS 주제 구독
<a name="firehose-endpoints-subscribe"></a>

Amazon SNS 알림을 [전송 스트림](sns-firehose-as-subscriber.md)으로 전송하려면 먼저 모든 [전제 조건](prereqs-kinesis-data-firehose.md)을 처리했는지 확인하세요. 지원되는 엔드포인트 목록은 *Amazon Web Services 일반 참조*에서 [엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/fh.html) 섹션을 참조하세요.

**Firehose 전송 스트림에서 주제를 구독하는 방법**

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

1. 탐색 창에서 **Subscriptions**를 선택합니다.

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

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

   1. **주제 ARN**에서 표준 주제의 Amazon 리소스 이름(ARN)을 선택합니다.

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

   1. **엔드포인트**에서 Amazon SNS로부터 알림을 받을 수 있는 Firehose 전송 스트림의 ARN을 선택합니다.

   1. **구독 역할 ARN**에서 Firehose 전송 스트림에 쓰기 위해 생성한 AWS Identity and Access Management (IAM) 역할의 ARN을 지정합니다. 자세한 내용은 [Firehose 전송 스트림에서 Amazon SNS 주제를 구독하기 위한 사전 조건](prereqs-kinesis-data-firehose.md) 섹션을 참조하세요.

   1. (선택 사항) 게시된 메시지에서 Amazon SNS 메타데이터를 제거하려면 **원시 메시지 전송 사용**을 선택합니다. 자세한 내용은 [Amazon SNS 원시 메시지 전송](sns-large-payload-raw-message-delivery.md) 섹션을 참조하세요.

1. (선택 사항) 필터 정책을 구성하려면 **구독 필터 정책** 섹션을 확장합니다. 자세한 내용은 [Amazon SNS 구독 필터 정책](sns-subscription-filter-policies.md) 섹션을 참조하세요.

1. (선택 사항) 구독에 대한 배달 못한 편지 대기열을 구성하려면 **리드라이브 정책(배달 못한 편지 대기열)** 섹션을 확장합니다. 자세한 내용은 [Amazon SNS Dead Letter Queue(DLQ)](sns-dead-letter-queues.md) 섹션을 참조하세요.

1. **구독 생성**을 선택합니다.

콘솔에서 구독을 만들고 구독의 **세부 정보** 페이지를 엽니다.

# 여러 전송 스트림 대상에서 Amazon SNS 메시지 관리
<a name="firehose-working-with-destinations"></a>

[전송 스트림](sns-firehose-as-subscriber.md)을 사용하면 여러 대상에서 Amazon SNS 메시지를 관리할 수 있으므로 스토리지, 인덱싱 및 분석을 위해 Amazon S3, Amazon OpenSearch Service, Amazon Redshift 및 HTTP 엔드포인트와 통합할 수 있습니다. 메시지 형식 지정 및 전송을 올바르게 구성하면 나중에 처리할 수 있도록 Amazon SNS 알림을 Amazon S3에 저장하고, Amazon Athena를 사용하여 구조화된 메시지 데이터를 분석하고, 실시간 검색 및 시각화를 위해 OpenSearch의 메시지를 인덱싱하고, 고급 쿼리를 위해 Amazon Redshift의 아카이브를 구조화할 수 있습니다.

# Amazon S3 대상에 Amazon SNS 메시지 저장 및 분석
<a name="firehose-s3-destinations"></a>

이 주제에서는 전송 스트림이 Amazon Simple Storage Service(Amazon S3)에 데이터를 게시하는 방법을 설명합니다.

![\[메시지 처리용 Amazon 서비스의 통합 및 워크플로입니다. 이는 게시자가 Amazon SNS 주제로 메시지를 전송하는 방법을 보여 줍니다. 그러면 여러 Amazon SQS 대기열과 Data Firehose 전송 스트림으로 메시지가 팬아웃됩니다. 여기서 메시지를 Lambda 함수로 처리하거나 Amazon S3 버킷에 지속적으로 저장할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/firehose-architecture-s3.png)


**Topics**
+ [Amazon S3 대상의 스토리지에 알림 형식 지정](firehose-archived-message-format-S3.md)
+ [Athena를 사용하여 Amazon S3에 저장된 메시지 분석](firehose-message-analysis-s3.md)

# Amazon S3 대상의 스토리지에 Amazon SNS 알림 형식 지정
<a name="firehose-archived-message-format-S3"></a>

다음 예제에서는 가독성을 위해 들여쓰기를 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷으로 전송된 Amazon SNS 알림을 보여줍니다.

**참고**  
이 예에서는 게시된 메시지에 대해 원시 메시지 전송 기능이 사용 중지됩니다. 원시 메시지 전송이 사용 중지되면 Amazon SNS는 이러한 속성을 포함하여 메시지에 JSON 메타데이터를 추가합니다.  
`Type`
`MessageId`
`TopicArn`
`Subject`
`Timestamp`
`UnsubscribeURL`
`MessageAttributes`
원시 전송에 대한 자세한 정보는 [Amazon SNS 원시 메시지 전송](sns-large-payload-raw-message-delivery.md)에서 확인하세요.

```
{
    "Type": "Notification",
    "MessageId": "719a6bbf-f51b-5320-920f-3385b5e9aa56",
    "TopicArn": "arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic",     
    "Subject": "My 1st subject",
    "Message": "My 1st body",
    "Timestamp": "2020-11-26T23:48:02.032Z",
    "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5",
    "MessageAttributes": {
        "myKey1": {
            "Type": "String",
            "Value": "myValue1"
        },
        "myKey2": {
            "Type": "String",
            "Value": "myValue2"
        }
    }
 }
```

다음 예제에서는 전송 스트림을 통해 동일한 Amazon S3 버킷으로 전송된 세 개의 SNS 메시지를 보여줍니다. 버퍼링이 적용되고 줄 바꿈은 각 메시지를 구분합니다.

```
{"Type":"Notification","MessageId":"d7d2513e-6126-5d77-bbe2-09042bd0a03a","TopicArn":"arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic","Subject":"My 1st subject","Message":"My 1st body","Timestamp":"2020-11-27T00:30:46.100Z","UnsubscribeURL":"https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:313276652360:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5","MessageAttributes":{"myKey1":{"Type":"String","Value":"myValue1"},"myKey2":{"Type":"String","Value":"myValue2"}}}
{"Type":"Notification","MessageId":"0c0696ab-7733-5bfb-b6db-ce913c294d56","TopicArn":"arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic","Subject":"My 2nd subject","Message":"My 2nd body","Timestamp":"2020-11-27T00:31:22.151Z","UnsubscribeURL":"https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:313276652360:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5","MessageAttributes":{"myKey1":{"Type":"String","Value":"myValue1"}}}
{"Type":"Notification","MessageId":"816cd54d-8cfa-58ad-91c9-8d77c7d173aa","TopicArn":"arn:aws:sns:us-east-1:333333333333:my-kinesis-test-topic","Subject":"My 3rd subject","Message":"My 3rd body","Timestamp":"2020-11-27T00:31:39.755Z","UnsubscribeURL":"https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:313276652360:my-kinesis-test-topic:0b410f3c-ee5e-49d8-b59b-3b4aa6d8fcf5"}
```

# Athena를 사용하여 Amazon S3에 저장된 Amazon SNS 메시지 분석
<a name="firehose-message-analysis-s3"></a>

이 페이지에서는 전송 스트림을 통해 Amazon Simple Storage Service(Amazon S3) 대상으로 전송된 Amazon SNS 메시지를 분석하는 방법을 설명합니다.

**Firehose 전송 스트림을 통해 Amazon S3 대상으로 전송된 SNS 메시지를 분석하는 방법**

1. Amazon S3 리소스를 구성합니다. 지침은 *Amazon Simple Storage Service 사용 설명서*의 [버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) 및 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3 버킷 작업](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)을 참조하세요.

1. 전송 스트림을 구성합니다. 설명은 *Amazon Kinesis Data Firehose 개발자 안내서*의 [Amazon S3의 대상 선택](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-s3)을 참조하세요.

1. [Amazon Athena](https://console.aws.amazon.com/athena)를 사용하여 표준 SQL로 Amazon S3 객체를 쿼리합니다. 자세한 정보는 *Amazon Athena 사용 설명서*의 [시작하기](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)를 참조하세요.

## 쿼리 예
<a name="example-s3-query"></a>

이번 쿼리 예에서는 다음과 같이 가정합니다.
+ 메시지는 `default` 스키마의 `notifications` 테이블에 저장됩니다.
+ `notifications` 테이블에는 유형이 `string`인 `timestamp` 열이 포함되어 있습니다.

다음 쿼리는 지정된 날짜 범위에 수신된 모든 SNS 메시지를 반환합니다.

```
SELECT * 
FROM default.notifications
WHERE from_iso8601_timestamp(timestamp) BETWEEN TIMESTAMP '2020-12-01 00:00:00' AND TIMESTAMP '2020-12-02 00:00:00';
```

# Amazon SNS 메시지를 Amazon OpenSearch Service 대상과 통합
<a name="firehose-elasticsearch-destinations"></a>

이 섹션에서는 전송 스트림이 Amazon OpenSearch Service(OpenSearch Service)에 데이터를 게시하는 방법을 설명합니다.

![\[게시자는 Amazon SNS 주제로 메시지를 전송한 다음 이러한 메시지를 여러 Amazon SQS 대기열에 배포합니다. 이러한 대기열의 메시지는 Lambda 함수에서 처리하거나 Data Firehose 전송 스트림을 통해 Amazon OpenSearch Service로 전송하여 검색 가능한 메시지 인덱스를 생성할 수 있습니다. 이 설정은 AWS 서비스를 사용하는 고급 메시지 라우팅 및 처리 시나리오를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/firehose-architecture-es.png)


**Topics**
+ [아카이브된 메시지 형식](firehose-archived-message-format-elasticsearch.md)
+ [메시지 분석](firehose-message-analysis-elasticsearch.md)

# OpenSearch Service 인덱스에 Amazon SNS 알림 저장 및 형식 지정
<a name="firehose-archived-message-format-elasticsearch"></a>

다음 예제에서는 `my-index`라는 Amazon OpenSearch Service(OpenSearch Service) 인덱스로 전송된 Amazon SNS 알림을 보여줍니다. 이 인덱스에는 `Timestamp` 필드에 시간 필터 필드가 있습니다. SNS 알림은 페이로드의 `_source` 속성에 있습니다.

**참고**  
이 예에서는 게시된 메시지에 대해 원시 메시지 전송 기능이 사용 중지됩니다. 원시 메시지 전송이 사용 중지되면 Amazon SNS는 이러한 속성을 포함하여 메시지에 JSON 메타데이터를 추가합니다.  
`Type`
`MessageId`
`TopicArn`
`Subject`
`Timestamp`
`UnsubscribeURL`
`MessageAttributes`
원시 전송에 대한 자세한 정보는 [Amazon SNS 원시 메시지 전송](sns-large-payload-raw-message-delivery.md)에서 확인하세요.

```
{
  "_index": "my-index",
  "_type": "_doc",
  "_id": "49613100963111323203250405402193283794773886550985932802.0",
  "_version": 1,
  "_score": null,
  "_source": {
    "Type": "Notification",
    "MessageId": "bf32e294-46e3-5dd5-a6b3-bad65162e136",
    "TopicArn": "arn:aws:sns:us-east-1:111111111111:my-topic",
    "Subject": "Sample subject",
    "Message": "Sample message",
    "Timestamp": "2020-12-02T22:29:21.189Z",
    "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:b5aa9bc1-9c3d-452b-b402-aca2cefc63c9",
    "MessageAttributes": {
      "my_attribute": {
        "Type": "String",
        "Value": "my_value"
      }
    }
  },
  "fields": {
    "Timestamp": [
      "2020-12-02T22:29:21.189Z"
    ]
  },
  "sort": [
    1606948161189
  ]
}
```

# OpenSearch Service 대상에 대한 Amazon SNS 메시지 분석
<a name="firehose-message-analysis-elasticsearch"></a>

이 주제에서는 전송 스트림을 통해 Amazon OpenSearch Service(OpenSearch Service) 대상으로 전송된 Amazon SNS 메시지를 분석하는 방법을 설명합니다.

**Firehose 전송 스트림을 통해 OpenSearch Service 대상으로 전송된 SNS 메시지를 분석하는 방법**

1. OpenSearch Service 리소스를 구성합니다. 지침은 *Amazon OpenSearch Service 개발자 가이드*의 [Amazon OpenSearch Service 시작하기](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/es-gsg.html)를 참조하세요.

1. 전송 스트림을 구성합니다. 설명은 [Amazon Kinesis Data Firehose 개발자 가이드](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-elasticsearch)의 *OpenSearch Service의 대상 선택*을 참조하세요.

1. OpenSearch Service 쿼리와 Kibana를 사용하여 쿼리를 실행합니다. 자세한 내용은 *Amazon OpenSearch Service 개발자 가이드*의 [3단계: OpenSearch Service 도메인에서 문서 검색](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/es-gsg-search.html) 및 [Kibana](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/es-kibana.html)를 참조하세요.

## 예제 쿼리
<a name="example-es-query"></a>

다음 예에서는 지정된 날짜 범위에 수신된 모든 SNS 메시지에 대한 `my-index` 인덱스를 쿼리합니다.

```
POST https://search-my-domain.us-east-1.es.amazonaws.com/my-index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "Timestamp": {
              "gte": "2020-12-08T00:00:00.000Z",
              "lte": "2020-12-09T00:00:00.000Z",
              "format": "strict_date_optional_time"
            }
          }
        }
      ]
    }
  }
}
```

# Amazon Redshift 대상에서 Amazon SNS 메시지 전송 및 분석 구성
<a name="firehose-redshift-destinations"></a>

이 주제에서는 Amazon SNS 알림을 전송 스트림으로 팬아웃한 다음 Amazon Redshift에 데이터를 게시하는 방법을 설명합니다. 이 설정을 사용하면 Amazon Redshift 데이터베이스에 연결하고 SQL 쿼리 도구를 사용하여 데이터베이스에서 특정 기준에 일치하는 Amazon SNS 메시지를 검색할 수 있습니다.

![\[발신자가 Amazon SNS 주제에 게시한 메시지는 Lambda 함수에서 처리할 수 있도록 여러 Amazon SQS 대기열에 배포되며, Data Firehose 전송 스트림을 통해 Amazon Redshift 클러스터로 전송하여 메시지 데이터 웨어하우스에 저장 및 분석합니다. 이 설정은 AWS 서비스를 사용한 효과적인 메시지 처리 및 데이터 웨어하우징 아키텍처를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/firehose-architecture-rs.png)


**Topics**
+ [Amazon Redshift 테이블에서 메시지 아카이브 구성](firehose-archive-table-structure-redshift.md)
+ [Amazon Redshift 대상에 저장된 메시지 분석](firehose-message-analysis-redshift.md)

# Amazon Redshift 테이블에서 Amazon SNS 메시지 아카이브 구성
<a name="firehose-archive-table-structure-redshift"></a>

Amazon Redshift 엔드포인트의 경우 Amazon SNS 메시지는 테이블의 행으로 아카이브됩니다. 다음은 데이터가 저장되는 방법의 예제입니다.

**참고**  
이 예에서는 게시된 메시지에 대해 원시 메시지 전송 기능이 사용 중지됩니다. 원시 메시지 전송이 사용 중지되면 Amazon SNS는 이러한 속성을 포함하여 메시지에 JSON 메타데이터를 추가합니다.  
`Type`
`MessageId`
`TopicArn`
`Subject`
`Message`
`Timestamp`
`UnsubscribeURL`
`MessageAttributes`
원시 전송에 대한 자세한 정보는 [Amazon SNS 원시 메시지 전송](sns-large-payload-raw-message-delivery.md)에서 확인하세요.  
Amazon SNS는 이 목록에 표시된 대문자를 사용하여 메시지에 속성을 추가하지만 Amazon Redshift 테이블의 열 이름은 모두 소문자로 표시됩니다. Amazon Redshift 엔드포인트에 대한 JSON 메타데이터를 변환하려면 `COPY` 명령을 사용할 수 있습니다. 자세한 정보는 *Amazon Redshift 데이터베이스 개발자 안내서*의 [JSON 예에서 복사](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-copy-from-json) 및 ['auto ignorecase' 옵션을 사용하여 JSON 데이터에서 로드](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#copy-from-json-examples-using-auto-ignorecase)를 참조하세요.


|  type  |  messageid  |  topicarn  |  subject  |  message  |  timestamp  |  unsubscribeurl  |  messageattributes  | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
|  알림  |  ea544832-a0d8-581d-9275-108243c46103  |  arn:aws:sns:us-east-1:111111111111:my-topic  |  샘플 제목  |  샘플 메시지  |  2020-12-02T00:33:32.272Z  |  https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:326deeeb-cbf4-45da-b92b-ca77a247813b  |  \$1\$1"my\$1attribute\$1":\$1\$1"Type\$1":\$1"String\$1",\$1"Value\$1":\$1"my\$1value\$1"\$1\$1  | 
|  Notification  |  ab124832-a0d8-581d-9275-108243c46114  |  arn:aws:sns:us-east-1:111111111111:my-topic  |  샘플 제목 2  |  샘플 메시지 2  |  2020-12-03T00:18:11.129Z  |  https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:326deeeb-cbf4-45da-b92b-ca77a247813b  |  \$1\$1"my\$1attribute2\$1":\$1\$1"Type\$1":\$1"String\$1",\$1"Value\$1":\$1"my\$1value\$1"\$1\$1  | 
|  Notification  |  ce644832-a0d8-581d-9275-108243c46125  |  arn:aws:sns:us-east-1:111111111111:my-topic  |  샘플 제목 3  |  샘플 메시지 3  |  2020-12-09T00:08:44.405Z  |  https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:111111111111:my-topic:326deeeb-cbf4-45da-b92b-ca77a247813b  |  \$1\$1"my\$1attribute3\$1":\$1\$1"Type\$1":\$1"String\$1",\$1"Value\$1":\$1"my\$1value\$1"\$1\$1  | 

Amazon Redshift 엔드포인트로 알림을 팬아웃하는 방법에 대한 자세한 정보는 [Amazon Redshift 대상에서 Amazon SNS 메시지 전송 및 분석 구성](firehose-redshift-destinations.md)에서 확인하세요.

# Amazon Redshift 대상에 저장된 Amazon SNS 메시지 분석
<a name="firehose-message-analysis-redshift"></a>

이 주제에서는 전송 스트림을 통해 Amazon Redshift 대상으로 전송된 Amazon SNS 메시지를 분석하는 방법을 설명합니다.

**Firehose 전송 스트림을 통해 Amazon Redshift 대상으로 전송된 SNS 메시지를 분석하는 방법**

1. Amazon Redshift 리소스를 구성합니다. 지침은 *Amazon Redshift 시작 안내서*의 [Amazon Redshift 시작하기](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html)를 참조하세요.

1. 전송 스트림을 구성합니다. 설명은 *Amazon Data Firehose 개발자 안내서*의 [Amazon Redshift의 대상 선택](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-redshift)을 참조하세요.

1. 쿼리를 실행합니다. 자세한 정보는 *Amazon Redshift 관리 가이드*의 [쿼리 편집기를 사용하여 데이터베이스 쿼리](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor.html)를 참조하세요.

## 예제 쿼리
<a name="example-rs-query"></a>

이번 쿼리 예에서는 다음과 같이 가정합니다.
+ 메시지는 기본 `public` 스키마의 `notifications` 테이블에 저장됩니다.
+ SNS 메시지의 `Timestamp` 속성은 열 데이터 유형이 `timestamptz`인 테이블의 `timestamp` 열에 저장됩니다.
**참고**  
Amazon Redshift 엔드포인트에 대한 JSON 메타데이터를 변환하려면 `COPY` 명령을 사용할 수 있습니다. 자세한 정보는 *Amazon Redshift 데이터베이스 개발자 안내서*의 [JSON 예에서 복사](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#r_COPY_command_examples-copy-from-json) 및 ['auto ignorecase' 옵션을 사용하여 JSON 데이터에서 로드](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY_command_examples.html#copy-from-json-examples-using-auto-ignorecase)를 참조하세요.

다음 쿼리는 지정된 날짜 범위에 수신된 모든 SNS 메시지를 반환합니다.

```
SELECT *
FROM public.notifications
WHERE timestamp > '2020-12-01T09:00:00.000Z' AND timestamp < '2020-12-02T09:00:00.000Z';
```

# HTTP 대상으로 Amazon SNS 메시지를 전송하도록 구성
<a name="firehose-http-destinations"></a>

이 주제에서는 전송 스트림이 HTTP 엔드포인트에 데이터를 게시하는 방법을 설명합니다.

![\[Amazon SNS 주제에 대한 게시자이며, 그런 다음 여러 Amazon SQS 대기열에 메시지를 배포합니다. 이러한 메시지는 Lambda 함수에서 처리되며 Data Firehose 전송 스트림을 통해 HTTP 엔드포인트로 전송됩니다. 이 설정은 AWS 서비스 가 함께 작동하여 메시지 처리 및 외부 HTTP 서비스와의 통합을 용이하게 하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/firehose-architecture-http.png)


**Topics**
+ [HTTP 대상으로 전송하기 위한 알림 형식](firehose-delivered-message-format-http.md)

# HTTP 대상으로 전송하기 위한 Amazon SNS 알림 형식
<a name="firehose-delivered-message-format-http"></a>

다음은 전송 스트림을 통해 HTTP 엔드포인트로 전송되는 Amazon SNS의 HTTP POST 요청 본문의 예제입니다. Amazon SNS 알림은 레코드 속성 내 base64 페이로드로 인코딩됩니다.

**참고**  
이 예에서는 게시된 메시지에 대해 원시 메시지 전송 기능이 사용 중지됩니다. 원시 전송에 대한 자세한 정보는 [Amazon SNS 원시 메시지 전송](sns-large-payload-raw-message-delivery.md)에서 확인하세요.

```
"body": {
    "requestId": "ebc9e8b2-fce3-4aef-a8f1-71698bf8175f",
    "timestamp": 1606255960435,
    "records": [
      {
        "data": "eyJUeXBlIjoiTm90aWZpY2F0aW9uIiwiTWVzc2FnZUlkIjoiMjFkMmUzOGQtMmNhYi01ZjYxLTliYTItYmJiYWFhYzg0MGY2IiwiVG9waWNBcm4iOiJhcm46YXdzOnNuczp1cy1lYXN0LTE6MTExMTExMTExMTExOm15LXRvcGljIiwiTWVzc2FnZSI6IlNhbXBsZSBtZXNzYWdlIGZvciBBbWF6b24gS2luZXNpcyBEYXRhIEZpcmVob3NlIGVuZHBvaW50cyIsIlRpbWVzdGFtcCI6IjIwMjAtMTEtMjRUMjI6MDc6MzEuNjY3WiIsIlVuc3Vic2NyaWJlVVJMIjoiaHR0cHM6Ly9zbnMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vP0FjdGlvbj1VbnN1YnNjcmliZSZTdWJzY3JpcHRpb25Bcm49YXJuOmF3czpzbnM6MTExMTExMTExMTExOm15LXRvcGljOjAxYjY5MTJjLTAwNzAtNGQ4Yi04YjEzLTU1NWJmYjc2ZTdkNCJ9"
      }
    ]
  }
```

# Amazon SNS 메시지 아카이빙 및 분석: 항공사 발권 플랫폼의 사용 사례 예제
<a name="firehose-example-use-case"></a>

이 주제에서는 Amazon SNS 메시지를 아카이브 및 분석하기 위한 일반적인 사용 사례에 대한 자습서를 제공합니다.

이 사용 사례의 배경은 규제된 환경에서 작동하는 항공권 발권 플랫폼입니다.

1. 이 플랫폼은 회사가 모든 티켓 판매 내역을 최소 5년 동안 아카이브하도록 요구하는 규정 준수 프레임워크의 적용을 받습니다.

1. 데이터 보존에 대한 규정 준수 목표를 달성하기 위해 회사는 전송 스트림에서 기존 Amazon SNS 주제를 구독합니다.

1. 전송 스트림의 대상은 Amazon Simple Storage Service(Amazon S3) 버킷입니다. 이 구성을 사용하면 SNS 주제에 게시된 모든 이벤트가 Amazon S3 버킷에 아카이브됩니다.

다음 다이어그램은 이 구성의 아키텍처를 보여줍니다.

![\[티켓 판매 데이터를 처리하고 보관하는 방법을 보여주는 항공사 티켓팅 플랫폼의 AWS 아키텍처입니다. Amazon SNS 주제를 통해 Lambda 함수의 데이터 흐름을 보여줍니다. 그런 다음 각 Lambda 함수에서 처리하는 Amazon SQS 대기열에 메시지를 배포하여 결제를 처리하고 사기를 탐지합니다. 또한 데이터는 Data Firehose를 통해 Amazon S3 버킷으로 스트리밍되어 장기 아카이빙이 가능하며, 데이터 보존 요구 사항 준수를 지원합니다. 이 설정을 통해 플랫폼은 Amazon Athena와 같은 도구로 티켓 판매 데이터에 대한 세부 분석을 실행할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-archiving-use-case.png)


분석을 실행하고 티켓 판매에 대한 인사이트를 얻기 위해 회사는 Amazon Athena를 사용하여 SQL 쿼리를 실행합니다. 예를 들어, 회사는 가장 인기 있는 목적지와 가장 자주 이용하는 항공편에 대해 알아보기 위해 쿼리를 작성할 수 있습니다.

이 사용 사례에 대한 AWS 리소스를 생성하려면 AWS Management Console 또는 템플릿을 사용할 수 있습니다 CloudFormation .

**Topics**
+ [메시지 아카이빙 및 분석을 위한 초기 AWS 리소스 설정](firehose-example-initial-resources.md)
+ [메시지 아카이빙용 Firehose 전송 스트림 설정](firehose-example-create-delivery-stream.md)
+ [전송 스트림에서 주제 구독](firehose-example-subscribe-delivery-stream-to-topic.md)
+ [효과적인 데이터 관리를 위한 구성 테스트 및 쿼리](firehose-example-test-and-query.md)
+ [CloudFormation 템플릿을 사용한 메시지 아카이빙 자동화](firehose-example-cfn.md)

# Amazon SNS 메시지 아카이빙 및 분석을 위한 초기 AWS 리소스 설정
<a name="firehose-example-initial-resources"></a>

이 주제에서는 [메시지 아카이브 및 분석 예제 사용 사례](firehose-example-use-case.md)에 필요한 리소스를 만드는 방법을 설명합니다.
+ Amazon Simple Storage Service(S3) 버킷
+ Amazon Simple Queue Service(Amazon SQS) 대기열 2개
+ Amazon SNS 주제
+ Amazon SNS 주제에 대한 Amazon SQS 구독 2개

**초기 리소스를 생성하려면**

1. 다음과 같이 Amazon S3 버킷을 생성합니다.<a name="firehose-use-case-create-bucket"></a>

   1. [Amazon S3 콘솔](https://console.aws.amazon.com/s3/home)을 엽니다.

   1. **버킷 생성**을 선택합니다.

   1. **버킷 이름**에 전 세계적으로 고유한 이름을 입력합니다. 다른 필드는 기본값으로 유지합니다.

   1. **버킷 생성**을 선택합니다.

   Amazon S3 버킷에 대한 자세한 정보는 *Amazon Simple Storage Service 사용 설명서*의 [버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) 및 *Amazon Simple Storage Service 사용 설명서*의 [Amazon S3 버킷 작업](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)을 참조하세요.

1. 다음과 같이 Amazon SQS 대기열 2개를 생성합니다.

   1. [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs/home)을 엽니다.

   1. **Create queue**(대기열 생성)를 선택합니다.

   1. **유형**에서 **표준**을 선택합니다.

   1. **이름**에 **ticketPaymentQueue**를 입력합니다.

   1. **액세스 정책**에서 **메서드 선택**에 **고급**을 선택합니다.

   1. JSON 정책 상자에 다음 정책을 붙여넣습니다.

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

****  

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

------

      이 액세스 정책에서 AWS 계정 번호(*123456789012*)를 자신의 번호로 바꾸고 그에 따라 AWS 리전(*us-east-1*)을 변경합니다.

   1. **대기열 생성**을 선택합니다.

   1. 이 단계를 반복하여 **ticketFraudQueue**라는 두 번째 SQS 대기열을 만듭니다.

   SQS 대기열 생성에 대한 자세한 정보는 *Amazon Simple Queue Service 개발자 안내서*의 [Amazon SQS 대기열 생성(콘솔)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html)을 참조하세요.

1. SNS 주제를 생성하려면

   1. Amazon SNS 콘솔의 [주제 페이지](https://console.aws.amazon.com/sns/home#/topics)를 엽니다.

   1. [**Create topic**]을 선택합니다.

   1. **세부 정보**에서 **유형**에 **표준**을 선택합니다.

   1. **이름**에 **ticketTopic**을 입력합니다.

   1. **주제 생성**을 선택합니다.

   Amazon SNS 주제 생성에 대한 자세한 정보는 [Amazon SNS 주제 생성](sns-create-topic.md)에서 확인하세요.

1. 두 SQS 대기열 모두에서 SNS 주제를 구독합니다.

   1. [Amazon SNS 콘솔](https://console.aws.amazon.com/sns/home#/topics)의 **ticketTopic** 주제 세부 정보 페이지에서 **구독 생성**을 선택합니다.

   1. **세부 정보**에서 **프로토콜**에 대해 **Amazon SQS**를 선택합니다.

   1. **엔드포인트**에서 **ticketPaymentQueue** 대기열의 Amazon 리소스 이름(ARN)을 선택합니다.

   1. **구독 생성**을 선택합니다.

   1. 이 단계를 반복하여 **ticketFraudQueue** 대기열의 ARN으로 두 번째 구독을 생성합니다.

      SNS 주제 구독에 대한 자세한 정보는 [Amazon SNS 주제에서 구독 만들기](sns-create-subscribe-endpoint-to-topic.md)에서 확인하세요. Amazon SQS 콘솔에서 SNS 주제에 대한 SQS 대기열을 구독할 수도 있습니다. 자세한 정보는 *Amazon Simple Queue Service 개발자 안내서*의 [Amazon SQS 대기열에서 Amazon SNS 주제 구독(콘솔)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-subscribe-queue-sns-topic.html)을 참조하세요.

이 사용 사례 예에 대한 초기 리소스를 만들었습니다. 계속하려면 [Amazon SNS 메시지 아카이빙용 Amazon Data Firehose 전송 스트림 설정](firehose-example-create-delivery-stream.md)에서 확인하세요.

# Amazon SNS 메시지 아카이빙용 Amazon Data Firehose 전송 스트림 설정
<a name="firehose-example-create-delivery-stream"></a>

이 주제에서는 [메시지 아카이빙 및 분석 예제 사용 사례](firehose-example-use-case.md)를 위한 Amazon Data Firehose 전송 스트림을 생성하는 방법을 설명합니다.

**Amazon Data Firehose 전송 스트림을 생성하는 방법**

1. [Amazon Data Firehose 서비스 콘솔](https://console.aws.amazon.com/kinesis/home)을 엽니다.

1. **Firehose**를 선택한 다음 **전송 스트림 생성**을 선택합니다.

1. **새 전송 스트림** 페이지에서 **전송 스트림 이름**에 **ticketUploadStream**을 입력하고 **다음**을 선택합니다.

1. **프로세스 레코드** 페이지에서 **다음**을 선택합니다.

1. **대상 선택** 페이지에서 다음을 수행합니다.

   1. **대상**에서 **Amazon S3**을 선택합니다.

   1. **S3 대상**에서 **S3 버킷**에 대해 [최초로 생성한](firehose-example-initial-resources.md) S3 버킷을 선택합니다.

   1. **다음**을 선택합니다.

1. **설정 구성** 페이지에서 **S3 버퍼 조건**에 대해 다음을 수행합니다.
   + **버퍼 크기**에 **1**을 입력합니다.
   + **버퍼 간격**에 **60**을 입력합니다.

   Amazon S3 버퍼에 이 값을 사용하면 구성을 빠르게 테스트할 수 있습니다. 가장 먼저 만족되는 조건에 의해 S3 버킷으로의 데이터 전송이 트리거됩니다.

1. **설정 구성** 페이지의 **권한**에서 필요한 권한이 자동으로 할당된 AWS Identity and Access Management (IAM) 역할을 생성하도록 선택합니다. 그런 다음, **다음**을 선택합니다.

1. **검토** 페이지에서 **전송 스트림 생성**을 선택합니다.

1. **Amazon Data Firehose 전송 스트림 페이지**에서 방금 생성한 전송 스트림(**ticketUploadStream**)을 선택합니다. **세부 정보** 탭에서 나중을 위해 스트림의 Amazon 리소스 이름(ARN)을 적어둡니다.

전송 스트림 생성에 대한 자세한 정보는 *Amazon Kinesis Data Firehose 개발자 안내서*의 [Creating an Amazon Data Firehose Delivery Stream](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)을 참조하세요. IAM 역할 생성에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스에 권한을 위임할 역할 생성을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html).

필요한 권한으로 Firehose 전송 스트림을 생성했습니다. 계속하려면 [Firehose 전송 스트림에서 Amazon SNS 주제 구독](firehose-example-subscribe-delivery-stream-to-topic.md)에서 확인하세요.

# Firehose 전송 스트림에서 Amazon SNS 주제 구독
<a name="firehose-example-subscribe-delivery-stream-to-topic"></a>

이 주제에서는 [메시지 아카이브 및 분석 예제 사용 사례](firehose-example-use-case.md)에 대해 다음과 같은 리소스를 만드는 방법을 설명합니다.
+ Amazon SNS 구독이 전송 스트림에 레코드를 넣을 수 있도록 허용하는 AWS Identity and Access Management (IAM) 역할입니다.
+ Amazon SNS 주제에 대한 Firehose 전송 스트림 구독.

**Amazon SNS 구독에 대한 IAM 역할을 생성하려면**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home?#/roles)를 엽니다.

1. **역할 생성**을 선택합니다.

1. **신뢰할 수 있는 엔터티 유형 선택(Select type of trusted entity)**에서 **AWS 서비스(service)**를 선택합니다.

1. **사용 사례 선택**에 **SNS**를 선택합니다. 그런 다음 **다음: 권한**을 선택합니다.

1. **다음: 태그**를 선택합니다.

1. **다음: 검토**를 선택합니다.

1. **검토** 페이지의 **역할 이름**에 **ticketUploadStreamSubscriptionRole**을 입력합니다. 그런 다음 **역할 생성**을 선택합니다.

1. 역할이 생성되면 해당 이름(**ticketUploadStreamSubscriptionRole**)을 선택합니다.

1. 역할의 **요약** 페이지에서 **인라인 정책 추가**를 선택합니다.

1. **정책 생성** 페이지에서 **JSON** 탭을 선택한 후 상자에 다음 정책을 붙여넣습니다.

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "firehose:DescribeDeliveryStream",
                   "firehose:ListDeliveryStreams",
                   "firehose:ListTagsForDeliveryStream",
                   "firehose:PutRecord",
                   "firehose:PutRecordBatch"
               ],
               "Resource": [
                   "arn:aws:firehose:us-east-1:123456789012:deliverystream/ticketUploadStream"
               ],
               "Effect": "Allow"
           }
       ]
   }
   ```

------

   이 정책에서 AWS 계정 숫자(*123456789012*)를 자신의 숫자로 바꾸고 그에 따라 AWS 리전(*us-east-1*)을 변경합니다.

1. **정책 검토**를 선택합니다.

1. **정책 검토** 페이지의 **이름**에 **FirehoseSnsPolicy**를 입력합니다. 그런 다음 **정책 생성**을 선택합니다.

1. 역할의 **요약** 페이지에서 나중을 위해 **역할 ARN**을 기록합니다.

IAM 역할 생성에 대한 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스에 권한을 위임할 역할 생성을 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html).

**Firehose 전송 스트림에서 SNS 주제를 구독하는 방법**

1. Amazon SNS 콘솔의 [주제 페이지](https://console.aws.amazon.com/sns/home#/topics)를 엽니다.

1. **구독** 탭에서 **구독 생성**을 선택합니다.

1. **세부 정보**에서 **프로토콜**에 대해 ****을 선택합니다.

1. **엔드포인트**에 앞서 생성한 **ticketUploadStream** 전송 스트림의 Amazon 리소스 이름(ARN)을 입력합니다. 예를 들면 **arn:aws:firehose:us-east-1:123456789012:deliverystream/ticketUploadStream**를 입력합니다.

1. **구독 역할 ARN**에 앞서 생성한 **ticketUploadStreamSubscriptionRole** IAM 역할의 ARN을 입력합니다. 예를 들면 **arn:aws:iam::123456789012:role/ticketUploadStreamSubscriptionRole**을(를) 입력합니다.

1. **원시 메시지 전송 사용** 확인란을 선택합니다.

1. **구독 생성**을 선택합니다.

IAM 역할 및 SNS 주제 구독을 만들었습니다. 계속하려면 [효과적인 데이터 관리를 위한 Amazon SNS 구성 테스트 및 쿼리](firehose-example-test-and-query.md)에서 확인하세요.

# 효과적인 데이터 관리를 위한 Amazon SNS 구성 테스트 및 쿼리
<a name="firehose-example-test-and-query"></a>

이 주제에서는 Amazon SNS 주제에 메시지를 게시하여 [메시지 아카이브 및 분석 예제 사용 사례](firehose-example-use-case.md)를 테스트하는 방법을 설명합니다. 지침에는 실행하고 필요에 맞게 조정할 수 있는 예제 쿼리가 포함되어 있습니다.

**구성을 테스트하려면**

1. Amazon SNS 콘솔의 [주제 페이지](https://console.aws.amazon.com/sns/home#/topics)를 엽니다.

1. **ticketTopic** 주제를 선택을 선택합니다.

1. **메시지 게시**를 선택합니다.

1. **주제에 메시지 게시** 페이지에서 메시지 본문에 대해 다음을 입력합니다. 메시지 끝에 줄바꿈 문자를 추가합니다.

   ```
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 04:15:05","Destination":"Miami","FlyingFrom":"Vancouver","TicketNumber":"abcd1234"}
   ```

   다른 모든 옵션을 기본값으로 유지합니다.

1. **메시지 게시**를 선택합니다.

   메시지 게시에 대한 자세한 정보는 [Amazon SNS 메시지 게시](sns-publishing.md)에서 확인하세요.

1. 60초의 전송 스트림 간격 후에 [Amazon Simple Storage Service(Amazon S3) 콘솔](https://console.aws.amazon.com/s3/home)을 열고 [최초로 생성](firehose-example-initial-resources.md)한 Amazon S3 버킷을 선택합니다.

   버킷에 게시된 메시지가 표시됩니다.

**데이터를 쿼리하려면**

1. [Amazon Athena 콘솔](https://console.aws.amazon.com/athena/home)을 엽니다.

1. 쿼리를 실행합니다.

   예를 들어 `default` 스키마의 `notifications` 테이블에 다음 데이터가 포함되어 있다고 가정합니다.

   ```
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 04:15:05","Destination":"Miami","FlyingFrom":"Vancouver","TicketNumber":"abcd1234"}
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 11:30:15","Destination":"Miami","FlyingFrom":"Omaha","TicketNumber":"efgh5678"}
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 3:30:10","Destination":"Miami","FlyingFrom":"NewYork","TicketNumber":"ijkl9012"}
   {"BookingDate":"2020-12-15","BookingTime":"2020-12-15 12:30:05","Destination":"Delhi","FlyingFrom":"Omaha","TicketNumber":"mnop3456"}
   ```

   최상위 대상을 찾으려면 다음 쿼리를 실행합니다.

   ```
   SELECT destination
   FROM default.notifications
   GROUP BY destination
   ORDER BY count(*) desc
   LIMIT 1;
   ```

   특정 날짜 및 시간 범위 동안 판매된 티켓을 쿼리하려면 다음과 같은 쿼리를 실행합니다.

   ```
   SELECT * 
   FROM default.notifications 
   WHERE bookingtime 
     BETWEEN TIMESTAMP '2020-12-15 10:00:00' 
     AND TIMESTAMP '2020-12-15 12:00:00';
   ```

   필요에 따라 두 샘플 쿼리를 모두 적용할 수 있습니다. Athena를 사용하여 쿼리를 실행하는 방법에 대한 자세한 정보는 *Amazon Athena 사용 설명서*의 [시작하기](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html)를 참조하세요.

## 정리
<a name="firehose-example-cleanup"></a>

테스트를 완료한 후 사용 요금이 발생하지 않도록 하려면 자습서 중에 생성한 다음 리소스를 삭제하세요.
+ Amazon SNS 구독
+ Amazon SNS 주제
+ Amazon Simple Queue Service(Amazon SQS) 대기열
+ Amazon S3 버킷
+  전송 스트림
+ AWS Identity and Access Management (IAM) 역할 및 정책

# CloudFormation 템플릿을 사용한 Amazon SNS 메시지 아카이빙 자동화
<a name="firehose-example-cfn"></a>

Amazon SNS [메시지 아카이브 및 분석 예 사용 사례](firehose-example-use-case.md)의 배포를 자동화하려면 다음 YAML 템플릿을 사용할 수 있습니다.

```
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Template for creating an SNS archiving use case
Resources:
  ticketUploadStream:
    DependsOn:
    - ticketUploadStreamRolePolicy
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties:
      S3DestinationConfiguration:
        BucketARN: !Sub 'arn:${AWS::Partition}:s3:::${ticketArchiveBucket}'
        BufferingHints:
          IntervalInSeconds: 60
          SizeInMBs: 1
        CompressionFormat: UNCOMPRESSED
        RoleARN: !GetAtt ticketUploadStreamRole.Arn
  ticketArchiveBucket:
    Type: AWS::S3::Bucket
  ticketTopic:
    Type: AWS::SNS::Topic
  ticketPaymentQueue:
    Type: AWS::SQS::Queue
  ticketFraudQueue:
    Type: AWS::SQS::Queue
  ticketQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Statement:
          Effect: Allow
          Principal:
            Service: sns.amazonaws.com
          Action:
            - sqs:SendMessage
          Resource: '*'
          Condition:
            ArnEquals:
              aws:SourceArn: !Ref ticketTopic
      Queues:
        - !Ref ticketPaymentQueue
        - !Ref ticketFraudQueue
  ticketUploadStreamSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ticketTopic
      Endpoint: !GetAtt ticketUploadStream.Arn
      Protocol: firehose
      SubscriptionRoleArn: !GetAtt ticketUploadStreamSubscriptionRole.Arn
  ticketPaymentQueueSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ticketTopic
      Endpoint: !GetAtt ticketPaymentQueue.Arn
      Protocol: sqs
  ticketFraudQueueSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      TopicArn: !Ref ticketTopic
      Endpoint: !GetAtt ticketFraudQueue.Arn
      Protocol: sqs
  ticketUploadStreamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
        - Sid: ''
          Effect: Allow
          Principal:
            Service: firehose.amazonaws.com
          Action: sts:AssumeRole
  ticketUploadStreamRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: FirehoseticketUploadStreamRolePolicy
      PolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
        - Effect: Allow
          Action:
          - s3:AbortMultipartUpload
          - s3:GetBucketLocation
          - s3:GetObject
          - s3:ListBucket
          - s3:ListBucketMultipartUploads
          - s3:PutObject
          Resource:
          - !Sub 'arn:aws:s3:::${ticketArchiveBucket}'
          - !Sub 'arn:aws:s3:::${ticketArchiveBucket}/*'
      Roles:
      - !Ref ticketUploadStreamRole
  ticketUploadStreamSubscriptionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - sns.amazonaws.com
          Action:
          - sts:AssumeRole
      Policies:
      - PolicyName: SNSKinesisFirehoseAccessPolicy
        PolicyDocument:
          Version: '2012-10-17		 	 	 '
          Statement:
          - Action:
            - firehose:DescribeDeliveryStream
            - firehose:ListDeliveryStreams
            - firehose:ListTagsForDeliveryStream
            - firehose:PutRecord
            - firehose:PutRecordBatch
            Effect: Allow
            Resource:
            - !GetAtt ticketUploadStream.Arn
```

# 자동 처리를 위해 Lambda 함수에 Amazon SNS 알림 팬아웃
<a name="sns-lambda-as-subscriber"></a>

Amazon SNS는와 통합되어 Amazon SNS 알림에 대한 응답으로 Lambda 함수를 트리거할 수 AWS Lambda있습니다. Lambda 함수가 구독하는 SNS 주제에 메시지가 게시되면 게시된 메시지의 페이로드와 함께 Lambda 함수가 호출됩니다. Lambda 함수는 메시지 페이로드를 입력 파라미터로 수신하고 메시지의 정보를 조작하거나, 메시지를 다른 SNS 주제에 게시하거나, 메시지를 다른 AWS 서비스에 전송할 수 있습니다.

또한 Amazon SNS는 Lambda 엔드포인트에 전송된 메시지 알림을 위해 메시지 전송 상태 속성도 지원합니다. 자세한 내용은 [Amazon SNS 메시지 전송 상태](sns-topic-attributes.md) 섹션을 참조하세요.

**Topics**
+ [사전 조건](lambda-prereq.md)
+ [함수에서 주제 구독](lambda-console.md)

# 리전 간 Amazon SNS와 Lambda 함수를 통합하기 위한 사전 조건
<a name="lambda-prereq"></a>

Amazon SNS 알림을 사용하여 Lambda 함수를 호출하려면 다음이 필요합니다.
+ Lambda 함수
+ Amazon SNS 주제

Amazon SNS로 사용할 Lambda 함수 생성에 대한 자세한 내용은 [Amazon SNS로 Lambda 사용](https://docs.aws.amazon.com/lambda/latest/dg/with-sns-example.html)을 참조하세요. Amazon SNS 주제 생성에 대한 자세한 내용은 [주제 생성](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)을 참조하세요.

 옵트인 리전에서 기본적으로 활성화된 리전으로 메시지를 전송하는 데 Amazon SNS를 사용하는 경우, 보안 주체 `sns.amazonaws.com`을 `sns.<opt-in-region>.amazonaws.com`으로 대체하여 AWS Lambda 함수에서 생성된 정책을 변경해야 합니다.

 예를 들어 미국 동부(버지니아 북부)의 Lambda 함수가 아시아 태평양(홍콩)의 SNS 주제를 구독하게 하려면 AWS Lambda 함수 정책의 보안 주체를 `sns.ap-east-1.amazonaws.com`으로 변경합니다. 옵트인 리전에는 2019년 3월 20일 이후에 시작된 모든 리전이 포함됩니다. 여기에는 아시아 태평양(홍콩), 중동(바레인), EU(밀라노) 및 아프리카(케이프타운)가 포함됩니다. 2019년 3월 20일 이전에 시작된 리전은 기본적으로 활성화되어 있습니다.

**참고**  
AWS 는 기본적으로 옵트인 리전으로 활성화된 리전에서 Lambda로의 리전 간 전송을 지원하지 않습니다. 또한 옵트인 리전에서 다른 옵트인 리전으로의 SNS 메시지의 리전 간 전달은 지원되지 않습니다.

# Amazon SNS 주제에 Lambda 함수 구독
<a name="lambda-console"></a>

이 주제에서는 Lambda 함수를 Amazon SNS 주제에 구독시켜 게시된 메시지에 의해 함수가 트리거되도록 하는 방법을 설명합니다.

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

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

1. **주제** 페이지에서 주제를 선택합니다.

1. **구독** 섹션에서 **구독 생성**을 선택합니다.

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

   1. 선택한 **주제 ARN**을 확인합니다.

   1. **프로토콜**에서를 선택합니다 AWS Lambda.

   1. **엔드포인트**에 함수의 ARN을 입력합니다.

   1. **구독 생성**을 선택합니다.

Lambda 함수가 구독하는 SNS 주제에 메시지가 게시되면 게시된 메시지의 페이로드와 함께 Lambda 함수가 호출됩니다. 자습서를 포함하여 Amazon SNS AWS Lambda 에서를 사용하는 방법에 대한 자세한 내용은 [ Amazon SNS AWS Lambda 에서 사용을](https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html) 참조하세요.

# 비동기 처리를 위해 Amazon SNS 알림을 Amazon SQS 대기열에 팬아웃
<a name="sns-sqs-as-subscriber"></a>

[Amazon SNS](https://aws.amazon.com/sns/)는 Amazon Simple Queue Service(Amazon SQS)와 긴밀하게 작동합니다. 이러한 서비스는 개발자에게 다양한 이점을 제공합니다. Amazon SNS를 사용하면 애플리케이션이 "푸시" 메커니즘을 통해 시간이 중요한 메시지를 여러 구독자에게 보낼 수 있으므로 업데이트를 주기적으로 확인하거나 "폴링"할 필요가 없습니다. Amazon SQS는 분산 애플리케이션이 폴링 모델을 통해 메시지를 교환하는 데 사용하는 메시지 대기열 서비스이며, 각 구성 요소를 동시에 사용할 필요 없이 전송 및 수신 구성 요소를 분리하는 데 사용할 수 있습니다. Amazon SNS와 Amazon SQS를 함께 사용하면 즉각적인 이벤트 알림을 필요로 하는 애플리케이션에 메시지를 전송할 수 있고, 다른 애플리케이션에서 나중에 처리할 수 있도록 메시지를 Amazon SNS 대기열에 계속 보관할 수도 있습니다.

Amazon SQS 대기열에서 Amazon SNS 주제를 구독하면 해당 주제에 메시지를 게시할 수 있으며 Amazon SNS는 구독한 대기열에 Amazon SQS 메시지를 보냅니다. Amazon SQS 메시지는 JSON 문서의 메시지에 대한 메타데이터와 함께 주제에 게시된 제목 및 메시지를 포함합니다. Amazon SQS 메시지는 다음의 JSON 문서와 유사합니다.

```
{
   "Type" : "Notification",
   "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76",
   "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
   "Subject" : "Testing publish to subscribed queues",
   "Message" : "Hello world!",
   "Timestamp" : "2012-03-29T05:12:16.901Z",
   "SignatureVersion" : "1",
   "Signature" : "EXAMPLEnTrFPa3...",
   "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:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee"
}
```

# Amazon SQS 대기열에서 Amazon SNS 주제 구독
<a name="subscribe-sqs-queue-to-sns-topic"></a>

Amazon SNS 주제가 Amazon SQS 대기열에 메시지를 보내도록 하려면 다음 중 하나를 선택하세요.
+ 프로세스를 간소화하는 [Amazon SQS 콘솔](https://console.aws.amazon.com/sqs/)을 사용하세요. 자세한 정보는 *Amazon Simple Queue Service 개발자 안내서*의 [Amazon SQS 대기열에서 Amazon SNS 주제 구독](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-subscribe-queue-sns-topic.html)을 참조하세요.
+ 다음 단계를 사용합니다.

  1. [메시지를 전송하고자 하는 대기열 및 대기열을 구독하고자 하는 주제의 Amazon Resource Name(ARN)을 파악합니다.](#SendMessageToSQS.arn)

  1. [Amazon SNS 주제에 대한 `sqs:SendMessage` 권한을 부여하여 대기열로 메시지를 전송할 수 있습니다.](#SendMessageToSQS.sqs.permissions)

  1. [대기열에서 Amazon SNS 주제를 구독합니다.](#SendMessageToSQS.subscribe)

  1. [Amazon SNS 주제에 게시하고 Amazon SQS 대기열에서 메시지를 읽을 수 있도록 IAM 사용자 또는 AWS 계정 에 적절한 권한을 부여합니다.](#SendMessageToSQS.iam.permissions)

  1. [주제에 대한 메시지를 게시하고 대기열에서 메시지를 읽어 테스트합니다.](#SendMessageToSQS.test)

다른 AWS계정의 대기열에 메시지를 보내기 위해 주제를 생성하는 방법은 [다른 계정의 Amazon SQS 대기열로 Amazon SNS 메시지 전송](sns-send-message-to-sqs-cross-account.md)에서 확인하세요.

두 대기열로 메시지를 보내는 주제를 생성하는 CloudFormation 템플릿을 보려면 섹션을 참조하세요[를 사용하여 Amazon SNS를 Amazon SQS로 메시징 자동화 AWS CloudFormation](SendMessageToSQS.cloudformation.md).

## 1단계: 대기열 및 주제의 ARN 획득
<a name="SendMessageToSQS.arn"></a>

주제에 대기열을 구독할 때 사용자는 해당 대기열에 대한 ARN 사본이 필요합니다. 이와 마찬가지로 대기열에 메시지를 전송하도록 주제에 권한을 부여할 때 사용자는 주제에 대한 ARN 사본이 필요합니다.

대기열 ARN을 획득하려면 Amazon SQS 콘솔 또는 [GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html) API 작업을 사용할 수 있습니다.

**Amazon SQS 콘솔로부터 대기열 ARN을 획득하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) Amazon SQS 콘솔을 엽니다.

1. 획득하고자 하는 ARN 대기열 박스를 선택합니다.

1. **세부 정보** 섹션에서 ARN 값을 복사하여 Amazon SNS 주제를 구독하는데 사용할 수 있도록 합니다.

주제 ARN을 가져오려면 Amazon SNS 콘솔, `[sns-get-topic-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/get-topic-attributes.html)` 명령 또는 `[GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryGetQueueAttributes.html)` API 작업을 사용할 수 있습니다.

**Amazon SNS 콘솔로부터 주제 ARN을 획득하려면**

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

1. 탐색 창에서 ARN을 가져오려는 주제를 선택합니다.

1. **세부 정보** 섹션에서 **ARN** 값을 복사하여 대기열에 메시지를 전송하는 Amazon SNS 주제에 대한 권한을 부여하는데 사용합니다.

## 2단계: Amazon SQS 대기열에 메시지를 전송하도록 Amazon SNS 주제에 권한 부여
<a name="SendMessageToSQS.sqs.permissions"></a>

Amazon SNS 주제가 대기열에 메시지를 전송할 수 있으려면 Amazon SNS 주제가 `sqs:SendMessage` 작업을 수행하도록 허용하는 정책을 대기열에 설정해야 합니다.

대기열에서 주제를 구독하기 전에 주제 및 대기열이 필요합니다. 주제 또는 대기열을 아직 생성하지 않은 경우, 지금 생성합니다. 자세한 정보는 [주제 생성](sns-create-topic.md)을 참조하고 *Amazon Simple Queue Service 개발자 안내서*의 [대기열 생성](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-create-queue.html)을 참조하세요.

대기열에 정책을 설정하기 위해 Amazon SQS 콘솔 또는 [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QuerySetQueueAttributes.html) API 작업을 사용할 수 있습니다. 시작하기 전에 대기열로 메시지를 전송하도록 허용하고자 하는 해당 주제의 ARN을 보유하고 있는지 확인해야 합니다. 대기열에서 여러 주제를 구독하는 경우 정책은 각 주제에 대해 하나의 `Statement` 요소를 포함해야 합니다.

**Amazon SQS 콘솔을 사용해 대기열에 SendMessage 정책 설정**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) Amazon SQS 콘솔을 엽니다.

1. 정책을 설정하려는 대기열의 상자를 선택하고 **액세스 정책** 탭을 선택한 다음 **편집**을 선택합니다.

1. **액세스 정책** 섹션에서 대기열에 액세스할 수 있는 사람을 정의합니다.
   + 주제의 작업을 허용하는 조건을 추가합니다.
   + 아래 예제와 같이 `Principal`을 Amazon SNS 서비스로 설정합니다 
   + [혼동된 대리자](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) 시나리오를 방지하기 위해 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 또는 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 전역 조건 키를 사용합니다. 이러한 조건 키를 사용하려면 값을 주제의 ARN으로 설정합니다. 대기열에서 여러 주제를 구독하는 경우 `aws:SourceAccount`를 대신 사용할 수 있습니다.

   예를 들어, 다음 정책은 MyTopic이 MyQueue에 메시지를 전송하도록 허용합니다.

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

## 3단계: 대기열에서 Amazon SNS 주제 구독
<a name="SendMessageToSQS.subscribe"></a>

주제를 통해 메시지를 전송하려면 대기열에서 Amazon SNS 주제를 구독해야 합니다. 사용자는 자체 ARN에 의해 해당 대기열을 지정합니다. 주제를 구독하려면 Amazon SNS 콘솔, `[sns-subscribe](https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html)` CLI 명령 또는 `[Subscribe](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)` API 작업을 사용할 수 있습니다. 시작하기 전에 구독하고자 하는 대기열의 ARN이 있어야 합니다.

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

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

1. **주제** 페이지에서 주제를 선택합니다.

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

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

   1. **주제 ARN**을 확인합니다.

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

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

   1. **구독 생성**을 선택합니다.

   구독이 확인되면 새 구독의 **구독 ID**는 구독 ID를 표시합니다. 대기열 소유자가 구독을 생성하면 구독은 자동으로 확인되며 거의 즉시 활성화됩니다.

   일반적으로 사용자는 소유한 주제에 대해 사용자 계정의 자체 대기열을 구독합니다. 하지만 다른 계정의 대기열에서 주제를 구독할 수도 있습니다. 구독을 생성한 사용자가 대기열의 소유자가 아닐 경우(예. 계정 A의 사용자가 계정 A의 주제에 대해 계정 B의 대기열을 구독할 경우) 구독이 확인되어야 합니다. 다른 계정에서 대기열 구독 및 구독 확인에 대한 자세한 정보는 [다른 계정의 Amazon SQS 대기열로 Amazon SNS 메시지 전송](sns-send-message-to-sqs-cross-account.md)에서 확인하세요.

## 4단계: 사용자에게 적절한 주제 및 대기열 작업에 대한 권한 부여
<a name="SendMessageToSQS.iam.permissions"></a>

적절한 사용자만 Amazon SNS 주제에 게시하고 Amazon SQS 대기열에서 메시지를 읽거나 삭제하도록 허용하려면 AWS Identity and Access Management (IAM)을 사용해야 합니다. IAM 사용자의 주제 및 대기열에 대한 작업 제어에 대한 자세한 정보는 [Amazon SNS로 자격 증명 기반 정책 사용](sns-using-identity-based-policies.md) 및 Amazon Simple Queue Service 개발자 안내서의 [Amazon SQS의 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html)를 참조하세요.

주제 또는 대기열에 대한 액세스를 제어하는 다음의 두 가지 방법이 있습니다.
+ [IAM 사용자 또는 그룹에 정책을 추가합니다](#SendMessageToSQS.iam.permissions.user). 사용자에게 주제 또는 대기열에 대한 권한을 부여하는 가장 간단한 방법은 그룹을 생성하고 그룹에 적절한 정책을 추가한 후 사용자를 추가하는 것입니다. 그룹에서 사용자를 추가하거나 제거하는 것이 각각의 사용자에 대해 설정한 정책을 추적하는 것보다 훨씬 쉽습니다.
+ [주제 또는 대기열에 대한 정책을 추가합니다](#SendMessageToSQS.iam.permissions.resource). 주제 또는 대기열에 권한을 다른 AWS 계정에 부여하려는 경우 권한을 부여 AWS 계정 하려는 보안 주체가 인 정책을 추가하는 것이 유일한 방법입니다.

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

### IAM 사용자 또는 그룹에 정책 추가
<a name="SendMessageToSQS.iam.permissions.user"></a>

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

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

IAM 사용자 또는 그룹에 다음의 정책을 추가할 경우 해당 사용자 또는 그룹 구성원에게 대기열 MyQueue1 및 MyQueue2에 대한 `sqs:ReceiveMessage` 및 `sqs:DeleteMessage` 작업을 수행할 권한을 부여할 것입니다.

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sqs:ReceiveMessage",
        "sqs:DeleteMessage"
      ],
      "Resource": [
        "arn:aws:sqs:us-east-2:123456789012:MyQueue1",
        "arn:aws:sqs:us-east-2:123456789012:MyQueue2"
      ]
    }
  ]
}
```

### 주제 또는 대기열에 대한 정책 추가
<a name="SendMessageToSQS.iam.permissions.resource"></a>

다음의 정책 예제는 또 다른 계정에 주제 및 대기열에 대한 권한을 부여하는 방법을 보여줍니다.

**참고**  
계정의 리소스에 대한 다른 AWS 계정 액세스 권한을 부여하면 해당 리소스에 대한 관리자 수준 액세스(와일드카드 액세스) 권한이 있는 IAM 사용자에게도 부여됩니다. 다른 계정의 다른 모든 IAM 사용자는 자동으로 사용자 리소스에 대한 액세스가 거부됩니다. 해당 AWS 계정 의 특정 IAM 사용자에게 사용자의 리소스에 대한 액세스 권한을 부여하고자 할 경우 관리자 레벨의 액세스 권한을 보유한 계정 또는 IAM 사용자는 이러한 IAM 사용자들에게 리소스에 대한 권한을 위임해야 한다. 교차 계정 위임에 대한 자세한 정보는 [IAM 사용 가이드](https://docs.aws.amazon.com/IAM/latest/UserGuide/Delegation.html)의 *교차 계정 액세스 권한 사용*을 참조하세요.

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

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

계정 123456789012의 대기열 MyQueue에 대해 다음의 정책을 추가했을 경우 사용자는 계정 111122223333에 해당 대기열에 대한 `sqs:ReceiveMessage` 및 `sqs:DeleteMessage` 작업을 수행할 권한을 부여했을 것입니다.

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "111122223333"
      },
      "Action": [
        "sqs:DeleteMessage",
        "sqs:ReceiveMessage"
      ],
      "Resource": [
        "arn:aws:sqs:us-east-2:123456789012:MyQueue"
      ]
    }
  ]
}
```

## 5단계: 주제의 대기열 구독 테스트
<a name="SendMessageToSQS.test"></a>

주제를 게시하고 주제가 대기열에 전송한 메시지를 확인함으로써 주제의 대기열 구독을 테스트할 수 있습니다.

**Amazon SNS 콘솔을 사용하여 주제를 게시하려면**

1. 주제에 게시할 권한이 있는 AWS 계정 또는 IAM 사용자의 자격 증명을 사용하여에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/home) Amazon SNS 콘솔을 엽니다.

1. 탐색 창에서 주제를 선택하고 **주제 게시**를 선택합니다.

1. **제목** 상자에 제목을 입력하고(예: **Testing publish to queue**), **메시지** 상자에 텍스트를 입력한 후(예: **Hello world\$1**), **메시지 게시**를 선택합니다. “메시지가 성공적으로 게시되었습니다”라는 메시지가 나타납니다.

**Amazon SQS 콘솔을 사용한 주제에서의 메시지 확인**

1. 대기열에서 메시지를 볼 수 있는 권한이 있는 AWS 계정 또는 IAM 사용자의 자격 증명을 사용하여에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) Amazon SQS 콘솔을 엽니다.

1. 주제를 구독하는 **대기열**을 선택합니다.

1. **Send and receive messages**(메시지 보내기 및 받기)를 선택한 다음 **Poll for messages**(메시지 폴링)를 선택합니다. **알림** 유형으로 된 메시지가 표시됩니다.

1. **본문** 열에서 **추가 정보**를 선택합니다. **Message Details** 상자는 주제에 게시한 제목 및 메시지로 된 JSON 문서를 담고 있습니다. 메시지는 다음의 JSON 문서와 유사합니다.

   ```
   {
     "Type" : "Notification",
     "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Subject" : "Testing publish to subscribed queues",
     "Message" : "Hello world!",
     "Timestamp" : "2012-03-29T05:12:16.901Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEnTrFPa3...",
     "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:c7fe3a54-ab0e-4ec2-88e0-db410a0f2bee"
   }
   ```

1. **닫기**를 선택하세요. 대기열에 알림 메시지를 전송하는 주제를 성공적으로 게시했습니다.

# 를 사용하여 Amazon SNS를 Amazon SQS로 메시징 자동화 AWS CloudFormation
<a name="SendMessageToSQS.cloudformation"></a>

CloudFormation 를 사용하면 템플릿 파일을 사용하여 리소스 모음 AWS 을 단일 단위로 생성하고 구성할 수 있습니다. 이 섹션은 대기열을 게시하는 주제를 쉽게 배포하는 예제 템플릿을 보여줍니다. 템플릿은 사용자가 두 개의 대기열을 생성하고, 대기열에 대한 주제를 생성하며, 해당 대기열에 정책을 추가하여 주제가 대기열에 메시지를 전송할 수 있도록 하고, 이러한 리소스에 대한 액세스를 제어하는 IAM 사용자 및 그룹을 생성하는 등의 설정 단계에서 사용됩니다.

 CloudFormation 템플릿을 사용하여 AWS 리소스를 배포하는 방법에 대한 자세한 내용은 *CloudFormation 사용 설명서*의 [시작하기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.Walkthrough.html)를 참조하세요.

## CloudFormation 템플릿을 사용하여 내에서 주제 및 대기열 설정 AWS 계정
<a name="SendMessageToSQS.cloudformation.iam"></a>

이 템플릿 예제에서는 주제에 게시할 수 있는 한 IAM 그룹 멤버의 적절한 권한과 대기열에서 메시지를 읽을 수 있는 다른 그룹 멤버의 권한을 사용하여 두 Amazon SQS 대기열에 메시지를 전송할 수 있는 Amazon SNS 주제를 생성합니다. 템플릿은 각 그룹에 추가될 IAM 사용자도 생성합니다.

템플릿 콘텐츠를 파일에 복사합니다. [AWS CloudFormation 템플릿 페이지](https://aws.amazon.com/cloudformation/aws-cloudformation-templates/)에서 템플릿을 다운로드할 수도 있습니다. 템플릿 페이지에서 ** AWS 서비스별 샘플 템플릿 찾아보**기를 선택한 다음 **Amazon Simple Queue Service**를 선택합니다.

MySNSTopic은 두 개의 Amazon SQS 대기열인 두 개의 구독된 엔드포인트를 게시하기 위해 설치합니다(MyQueue1 및 MyQueue2). MyPublishTopicGroup은 IAM 그룹으로 구성원은 [Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) API 작업 또는 [sns-publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html) 명령을 사용해 MySNSTopic을 게시할 권한을 갖고 있습니다. 템플릿은 IAM 사용자 MyPublishUser 및 MyQueueUser를 생성하고 이들에게 로그인 프로필 및 액세스 키를 부여합니다. 이 템플릿으로 스택을 생성한 사용자는 로그인 프로필에 입력 파라미터로 암호를 지정합니다. 템플릿은 MyPublishUserKey 및 MyQueueUserKey를 가진 두 IAM 사용자에 대한 액세스 키를 생성합니다. AddUserToMyPublishTopicGroup이 MyPublishTopicGroup에 MyPublishUser를 추가하여 사용자는 그룹에 할당된 권한을 갖게 됩니다.

MyRDMessageQueueGroup은 멤버가 [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryReceiveMessage.html) 및 [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Query_QueryDeleteMessage.html) API 작업을 사용하여 두 Amazon SQS 대기열에서 메시지를 읽고 삭제할 수 있는 권한이 있는 IAM 그룹입니다. AddUserToMyQueueGroup이 MyRDMessageQueueGroup에 MyQueueUser를 추가하여 사용자는 그룹에 할당된 권한을 갖게 됩니다. MyQueuePolicy는 두 대기열에 알림을 게시하도록 MySNSTopic에 대한 권한을 할당합니다.

다음 목록은 CloudFormation 템플릿 내용을 보여줍니다.

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  
  "Description" : "AWS CloudFormation Sample Template SNSToSQS: This Template creates an SNS topic that can send messages to 
  two SQS queues with appropriate permissions for one IAM user to publish to the topic and another to read messages from the queues. 
  MySNSTopic is set up to publish to two subscribed endpoints, which are two SQS queues (MyQueue1 and MyQueue2). MyPublishUser is an IAM user 
  that can publish to MySNSTopic using the Publish API. MyTopicPolicy assigns that permission to MyPublishUser. MyQueueUser is an IAM user 
  that can read messages from the two SQS queues. MyQueuePolicy assigns those permissions to MyQueueUser. It also assigns permission for 
  MySNSTopic to publish its notifications to the two queues. The template creates access keys for the two IAM users with MyPublishUserKey 
  and MyQueueUserKey. ***Warning*** you will be billed for the AWS resources used if you create a stack from this template.",

  "Parameters": {
    "MyPublishUserPassword": {
      "NoEcho": "true",
      "Type": "String",
      "Description": "Password for the IAM user MyPublishUser",
      "MinLength": "1",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    },
    "MyQueueUserPassword": {
      "NoEcho": "true",
      "Type": "String",
      "Description": "Password for the IAM user MyQueueUser",
      "MinLength": "1",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    }
  },


  "Resources": {
    "MySNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "Subscription": [{
            "Endpoint": {
              "Fn::GetAtt": ["MyQueue1", "Arn"]
            },
            "Protocol": "sqs"
          },
          {
            "Endpoint": {
              "Fn::GetAtt": ["MyQueue2", "Arn"]
            },
            "Protocol": "sqs"
          }
        ]
      }
    },
    "MyQueue1": {
      "Type": "AWS::SQS::Queue"
    },
    "MyQueue2": {
      "Type": "AWS::SQS::Queue"
    },
    "MyPublishUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "LoginProfile": {
          "Password": {
            "Ref": "MyPublishUserPassword"
          }
        }
      }
    },
    "MyPublishUserKey": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "MyPublishUser"
        }
      }
    },
    "MyPublishTopicGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {
        "Policies": [{
          "PolicyName": "MyTopicGroupPolicy",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "sns:Publish"
              ],
              "Resource": {
                "Ref": "MySNSTopic"
              }
            }]
          }
        }]
      }
    },
    "AddUserToMyPublishTopicGroup": {
      "Type": "AWS::IAM::UserToGroupAddition",
      "Properties": {
        "GroupName": {
          "Ref": "MyPublishTopicGroup"
        },
        "Users": [{
          "Ref": "MyPublishUser"
        }]
      }
    },
    "MyQueueUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "LoginProfile": {
          "Password": {
            "Ref": "MyQueueUserPassword"
          }
        }
      }
    },
    "MyQueueUserKey": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "MyQueueUser"
        }
      }
    },
    "MyRDMessageQueueGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {
        "Policies": [{
          "PolicyName": "MyQueueGroupPolicy",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "sqs:DeleteMessage",
                "sqs:ReceiveMessage"
              ],
              "Resource": [{
                  "Fn::GetAtt": ["MyQueue1", "Arn"]
                },
                {
                  "Fn::GetAtt": ["MyQueue2", "Arn"]
                }
              ]
            }]
          }
        }]
      }
    },
    "AddUserToMyQueueGroup": {
      "Type": "AWS::IAM::UserToGroupAddition",
      "Properties": {
        "GroupName": {
          "Ref": "MyRDMessageQueueGroup"
        },
        "Users": [{
          "Ref": "MyQueueUser"
        }]
      }
    },
    "MyQueuePolicy": {
      "Type": "AWS::SQS::QueuePolicy",
      "Properties": {
        "PolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": {
              "Service": "sns.amazonaws.com"
            },
            "Action": ["sqs:SendMessage"],
            "Resource": "*",
            "Condition": {
              "ArnEquals": {
                "aws:SourceArn": {
                  "Ref": "MySNSTopic"
                }
              }
            }
          }]
        },
        "Queues": [{
          "Ref": "MyQueue1"
        }, {
          "Ref": "MyQueue2"
        }]
      }
    }
  },
  "Outputs": {
    "MySNSTopicTopicARN": {
      "Value": {
        "Ref": "MySNSTopic"
      }
    },
    "MyQueue1Info": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueue1", "Arn"]
            },
            "URL:",
            {
              "Ref": "MyQueue1"
            }
          ]
        ]
      }
    },
    "MyQueue2Info": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueue2", "Arn"]
            },
            "URL:",
            {
              "Ref": "MyQueue2"
            }
          ]
        ]
      }
    },
    "MyPublishUserInfo": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyPublishUser", "Arn"]
            },
            "Access Key:",
            {
              "Ref": "MyPublishUserKey"
            },
            "Secret Key:",
            {
              "Fn::GetAtt": ["MyPublishUserKey", "SecretAccessKey"]
            }
          ]
        ]
      }
    },
    "MyQueueUserInfo": {
      "Value": {
        "Fn::Join": [
          " ",
          [
            "ARN:",
            {
              "Fn::GetAtt": ["MyQueueUser", "Arn"]
            },
            "Access Key:",
            {
              "Ref": "MyQueueUserKey"
            },
            "Secret Key:",
            {
              "Fn::GetAtt": ["MyQueueUserKey", "SecretAccessKey"]
            }
          ]
        ]
      }
    }
  }
}
```

# HTTPS 엔드포인트에 Amazon SNS 알림 팬아웃
<a name="sns-http-https-endpoint-as-subscriber"></a>

Amazon SNS를 사용하여 하나 이상의 HTTP 또는 HTTPS 엔드포인트에 알림 메시지를 전송할 수 있습니다. 주제에 대한 엔드포인트를 구독할 때 사용자는 주제에 대한 알림을 게시할 수 있으며 Amazon SNS는 HTTP POST 요청을 전송하는 한편 구독된 엔드포인트에 알림 콘텐츠를 전송합니다. 사용자는 엔드포인트 구독 시 Amazon SNS가 엔드포인트에 POST 요청을 전송하기 위해 HTTP를 사용하는지 또는 HTTPS를 사용하는지 여부를 선택합니다. HTTPS를 사용할 경우 Amazon SNS에서 다음에 대한 지원을 이용할 수 있습니다.
+ **서버 이름 표시(SNI)** - 이를 통해 Amazon SNS는 이 기능을 사용하여 여러 도메인을 호스팅하기 위해 여러 인증서가 필요한 서버와 같이 SNI가 필요한 HTTPS 엔드포인트를 지원합니다. SNI에 대한 자세한 정보는 [서버 이름 표시](http://en.wikipedia.org/wiki/Server_Name_Indication)를 참조하세요.
+ **기본 및 다이제스트 액세스 인증** - HTTP POST 요청에 대해 HTTPS URL에 사용자 이름과 암호를 지정할 수 있습니다(예: `https://user:password@domain.com` 또는 `https://user@domain.com`). 사용자 이름과 암호는 HTTPS를 사용할 때 설정되는 SSL 연결을 통해 암호화됩니다. 도메인 이름만 일반 텍스트로 전송됩니다. 기본 및 다이제스트 액세스 인증에 대한 자세한 정보는 [RFC-2617](http://www.rfc-editor.org/info/rfc2617)을 참조하세요.
**중요**  
Amazon SNS는 현재 프라이빗 HTTP(S) 엔드포인트를 지원하지 않습니다.  
HTTPS URL은 API 액세스 권한을 부여한 보안 주체에 대한 Amazon SNS `GetSubscriptionAttributes` API 작업에서만 검색할 수 있습니다.
**참고**  
 클라이언트 서비스는 `HTTP/1.1 401 Unauthorized` 헤더 응답을 지원할 수 있어야 합니다.

요청은 JSON 문서의 알림에 대한 메타데이터와 함께 주제에 게시된 제목 및 메시지를 포함합니다. 요청은 다음의 HTTP POST 요청과 유사합니다. 요청 본문의 HTTP 헤더 및 JSON 형식에 대한 세부 정보는 [HTTP/HTTPS 헤더](http-header.md) 및 [HTTP/HTTPS 알림 JSON 형식](http-notification-json.md)에서 확인하세요.

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

```
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"
}
```

# HTTPS 엔드포인트에서 Amazon SNS 주제 구독
<a name="sns-subscribe-https-s-endpoints-to-topic"></a>

이 주제에서는 HTTP/S 엔드포인트에서 Amazon SNS 주제를 구독하는 방법을 설명합니다.

**Topics**
+ [1단계: Amazon SNS 메시지를 처리하도록 엔드포인트를 준비합니다.](SendMessageToHttp.prepare.md)
+ [2단계: Amazon SNS 주제에 대한 HTTP/HTTPS 엔드포인트 구독](SendMessageToHttp.subscribe.md)
+ [3단계: Amazon SNS 구독 확인](SendMessageToHttp.confirm.md)
+ [4단계: Amazon SNS 구독의 전송 정책 설정(선택 사항)](SendMessageToHttp.retry.md)
+ [5단계: 사용자에게 Amazon SNS 주제를 게시할 권한 부여(선택 사항)](SendMessageToHttp.iam.permissions.md)
+ [6단계: HTTP/HTTPS 엔드포인트에 Amazon SNS 메시지 전송](SendMessageToHttp.publish.md)

# 1단계: Amazon SNS 메시지를 처리하도록 엔드포인트를 준비합니다.
<a name="SendMessageToHttp.prepare"></a>

사용자는 주제에 대한 HTTP 엔드포인트 또는 HTTPS 엔드포인트를 구독하기 전에 HTTP 엔드포인트 또는 HTTPS 엔드포인트가 구독 확인 및 알림 메시지를 전송하기 위해 Amazon SNS가 사용하는 HTTP POST 요청을 처리할 수 있는 능력이 있는지 확인해야 합니다. 일반적으로 이는 Amazon SNS에서 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 요청의 본문을 분석하지 않고도 메시지 유형을 결정할 수 있습니다. 처리해야 할 두 가지 유형 `SubscriptionConfirmation`와 `Notification`이 있습니다. `UnsubscribeConfirmation` 메시지는 주제에서 구독이 삭제된 때에만 사용됩니다.

   HTTP 헤더에 대한 세부 정보는 [HTTP/HTTPS 헤더](http-header.md)에서 확인하세요. 다음의 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"
   }
   ```

1. 사용자의 코드는 HTTP POST 요청 및 content-type text/plain 본문의 JSON 문서를 분석하여 Amazon SNS 메시지를 구성하는 이름-값 쌍을 읽어야 합니다. JSON 분석을 사용해 제어 문자의 escaped 상태를 ASCII 문자 값으로 변환 처리합니다(예. \$1n을 줄바꿈 문자로 변환). [Jackson JSON Processor](https://github.com/FasterXML/jackson) 등의 기존 JSON 구문 분석기를 사용하거나 자체적으로 쓸 수 있습니다. 제목 및 메시지 필드의 텍스트를 유효한 JSON으로 보내려면 Amazon SNS에서 일부 제어 문자를 JSON 문서에 포함될 수 있는 이스케이프된 표현으로 변환해야 합니다. 엔드포인트에 전송된 POST 요청의 본문에 있는 JSON 문서를 수신하면 사용자는 주제에 게시된 원래 제목과 메시지의 정확한 표현을 원하는 경우 이스케이프된 문자를 다시 원본 문자 값으로 변환해야 합니다. 서명은 원본 형식의 메시지 및 제목을 서명할 문자열의 일부로 사용하기 때문에 이는 알림의 서명을 확인하고자 할 경우 아주 중요합니다.

1. 사용자의 코드는 Amazon SNS가 보낸 알림의 신뢰성, 구독 확인 또는 구독 해지 확인 메시지를 확인해야 합니다. 엔드포인트는 Amazon SNS 메시지에 포함된 정보를 사용해 서명을 재생성할 수 있으며 사용자는 Amazon SNS가 메시지로 보낸 서명을 자신의 서명과 비교함으로써 메시지의 콘텐츠를 확인할 수 있습니다. 메시지의 서명 확인에 대한 자세한 정보는 [Amazon SNS 메시지의 서명 확인](sns-verify-signature-of-message.md)에서 확인하세요.

1. 사용자의 코드는 헤더 필드 `x-amz-sns-message-type`가 지정하는 유형에 기초하여 HTTP 요청의 본문에 담긴 JSON 문서를 읽고 메시지를 처리해야 합니다. 다음은 두 가지 주요 메시지 유형 처리 지침입니다.  
**SubscriptionConfirmation**  
`SubscribeURL`의 값을 읽고 해당 URL을 방문합니다. 구독을 확인하고 엔드포인트에서 알림 수신을 시작하려면 `SubscribeURL` URL을 방문해야 합니다(예. URL에 HTTP GET 요청을 전송). `SubscribeURL`를 확인하려면 이전 단계의 HTTP 요청 예제를 확인합니다. `SubscriptionConfirmation` 메시지의 형식에 대한 자세한 정보는 [HTTP/HTTPS 구독 확인 JSON 형식](http-subscription-confirmation-json.md)에서 확인하세요. 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](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업과 함께 `Token`(`SubscriptionConfirmation` 메시지의 해당 값으로 설정된)을 사용해 구독을 확인할 수 있습니다. 주제 소유자 및 구독 소유자만 엔드포인트를 구독 해지할 수 있도록 허용하고자 하는 경우 AWS 서명을 사용해 `ConfirmSubscription` 작업을 호출합니다.  
**알림**  
`Subject` 및 `Message`에 대한 값을 읽어 주제에 게시된 알림 정보를 획득합니다.  
`Notification` 메시지 형식에 대한 세부 정보는 [HTTP/HTTPS 헤더](http-header.md)에서 확인하세요. 다음의 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"
   }
   ```

1. 엔드포인트가 적절한 상태 코드로 Amazon SNS의 HTTP POST 메시지에 응답하도록 확인해야 합니다. 연결은 약 15초 내에 끊어집니다. 엔드포인트가 연결 시간이 끊기기 전까지 응답하지 않거나 엔드포인트가 상태 코드를 200–4*xx* 범위 외로 되돌릴 경우 Amazon SNS는 메시지 전송이 실패한 것으로 간주합니다.

1. Amazon SNS로부터의 메시지 전송 재시도를 처리할 수 있도록 코드를 확인해야 합니다. Amazon SNS는 엔드포인트에서 성공적인 응답을 수신하지 않을 경우 메시지를 다시 전송하는 시도를 합니다. 이는 구독 확인 메시지를 포함한 모든 메시지에 적용됩니다. 기본 설정에서 메시지의 초기 전송이 실패할 경우 Amazon SNS는 최대 3회 재시도를 실시하며 실패한 시도 사이에 설정된 지연 시간은 20초입니다.
**참고**  
약 15초가 경과하면 메시지 요청 시간이 초과됩니다. 따라서 시간이 초과되어 메시지 전송이 실패하는 경우 Amazon SNS는 이전 전송 시도의 약 35초 후에 재시도를 합니다. 엔드포인트에 대해 다른 전송 정책을 설정할 수 있습니다.

   Amazon SNS는 `x-amz-sns-message-id` 헤더 필드를 사용하여 Amazon SNS 주제에 게시된 각 메시지를 고유하게 식별합니다. 사용자는 수신 메시지와 처리한 메시지의 ID를 비교함으로써 메시지가 재전송을 시도하는지 여부를 판단할 수 있습니다.

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

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

# 2단계: Amazon SNS 주제에 대한 HTTP/HTTPS 엔드포인트 구독
<a name="SendMessageToHttp.subscribe"></a>

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

**Amazon SNS 콘솔을 이용하여 HTTP 엔드포인트 또는 HTTPS 엔드포인트에서 주제 구독**

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

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

1. **구독 생성(Create subscription)**을 선택합니다.

1. **프로토콜(Protocol)** 드롭다운 목록에서 **HTTP** 또는 **HTTPS**를 선택합니다.

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

1. 확인 메시지가 표시됩니다. **닫기**를 선택하세요.

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

# 3단계: Amazon SNS 구독 확인
<a name="SendMessageToHttp.confirm"></a>

 Amazon SNS 구독을 확인하려면 다음 단계에 따라 엔드포인트가 메시지를 성공적으로 수신할 수 있도록 해야 합니다. 이 프로세스에는 수신 확인 메시지를 처리하도록 엔드포인트를 설정하고, 확인 URL을 검색하고, 구독을 확인하는 작업이 포함됩니다. 설정에 따라 구독을 자동으로 또는 수동으로 확인할 수 있습니다.

1. Amazon SNS 주제를 구독하면 Amazon SNS에서는 엔드포인트에 확인 메시지를 전송합니다. 이 메시지에는 구독을 확인할 때 사용해야 하는 `SubscribeURL`이 포함되어 있습니다.

1. Amazon SNS에서 수신되는 메시지를 수신 대기하도록 엔드포인트를 설정해야 합니다. 확인 메시지가 도착하면 메시지에서 **`SubscribeURL`**을 추출합니다.

1. `SubscribeURL`이 있으면 다음 두 가지 방법 중 하나로 구독을 확인할 수 있습니다.
   + **자동 확인** - 엔드포인트는 `SubscribeURL`에 **HTTP GET 요청**을 전송하여 구독을 자동으로 확인할 수 있습니다.

     이 방법은 수동 개입이 필요하지 않습니다.
   + **수동 확인** - 자동 확인이 설정되지 않은 경우 확인 메시지에서 **`SubscribeURL`**을 **복사**하여 브라우저의 주소 표시줄에 **붙여 넣습니다**.

     그러면 구독이 수동으로 확인됩니다.

1. Amazon SNS 콘솔을 사용하여 **구독 상태**를 확인할 수도 있습니다.

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

   1. 탐색 창에서 **Subscriptions**를 선택합니다.

   1. 목록에서 **구독**을 찾습니다.
      + 확인되면 `SubscriptionArn`이 표시됩니다.
      + 여전히 확인되지 않은 경우 `PendingConfirmation`으로 표시됩니다.

# 4단계: Amazon SNS 구독의 전송 정책 설정(선택 사항)
<a name="SendMessageToHttp.retry"></a>

기본 설정에서 메시지의 초기 전송이 실패할 경우 Amazon SNS는 최대 3회 재시도를 실시하며 실패한 시도 사이에 설정된 지연 시간은 20초입니다. [1단계](SendMessageToHttp.prepare.md)에서 논의되었듯 엔드포인트는 재시도되는 메시지를 처리할 수 있는 코드를 보유해야 합니다. 사용자는 주제 또는 구독에 대한 전송 정책을 설정함으로써 Amazon SNS가 전송 실패 메시지를 재전송하는 빈도 및 간격을 제어할 수 있습니다. `DeliveryPolicy`에서 HTTP/S 알림의 콘텐츠 유형을 지정할 수도 있습니다. 자세한 내용은 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy) 단원을 참조하십시오.

# 5단계: 사용자에게 Amazon SNS 주제를 게시할 권한 부여(선택 사항)
<a name="SendMessageToHttp.iam.permissions"></a>

기본 설정에서 주제 소유자는 주제를 게시할 권한을 갖습니다. 다른 사용자 또는 애플리케이션이 주제에 게시할 수 있도록 하려면 AWS Identity and Access Management (IAM)을 사용하여 주제에 대한 게시 권한을 부여해야 합니다. IAM 사용자에게 Amazon SNS 작업에 대한 권한을 부여하는 방법에 대한 자세한 정보는 [Amazon SNS로 자격 증명 기반 정책 사용](sns-using-identity-based-policies.md)에서 확인하세요.

주제에 대한 액세스를 제어하는 다음의 두 가지 방법이 있습니다.
+ 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 사용자에게도 부여됩니다. 다른 계정의 다른 모든 IAM 사용자는 자동으로 사용자 리소스에 대한 액세스가 거부됩니다. 해당의 특정 IAM 사용자에게 리소스에 대한 AWS 계정 액세스 권한을 부여하려면 계정 또는 관리자 수준 액세스 권한이 있는 IAM 사용자가 리소스에 대한 권한을 해당 IAM 사용자에게 위임해야 합니다. 교차 계정 위임에 대한 자세한 정보는 [IAM 사용 가이드](https://docs.aws.amazon.com/IAM/latest/UserGuide/Delegation.html)의 *교차 계정 액세스 권한 사용*을 참조하세요.

계정 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 메시지 전송
<a name="SendMessageToHttp.publish"></a>

주제를 게시함으로써 주제의 구독에 메시지를 전송할 수 있습니다. 주제에 게시하려면 Amazon SNS 콘솔, `[sns-publish](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html)` CLI 명령 또는 `[Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)` API 작업을 사용할 수 있습니다.

[1단계](SendMessageToHttp.prepare.md)를 따랐다면 엔드포인트에 배포한 코드는 알림을 처리해야 합니다.

**Amazon SNS 콘솔을 사용하여 주제를 게시하려면**

1. 주제에 게시할 권한이 있는 AWS 계정 또는 IAM 사용자의 자격 증명을 사용하여에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/sns/](https://console.aws.amazon.com/sns/home) Amazon SNS 콘솔을 엽니다.

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

1. **메시지 게시(Publish message)** 버튼을 선택합니다.

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

1. **메시지(Message)** 상자에 텍스트를 입력하고(예: **Hello world\$1**), **메시지 게시(Publish message)**를 선택합니다.

    “메시지가 성공적으로 게시되었습니다”라는 메시지가 나타납니다.

# Amazon SNS 메시지의 서명 확인
<a name="sns-verify-signature-of-message"></a>

Amazon SNS는 메시지 서명을 사용하여 HTTP 엔드포인트로 전송된 메시지의 신뢰성을 확인합니다. 메시지 무결성을 보장하고 스푸핑을 방지하려면 Amazon SNS 메시지를 처리하기 전에 서명을 **확인해야 합니다**.

**Amazon SNS 서명은 언제 확인해야 하나요?**

다음 시나리오에서 Amazon SNS 메시지 서명을 확인해야 합니다.
+ Amazon SNS가 HTTP(S) 엔드포인트에 알림 메시지를 보내는 경우.
+ [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_Unsubscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html) API 직접 호출 후 Amazon SNS가 엔드포인트에 확인 메시지를 보내는 경우.

**Amazon SNS는 다음 두 가지 서명 버전을 지원합니다.**
+ SignatureVersion1 - 메시지의 SHA1 해시를 사용합니다.
+ SignatureVersion2 - 메시지의 SHA256 해시를 사용합니다. 이는 더 강력한 보안을 제공하며 권장되는 옵션입니다.

**SNS 메시지 서명을 올바르게 확인하려면 다음 모범 사례를 따르세요.**
+ 무단 가로채기 공격을 방지하려면 항상 HTTPS를 사용하여 서명 인증서를 검색합니다.
+ Amazon SNS에서 인증서를 발급했는지 확인합니다.
+ 인증서의 신뢰 체인이 유효한지 확인합니다.
+ 인증서는 SNS 서명 URL에서 가져와야 합니다.
+ 검증 없이 메시지에 제공된 인증서를 신뢰하지 마세요.
+ 스푸핑을 방지하기 위해 예상치 못한 `TopicArn`이 포함된 모든 메시지를 거부합니다.
+ Amazon SNS용 AWS SDKs는 내장된 검증 로직을 제공하므로 구현이 잘못될 위험이 줄어듭니다.

# Amazon SNS 주제의 메시지 서명 버전 구성
<a name="sns-verify-signature-of-message-configure-message-signature"></a>

Amazon SNS 주제에서 메시지 서명 버전을 구성하면 메시지 확인 프로세스의 보안 및 호환성을 향상시킬 수 있습니다.

메시지 서명에 사용되는 해싱 알고리즘을 제어하려면 `SignatureVersion`**1**(SHA1)과 `SignatureVersion`**2**(SHA256) 중에서 선택합니다. 기본적으로 Amazon SNS 주제는 `SignatureVersion`**1**을 사용합니다. [https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html) API 작업을 사용하여 이 설정을 구성할 수 있습니다.

다음 코드 예제를 사용하여 AWS CLI로 주제 속성 `SignatureVersion`을 설정합니다.

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \
    --attribute-name SignatureVersion \
    --attribute-value 2
```

# HTTP 쿼리 기반 요청을 사용할 때 Amazon SNS 메시지의 서명 확인
<a name="sns-verify-signature-of-message-verify-message-signature"></a>

HTTP 쿼리 기반 요청을 사용할 때 Amazon SNS 메시지의 서명을 확인하면 메시지의 신뢰성과 무결성이 보장됩니다. 이 프로세스는 메시지가 Amazon SNS에서 시작되었으며 전송 중에 변조되지 않았음을 확인합니다. 메시지를 구문 분석하고, 서명할 올바른 문자열을 구성하고, 신뢰할 수 있는 퍼블릭 키에 대해 서명을 검증하면 스푸핑 및 무단 메시지 변경으로부터 시스템을 보호할 수 있습니다.

1. Amazon SNS가 전송한 HTTP POST 요청 본문의 JSON 문서에서 **이름/값 쌍**을 추출합니다. 이러한 필드는 **서명할 문자열**을 구성하는 데 필요합니다.
   + `Message`
   + `Subject`(있는 경우)
   + `MessageId`
   + `Timestamp`
   + `TopicArn`
   + `Type`

   예제:

   ```
   MESSAGE_FILE="message.json"
   FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")
   ```
**참고**  
필드에 이스케이프된 문자(예: `\n`)가 포함된 경우 정확히 일치하도록 **원래 형식**으로 변환합니다.

1. Amazon SNS 메시지에서 `SigningCertURL` 필드를 찾습니다. 이 인증서에는 메시지 서명을 확인하는 데 필요한 퍼블릭 키가 포함되어 있습니다. 예제:

   ```
   SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
   ```

1. `SigningCertURL`가 신뢰할 수 있는 AWS 도메인(예: https://sns.us-east-1.amazonaws.com)에서 왔는지 확인합니다. 보안상의 이유로 ** AWS 도메인 외부**URLs을 거부합니다.

1. 제공된 URL에서 **X.509 인증서**를 다운로드합니다. 예제:

   ```
   curl -s "$SIGNING_CERT_URL" -o signing_cert.pem
   ```

1. X.509 인증서로부터 **퍼블릭 키**를 추출합니다. 퍼블릭 키를 사용하면 메시지의 서명을 해독하고 무결성을 확인할 수 있습니다. 예제:

   ```
   openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem
   ```

1. 다양한 메시지 유형에는 서명할 문자열의 키-값 쌍이 서로 달라야 합니다. **메시지 유형**(Amazon SNS 메시지의 `Type` 필드)을 식별하여 포함할 **키-값 쌍**을 결정합니다.
   + **알림 메시지** - `Message`, `MessageId`, `Subject`(있는 경우), `Timestamp`, `TopicArn` 및 `Type`을 포함합니다.
   + **SubscriptionConfirmation** 또는 **UnsubscribeConfirmation 메시지** - `Message`, `MessageId`, `SubscribeURL`, `Timestamp`, `Token`, `TopicArn` 및 `Type`을 포함합니다.

1. Amazon SNS에서 확인을 위해 엄격하고 고정된 필드 순서를 따르려면 문자열에 서명해야 합니다. **명시적으로 필요한 필드만 포함해야 합니다.** 추가 필드는 추가할 수 없습니다. `Subject`와 같은 선택적 필드는 메시지에 있는 경우에만 포함되어야 하며 필수 필드 순서로 정의된 정확한 위치에 표시되어야 합니다. 예제:

   ```
   KeyNameOne\nValueOne\nKeyNameTwo\nValueTwo
   ```
**중요**  
문자열 끝에 줄바꿈 문자를 추가하면 안 됩니다.

1. **키-값 쌍**을 바이트 정렬 순서로 정렬합니다(키 이름별로 알파벳순).

1. 다음 형식 예제를 사용하여 **서명할 문자열**을 구성합니다.

   ```
   STRING_TO_SIGN=""
   for FIELD in "${FIELDS[@]}"; do
       VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
       STRING_TO_SIGN+="$FIELD\n$VALUE"
       # Append a newline after each field except the last one
       if [[ "$FIELD" != "Type" ]]; then
           STRING_TO_SIGN+="\n"
       fi
   done
   ```

   **알림 메시지의 예제:**

   ```
   Message
   My Test Message
   MessageId
   4d4dc071-ddbf-465d-bba8-08f81c89da64
   Subject
   My subject
   Timestamp
   2019-01-31T04:37:04.321Z
   TopicArn
   arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P
   Type
   Notification
   ```

   **SubscriptionConfirmation 예제:**

   ```
   Message
   Please confirm your subscription
   MessageId
   3d891288-136d-417f-bc05-901c108273ee
   SubscribeURL
   https://sns.us-east-2.amazonaws.com/...
   Timestamp
   2024-01-01T00:00:00.000Z
   Token
   abc123...
   TopicArn
   arn:aws:sns:us-east-2:123456789012:MyTopic
   Type
   SubscriptionConfirmation
   ```

1. 메시지의 `Signature` 필드는 Base64로 인코딩되어 있습니다. **원시 바이너리 형식**을 **파생된 해시**와 비교하려면 **디코딩**해야 합니다. 예제:

   ```
   SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")
   echo "$SIGNATURE" | base64 -d > signature.bin
   ```

1. `SignatureVersion` 필드를 사용하여 해시 알고리즘을 선택합니다.
   + `SignatureVersion`**1**의 경우 **SHA1**(예: `-sha1`)을 사용합니다.
   + `SignatureVersion`**2**의 경우 **SHA256**(예: `-sha256`)을 사용합니다.

1. Amazon SNS 메시지의 신뢰성을 확인하려면 구성된 문자열의 **해시**를 생성하고 **퍼블릭 키**를 사용하여 서명을 확인합니다.

   ```
   openssl dgst -sha256 -verify public_key.pem -signature signature.bin <<< "$STRING_TO_SIGN"
   ```

   서명이 유효한 경우 출력은 `Verified OK`입니다. 그렇지 않으면 출력은 `Verification Failure`입니다.

## 오류 처리가 포함된 스크립트 예제
<a name="sns-verify-signature-of-message-example"></a>

다음 예제 스크립트는 확인 프로세스를 자동화합니다.

```
#!/bin/bash

# Path to the local message file
MESSAGE_FILE="message.json"

# Extract the SigningCertURL and Signature from the message
SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")

# Fetch the X.509 certificate
curl -s "$SIGNING_CERT_URL" -o signing_cert.pem

# Extract the public key from the certificate
openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem

# Define the fields to include in the string to sign
FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")

# Initialize the string to sign
STRING_TO_SIGN=""

# Iterate over the fields to construct the string to sign
for FIELD in "${FIELDS[@]}"; do
    VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
    STRING_TO_SIGN+="$FIELD\n$VALUE"
    # Append a newline after each field except the last one
    if [[ "$FIELD" != "Type" ]]; then
        STRING_TO_SIGN+="\n"
    fi
done

# Verify the signature
echo -e "$STRING_TO_SIGN" | openssl dgst -sha256 -verify public_key.pem -signature <(echo "$SIGNATURE" | base64 -d)
```

# Amazon SNS 메시지 형식 구문 분석
<a name="sns-message-and-json-formats"></a>

Amazon SNS가 HTTP/HTTPS 엔드포인트로 메시지를 전송할 때 HTTP 헤더와 JSON 메시지 본문이 모두 포함됩니다. 이러한 메시지는 메시지 유형, 주제 ARN, 타임스탬프 및 디지털 서명과 같은 메타데이터를 포함하는 구조화된 형식을 따릅니다. Amazon SNS 메시지를 올바르게 구문 분석하면 메시지가 구독 확인, 알림 또는 구독 취소 확인인지 확인하고, 관련 데이터를 추출하고, 서명 검증을 사용하여 신뢰성을 확인할 수 있습니다.

# HTTP/HTTPS 헤더
<a name="http-header"></a>

Amazon SNS가 구독 확인, 알림 또는 구독 해지 확인 메시지를 HTTP/HTTPS 엔드포인트에 전송할 때 Amazon SNS에 특정한 여러 헤더 값과 함께 POST 메시지를 전송합니다. 이러한 작업의 헤더 값을 사용하면 `Type` 값을 읽기 위해 JSON 메시지 본문을 구문 분석할 필요 없이 메시지 유형을 파악할 수 있습니다. 기본적으로 Amazon SNS는 `text/plain; charset=UTF-8`로 설정된 `Content-Type`로 모든 알림을 HTTP/S 엔드포인트로 전송합니다. 텍스트/일반(기본값) 외 `Content-Type`을 선택하려면 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy)의 `headerContentType`를 참조하세요.

**`x-amz-sns-message-type`**  
메시지 유형. 가능한 값은 `SubscriptionConfirmation`, `Notification`, `UnsubscribeConfirmation`입니다.

**`x-amz-sns-message-id`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 알림의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`x-amz-sns-topic-arn`**  
이 메시지가 게시된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`x-amz-sns-subscription-arn`**  
이 엔드포인트에 대한 구독의 ARN입니다.

다음의 HTTP POST 헤더는 HTTP 엔드포인트에 대한 `Notification` 메시지 헤더의 예입니다.

```
POST / HTTP/1.1
x-amz-sns-message-type: Notification
x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
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: 1336
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent
```

# HTTP/HTTPS 구독 확인 JSON 형식
<a name="http-subscription-confirmation-json"></a>

사용자가 HTTP/HTTPS 엔드포인트를 구독한 후에 Amazon SNS는 구독 확인 메시지를 HTTP/HTTPS 엔드포인트에 전송합니다. 이 메시지는 구독을 확인하기 위해 방문해야 하는 `SubscribeURL` 값을 담고 있습니다(또는, `Token` 값을 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html)과 함께 사용할 수 있습니다).

**참고**  
Amazon SNS는 구독이 확인되기 전에는 알림을 이 엔드포인트로 전송하지 않습니다.

구독 확인 메시지는 다음의 이름/값 쌍을 갖는 JSON 문서를 포함하는 메시지 본문으로 된 POST 메시지입니다.

**`Type`**  
메시지 유형. 구독 확인의 경우 유형은 `SubscriptionConfirmation`입니다.

**`MessageId`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 메시지의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`Token`**  
구독 확인을 위해 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업에 사용할 수 있는 값입니다. 또는, 간단히 `SubscribeURL`을 방문하면 됩니다.

**`TopicArn`**  
이 메시지가 구독된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`Message`**  
메시지를 설명하는 문자열입니다. 구독 확인의 경우 이 문자열은 다음과 같습니다.  

```
You have chosen to subscribe to the topic arn:aws:sns:us-east-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.
```

**`SubscribeURL`**  
구독 확인을 위해 방문해야 하는 URL입니다. 또는 `Token`을 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업으로 사용하여 구독을 확인하면 됩니다.

**`Timestamp`**  
구독 확인이 전송된 시간(GMT)입니다.

**`SignatureVersion`**  
사용한 Amazon SNS 서명의 버전입니다.  
+ `SignatureVersion`이 **1**인 경우, `Signature`는, `Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 서명입니다.
+ `SignatureVersion`이 **2**인 경우, `Signature`는 `Message`, `MessageId`, `Type`, `Timestamp` 및 `TopicArn` 값의 Base64로 인코딩된 `SHA256withRSA` 서명입니다.

**`Signature`**  
`Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 또는 `SHA256withRSA` 서명입니다.

**`SigningCertURL`**  
메시지에 서명하기 위해 사용된 인증서의 URL입니다.

다음의 HTTP POST 메시지는 HTTP 엔드포인트에 대한 `SubscriptionConfirmation` 메시지의 예입니다.

```
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: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37...",
  "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+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
```

# HTTP/HTTPS 알림 JSON 형식
<a name="http-notification-json"></a>

Amazon SNS가 구독된 HTTP 또는 HTTPS 엔드포인트에 알림을 전송할 때 엔드포인트에 전송된 POST 메시지는 다음의 이름/값 쌍으로 된 JSON 문서를 구성하는 메시지 본문을 보유합니다.

**`Type`**  
메시지 유형. 알림의 경우 유형은 `Notification`입니다.

**`MessageId`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 알림의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`TopicArn`**  
이 메시지가 게시된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`Subject`**  
알림이 주제에 게시되었을 때 `Subject` 매개 변수입니다.  
이는 선택 가능한 파라미터입니다. `Subject`이 지정되지 않을 경우에는 이 이름-값 쌍은 본 JSON 문서에 표시되지 않습니다.

**`Message`**  
알림이 주제에 게시되었을 때 지정되는 `Message` 값입니다.

**`Timestamp`**  
알림이 게시된 시간(GMT)입니다.

**`SignatureVersion`**  
사용한 Amazon SNS 서명의 버전입니다.  
+ `SignatureVersion`이 **1**인 경우, `Signature`는 `Message`, `MessageId`, `Subject`(있는 경우), `Type`, `Timestamp`, `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 서명입니다.
+ `SignatureVersion`가 **2**인 경우, `Signature`는 `Message`, `MessageId`, `Subject`(있는 경우), `Type`, `Timestamp`, `TopicArn` 값의 Base64로 인코딩된 `SHA256withRSA` 서명입니다.

**`Signature`**  
`Message`, `MessageId`, `Subject`(있는 경우), `Type`, `Timestamp`, `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 또는 `SHA256withRSA` 서명입니다.

**`SigningCertURL`**  
메시지에 서명하기 위해 사용된 인증서의 URL입니다.

**`UnsubscribeURL`**  
이 주제에서 엔드포인트를 구독 해지하는데 사용하는 URL입니다. 이 URL을 방문하면 Amazon SNS는 엔드포인트를 구독 해지하고 이 엔드포인트로 전송하는 알림을 중지합니다.

다음의 HTTP POST 메시지는 HTTP 엔드포인트에 대한 `Notification` 메시지의 예입니다.

```
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: myhost.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"
  }
```

# HTTP/HTTPS 구독 해지 확인 JSON 형식
<a name="http-unsubscribe-confirmation-json"></a>

주제에서 HTTP/HTTPS 엔드포인트가 구독 해지된 후 Amazon SNS는 엔드포인트에 구독 해지 확인 메시지를 전송합니다.

구독 해지 확인 메시지는 다음의 이름/값 쌍을 갖는 JSON 문서를 포함하는 메시지 본문으로 된 POST 메시지입니다.

**`Type`**  
메시지 유형. 구독 해지 확인의 경우 유형은 `UnsubscribeConfirmation`입니다.

**`MessageId`**  
범용 고유 식별자(UUID)로 게시되는 각 메시지마다 고유합니다. 재시도 중에 Amazon SNS가 재전송하는 메시지의 경우 원본 메시지의 메시지 ID가 사용됩니다.

**`Token`**  
구독 재확인을 위해 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업에 사용할 수 있는 값입니다. 또는, 간단히 `SubscribeURL`을 방문하면 됩니다.

**`TopicArn`**  
이 엔드포인트가 구독 해지된 주제에 대한 Amazon Resource Name(ARN)입니다.

**`Message`**  
메시지를 설명하는 문자열입니다. 구독 해지 확인의 경우 이 문자열은 다음과 같습니다.  

```
You have chosen to deactivate subscription arn:aws:sns:us-east-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55.\nTo cancel this operation and restore the subscription, visit the SubscribeURL included in this message.
```

**`SubscribeURL`**  
구독 재확인을 위해 방문해야 하는 URL입니다. 또는, 그 대신 `Token`을 [https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 작업으로 사용하여 구독을 재확인하면 됩니다.

**`Timestamp`**  
구독 해지 확인이 전송된 시간(GMT)입니다.

**`SignatureVersion`**  
사용한 Amazon SNS 서명의 버전입니다.  
+ `SignatureVersion`이 **1**인 경우, `Signature`는, `Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 서명입니다.
+ `SignatureVersion`이 **2**인 경우, `Signature`는 `Message`, `MessageId`, `Type`, `Timestamp` 및 `TopicArn` 값의 Base64로 인코딩된 `SHA256withRSA` 서명입니다.

**`Signature`**  
`Message`, `MessageId`, `Type`, `Timestamp`, 및 `TopicArn` 값의 Base64로 인코딩된 `SHA1withRSA` 또는 `SHA256withRSA` 서명입니다.

**`SigningCertURL`**  
메시지에 서명하기 위해 사용된 인증서의 URL입니다.

다음의 HTTP POST 메시지는 HTTP 엔드포인트에 대한 `UnsubscribeConfirmation` 메시지의 예입니다.

```
POST / HTTP/1.1
x-amz-sns-message-type: UnsubscribeConfirmation
x-amz-sns-message-id: 47138184-6831-46b8-8f7c-afc488602d7d
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: 1399
Content-Type: text/plain; charset=UTF-8
Host: myhost.example.com
Connection: Keep-Alive
User-Agent: Amazon Simple Notification Service Agent

{
  "Type" : "UnsubscribeConfirmation",
  "MessageId" : "47138184-6831-46b8-8f7c-afc488602d7d",
  "Token" : "2336412f37...",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to deactivate subscription arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55.\nTo cancel this operation and restore 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=2336412f37fb6...",
  "Timestamp" : "2012-04-26T20:06:41.581Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEHXgJm...",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
```

# SetSubscriptionAttributes 전송 정책 JSON 형식
<a name="set-sub-attributes-delivery-policy-json"></a>

`SetSubscriptionAttributes` 작업에 요청을 전송하고 `DeliveryPolicy`의 값에 대해 `AttributeName` 매개 변수를 설정할 경우, `AttributeValue` 매개 변수의 값은 유효한 JSON 객체이어야 합니다. 예를 들어, 다음의 예는 최대 5회 재시도하도록 전송 정책을 설정합니다.

```
http://sns.us-east-2.amazonaws.com/
?Action=SetSubscriptionAttributes
&SubscriptionArn=arn%3Aaws%3Asns%3Aus-east-2%3A123456789012%3AMy-Topic%3A80289ba6-0fd4-4079-afb4-ce8c8260f0ca
&AttributeName=DeliveryPolicy
&AttributeValue={"healthyRetryPolicy":{"numRetries":5}}
...
```

`AttributeValue` 매개 변수의 값에 다음의 JSON 형식을 사용합니다.

```
{
    "healthyRetryPolicy" : {
        "minDelayTarget" :  int,
        "maxDelayTarget" : int,
        "numRetries" : int,
        "numMaxDelayRetries" : int,
        "backoffFunction" : "linear|arithmetic|geometric|exponential"
    },
    "throttlePolicy" : {
        "maxReceivesPerSecond" : int
    },
    "requestPolicy" : {
        "headerContentType" : "text/plain | application/json | application/xml"
    }
}
```

`SetSubscriptionAttribute` 작업에 대한 자세한 내용을 확인하려면 *Amazon Simple Notification Service API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetSubscriptionAttributes.html)로 이동하세요. 지원되는 HTTP 콘텐츠 유형 헤더에 대한 자세한 내용은 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy)을 참조하세요.

# SetTopicAttributes 전송 정책 JSON 형식
<a name="set-topic-attributes-delivery-policy-json"></a>

`SetTopicAttributes` 작업에 요청을 전송하고 `DeliveryPolicy`의 값에 대해 `AttributeName` 매개 변수를 설정할 경우, `AttributeValue` 매개 변수의 값은 유효한 JSON 객체이어야 합니다. 예를 들어, 다음의 예는 최대 5회 재시도하도록 전송 정책을 설정합니다.

```
http://sns.us-east-2.amazonaws.com/
?Action=SetTopicAttributes
&TopicArn=arn%3Aaws%3Asns%3Aus-east-2%3A123456789012%3AMy-Topic
&AttributeName=DeliveryPolicy
&AttributeValue={"http":{"defaultHealthyRetryPolicy":{"numRetries":5}}}
...
```

`AttributeValue` 매개 변수의 값에 다음의 JSON 형식을 사용합니다.

```
{
    "http" : {
        "defaultHealthyRetryPolicy" : {
            "minDelayTarget":  int,
            "maxDelayTarget": int,
            "numRetries": int,
            "numMaxDelayRetries": int,
            "backoffFunction": "linear|arithmetic|geometric|exponential"
        },
        "disableSubscriptionOverrides" : Boolean,
        "defaultThrottlePolicy" : {
            "maxReceivesPerSecond" : int
        },
        "defaultRequestPolicy" : {
            "headerContentType" : "text/plain | application/json | application/xml"
        }
    }
}
```

`SetTopicAttribute` 작업에 대한 자세한 내용을 확인하려면 *Amazon Simple Notification Service API 참조*의 [SetTopicAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)로 이동하세요. 지원되는 HTTP 콘텐츠 유형 헤더에 대한 자세한 내용은 [HTTP/S 전송 정책 생성](sns-message-delivery-retries.md#creating-delivery-policy)을 참조하세요.

# Amazon SNS 이벤트를 AWS Event Fork Pipelines에 팬아웃
<a name="sns-fork-pipeline-as-subscriber"></a>


|  | 
| --- |
| 이벤트 아카이브 및 분석을 위해 Amazon SNS는 이제 Amazon Data Firehose와의 기본 통합 기능을 사용할 것을 권장합니다. Firehose 전송 스트림에서 SNS 주제를 구독하여 Amazon Simple Storage Service(Amazon S3) 버킷, Amazon Redshift 테이블, Amazon OpenSearch Service(OpenSearch Service) 등과 같은 아카이브 및 분석 엔드포인트에 알림을 보낼 수 있습니다. Firehose 전송 스트림에서 Amazon SNS를 사용하는 것은 AWS Lambda 함수를 사용할 필요가 없는 완전 관리형 코드 없는 솔루션입니다. 자세한 내용은 [Firehose 전송 스트림으로 팬아웃](sns-firehose-as-subscriber.md) 단원을 참조하십시오. | 

Amazon SNS를 사용하여 게시자 서비스에 의해 트리거되는 이벤트에 응답하여 자동으로 작업을 수행하는 구독자 서비스를 사용하는 이벤트 기반 애플리케이션을 빌드할 수 있습니다. 이 아키텍처 패턴은 서비스에서 재사용성, 상호 작용성 및 확장성을 향상할 수 있습니다. 하지만 이벤트 저장, 백업, 검색, 분석, 다시 보기 등 일반적인 이벤트 처리 요구 사항을 해결하는 파이프라인으로 이벤트 처리를 분기하는 것은 공수가 많이 들어갈 수 있습니다.

이벤트 기반 애플리케이션의 개발을 가속화하기 위해 AWS Event Fork Pipelines 기반 이벤트 처리 파이프라인에서 Amazon SNS 주제를 구독할 수 있습니다. AWS Event Fork Pipelines은 [AWS 서버리스 애플리케이션 모델](https://aws.amazon.com/serverless/sam/)(AWS SAM)을 기반으로 하는 오픈 소스 [중첩](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html) 애플리케이션 제품군으로, [AWS Event Fork Pipelines 제품군](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines)(사용자 **지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시** 선택)에서 AWS 계정에 직접 배포할 수 있습니다.

 AWS Event Fork Pipelines 사용 사례는 섹션을 참조하세요[Amazon SNS Event Fork Pipelines 샘플 애플리케이션 배포 및 테스트](sns-deploy-test-fork-pipelines-sample-application.md).

**Topics**
+ [AWS Event Fork Pipelines 작동 방식](#how-sns-fork-works)
+ [AWS Event Fork 파이프라인 배포](#deploying-sns-fork-pipelines)
+ [Amazon SNS Event Fork Pipelines 샘플 애플리케이션 배포 및 테스트](sns-deploy-test-fork-pipelines-sample-application.md)
+ [AWS Event Fork Pipelines에서 Amazon SNS 주제 구독](sns-subscribe-event-fork-pipelines.md)

## AWS Event Fork Pipelines 작동 방식
<a name="how-sns-fork-works"></a>

AWS Event Fork Pipelines은 서버리스 설계 패턴입니다. 그러나 AWS SAM(이벤트 기반 플랫폼을 보강하기 AWS 계정 위해 (AWS SAR)에서 AWS Serverless Application Repository 로 직접 배포할 수 있음)을 기반으로 하는 중첩된 서버리스 애플리케이션 제품군이기도 합니다. 아키텍처에서 필요할 경우 이러한 중첩 애플리케이션을 개별적으로 배포할 수 있습니다.

**Topics**
+ [이벤트 저장 및 백업 파이프라인](#sns-fork-event-storage-and-backup-pipeline)
+ [이벤트 검색 및 분석 파이프라인](#sns-fork-event-search-and-analytics-pipeline)
+ [이벤트 다시 보기 파이프라인](#sns-fork-event-replay-pipeline)

다음 다이어그램은 세 개의 중첩 애플리케이션으로 보완된 AWS Event Fork Pipelines 애플리케이션을 보여줍니다. 아키텍처에 필요한 대로 SAR의 AWS Event Fork Pipelines 제품군 AWS 에서 파이프라인을 독립적으로 배포할 수 있습니다.

![\[Amazon SNS 주제의 이벤트가 이벤트 스토리지 및 백업, AWS 이벤트 검색 및 분석, 이벤트 재생이라는 세 가지 파이프라인을 통해 필터링되고 처리되는 방법을 보여주는 Event Fork Pipelines 아키텍처입니다. 이러한 파이프라인은 수직 스택 상자로 표시되며, 각각은 동일한 Amazon SNS 주제와 병렬로 이벤트를 독립적으로 처리합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fork-pipeline-as-subscriber-how-it-works.png)


각 파이프라인은 동일한 Amazon SNS 주제를 구독하여 이러한 이벤트가 주제에 게시될 경우 동시에 이벤트를 처리할 수 있습니다. 각 파이프라인은 독립적이며 각각 [구독 필터 정책](sns-subscription-filter-policies.md)을 설정할 수 있습니다. 그러므로 특정 파이프라인이 주제에 게시되는 모든 이벤트가 아니라 이벤트 하위 집합만 처리할 수 있습니다.

**참고**  
세 개의 AWS Event Fork Pipelines을 일반 이벤트 처리 파이프라인(아마도 이미 Amazon SNS 주제를 구독한 경우)과 함께 배치하므로 기존 워크로드에서 AWS Event Fork Pipelines을 활용하기 위해 현재 메시지 게시자의 어떤 부분도 변경할 필요가 없습니다.

### 이벤트 저장 및 백업 파이프라인
<a name="sns-fork-event-storage-and-backup-pipeline"></a>

다음 다이어그램은 [이벤트 저장 및 백업 파이프라인](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-storage-backup-pipeline)입니다. 이 파이프라인에서 Amazon SNS 주제를 구독하여 시스템을 통과하는 이벤트를 자동으로 백업할 수 있습니다.

이 파이프라인은 Amazon SNS 주제에서 전달되는 이벤트를 버퍼링하는 Amazon SQS 대기열, 대기열에서 이러한 이벤트를 자동으로 폴링하여 스트림으로 푸시하는 AWS Lambda 함수, 스트림에서 로드된 이벤트를 내구성 있게 백업하는 Amazon S3 버킷으로 구성됩니다. Amazon SNS 

![\[Amazon SNS 주제에서 이벤트를 처리하고 백업하도록 설계된 Fork-Event-Storage-Backup-Pipeline입니다. 흐름은 이벤트가 Amazon SQS 대기열로 팬아웃되는 Amazon SNS Amazon SQS 주제로 시작됩니다. 그런 다음 이러한 필터링된 이벤트는 Lambda 함수에 의해 처리되어 Data Firehose로 전달됩니다. Firehose 스트림은 이벤트를 Amazon S3 백업 버킷에 로드하기 전에 이벤트를 버퍼링, 변환 및 압축하는 역할을 합니다. 마지막으로 Amazon Athena를 사용하여 저장된 데이터를 쿼리할 수 있습니다. 이 다이어그램은 일련의 아이콘과 화살표를 사용하여 한 서비스에서 다음 서비스로의 흐름을 보여주며 파이프라인의 각 구성 요소에 명확하게 레이블을 지정합니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fork-event-storage-and-backup-pipeline.png)


Firehose 스트림의 동작을 미세 조정하려면 버킷으로 로드하기 전에 이벤트를 버퍼링, 변환 및 압축하도록 구성할 수 있습니다. 이벤트가 로드될 때 Amazon Athena를 사용하여 표준 SQL 쿼리로 버킷을 쿼리할 수 있습니다. 또한 기존 Amazon S3 버킷을 재사용하거나 새 버킷을 생성하도록 파이프라인을 구성할 수 있습니다.

### 이벤트 검색 및 분석 파이프라인
<a name="sns-fork-event-search-and-analytics-pipeline"></a>

다음 다이어그램은 [이벤트 검색 및 분석 파이프라인](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-search-analytics-pipeline)입니다. 이 파이프라인에서 Amazon SNS 주제를 구독하여 검색 도메인에서 시스템을 통과하는 이벤트를 인덱싱한 후 이들 이벤트에 대해 분석을 실행할 수 있습니다.

이 파이프라인은 Amazon SNS 주제에서 전달된 이벤트를 버퍼링하는 Amazon SQS 대기열, 대기열에서 이벤트를 폴링하여 스트림으로 푸시하는 AWS Lambda 함수, Firehose 스트림에서 로드한 이벤트를 인덱싱하는 Amazon OpenSearch Service 도메인, 검색 도메인에서 인덱싱할 수 없는 배달 못한 편지 이벤트를 저장하는 Amazon S3 버킷으로 구성됩니다. Amazon SNS 

![\[AWS 아키텍처 내의 이벤트 검색 및 분석 파이프라인입니다. 모든 이벤트를 수신하는 Amazon SNS 주제와 함께 왼쪽에서 시작됩니다. 그런 다음 이러한 이벤트는 '필터링된 이벤트 팬아웃'을 나타내는 점선을 통해 Amazon SQS 대기열로 퍼널링됩니다. 대기열에서 이벤트는 Lambda 함수에 의해 처리된 다음 Data Firehose 스트림으로 전달됩니다. Data Firehose는 이벤트를 두 대상으로 보냅니다. 한 경로는 인덱싱을 위해 Amazon Elasticsearch Service로 연결되고, 다른 경로는 처리할 수 없거나 “dead-letter” 이벤트를 Amazon S3 데드 레터 버킷으로 보냅니다. 맨 오른쪽에서 Elasticsearch Service의 출력은 분석 및 시각화를 위해 Kibana 대시보드로 공급됩니다. 전체 흐름은 수평으로 배치되며 각 구성 요소는 데이터 흐름 방향을 보여주는 줄로 연결됩니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fork-event-search-and-analytics-pipeline.png)


이벤트 버퍼링, 변환 및 압축에서 Firehose 스트림을 미세 조정하기 위해 이 파이프라인을 구성할 수 있습니다.

파이프라인이의 기존 OpenSearch 도메인을 재사용할지 AWS 계정 아니면 새 도메인을 생성할지도 구성할 수 있습니다. 검색 도메인에서 이벤트가 인덱싱될 때 Kibana를 사용하여 이벤트에 대한 분석을 실행하고 시각적 대시보드를 실시간으로 업데이트할 수 있습니다.

### 이벤트 다시 보기 파이프라인
<a name="sns-fork-event-replay-pipeline"></a>

다음 다이어그램은 [이벤트 다시 보기 파이프라인](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-event-replay-pipeline)입니다. 시스템에서 지난 14일간 처리한 이벤트를 기록하려면 이 파이프라인에서 Amazon SNS 주제를 구독한 후 이벤트를 다시 처리할 수 있습니다(예를 들어 플랫폼이 장애로부터 복구해야 할 경우).

이 파이프라인은 Amazon SNS 주제에서 전달되는 이벤트를 버퍼링하는 Amazon SQS Amazon SNS 대기열과 대기열에서 이벤트를 폴링하고 일반 이벤트 처리 파이프라인으로 리드라이브하는 AWS Lambda 함수로 구성되며,이 또한 주제를 구독합니다.

![\[순서도 형식의 이벤트 재생 파이프라인입니다. 왼쪽에서 오른쪽으로, 필터링된 이벤트를 두 개의 병렬 프로세스에 배포하는 Amazon SNS 주제로 시작합니다. 상위 흐름은 이벤트를 처리하는 Amazon SQS 대기열을 포함하는 정규 이벤트 처리 파이프라인을 나타냅니다. 'fork-event-replay-pipeline'으로 레이블이 지정된 하위 흐름에는 Lambda 재생 함수에 의해 처리되기 전에 이벤트가 일시적으로 저장되는 Amazon SQS 재생 대기열이 포함됩니다. 이 Lambda 함수는 재생 기능이 활성화 또는 비활성화되었는지 여부에 따라 이벤트를 일반 이벤트 처리 파이프라인으로 재구동하거나 재생을 위해 이벤트를 보류할 수 있는 기능이 있습니다. 또한 다이어그램은 연산자가 이벤트 재생 기능을 활성화하거나 비활성화할 수 있는 제어 권한이 있음을 나타냅니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fork-event-replay-pipeline.png)


**참고**  
기본적으로 다시 보기 함수는 비활성화되어 이벤트를 리드라이브하지 않습니다. 이벤트를 다시 처리해야 할 경우 AWS Lambda 다시 보기 함수용 이벤트 소스로 Amazon SQS 다시 보기 대기열을 활성화해야 합니다.

## AWS Event Fork 파이프라인 배포
<a name="deploying-sns-fork-pipelines"></a>

[AWS Event Fork Pipelines 제품군](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines)(사용자 **지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시** 선택)은 [AWS Lambda 콘솔](https://console.aws.amazon.com/lambda/)을 사용하여 수동으로 배포하고 테스트할 수 AWS Serverless Application Repository있는의 퍼블릭 애플리케이션 그룹으로 사용할 수 있습니다. AWS Lambda 콘솔을 사용하여 파이프라인을 배포하는 방법에 대한 자세한 내용은 섹션을 참조하세요[AWS Event Fork Pipelines에서 Amazon SNS 주제 구독](sns-subscribe-event-fork-pipelines.md).

프로덕션 시나리오에서는 전체 애플리케이션의 AWS SAM 템플릿 내에 AWS Event Fork Pipelines을 포함하는 것이 좋습니다. 중첩 애플리케이션 기능을 사용하면 중첩 애플리케이션의 AWS SAR `ApplicationId` 및를 참조하여 `[AWS::Serverless::Application](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template.html#serverless-sam-template-application)` AWS SAM 템플릿에 리소스를 추가하여이 작업을 수행할 `SemanticVersion` 수 있습니다.

예를 들어 AWS SAM 템플릿의 `Resources` 섹션에 다음 YAML 코드 조각을 추가하여 이벤트 스토리지 및 백업 파이프라인을 중첩 애플리케이션으로 사용할 수 있습니다.

```
Backup:   
    Type: AWS::Serverless::Application
  Properties:
    Location:
      ApplicationId: arn:aws:serverlessrepo:us-east-2:123456789012:applications/fork-event-storage-backup-pipeline
      SemanticVersion: 1.0.0
    Parameters: 
      #The ARN of the Amazon SNS topic whose messages should be backed up to the Amazon S3 bucket.
      TopicArn: !Ref MySNSTopic
```

파라미터 값을 지정할 때 AWS CloudFormation 내장 함수를 사용하여 템플릿의 다른 리소스를 참조할 수 있습니다. 예를 들어 위의 YAML 코드 조각에서 `TopicArn` 파라미터는 AWS SAM 템플릿의 다른 곳에 `MySNSTopic`정의된 `[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic.html)` 리소스를 참조합니다. 자세한 정보는 *AWS CloudFormation 사용 설명서*의 [내장 함수 참조](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)를 확인하세요.

**참고**  
 AWS SAR 애플리케이션의 AWS Lambda 콘솔 페이지에는 AWS SAR 애플리케이션을 클립보드에 중첩하는 데 필요한 YAML을 복사하는 **SAM 리소스로 복사** 버튼이 포함되어 있습니다.

# Amazon SNS Event Fork Pipelines 샘플 애플리케이션 배포 및 테스트
<a name="sns-deploy-test-fork-pipelines-sample-application"></a>

이벤트 기반 애플리케이션의 개발을 가속화하기 위해 AWS Event Fork Pipelines 기반 이벤트 처리 파이프라인에서 Amazon SNS 주제를 구독할 수 있습니다. AWS Event Fork Pipelines은 [AWS 서버리스 애플리케이션 모델](https://aws.amazon.com/serverless/sam/)(AWS SAM)을 기반으로 하는 오픈 소스 [중첩](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html) 애플리케이션 제품군으로, [AWS Event Fork Pipelines 제품군](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines)(사용자 **지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시** 선택)에서 AWS 계정에 직접 배포할 수 있습니다. 자세한 내용은 [AWS Event Fork Pipelines 작동 방식](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works) 단원을 참조하십시오.

이 페이지에서는 AWS Management Console 를 사용하여 AWS Event Fork Pipelines 샘플 애플리케이션을 배포하고 테스트하는 방법을 보여줍니다.

**중요**  
 AWS Event Fork Pipelines 샘플 애플리케이션 배포를 완료한 후 원치 않는 비용이 발생하지 않도록 CloudFormation 스택을 삭제합니다. 자세한 정보는 *AWS CloudFormation 사용 설명서*의 [CloudFormation 콘솔에서 스택 삭제](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)를 참조하세요.

# AWS Event Fork Pipelines 사용 사례 예제
<a name="example-sns-fork-use-case"></a>

다음 시나리오에서는 Event Fork Pipelines을 사용하는 AWS 이벤트 기반 서버리스 전자 상거래 애플리케이션을 설명합니다. 에서이 [예제 전자 상거래 애플리케이션을](https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:077246666028:applications~fork-example-ecommerce-checkout-api) 사용한 AWS Serverless Application Repository 다음 AWS Lambda 콘솔을 AWS 계정 사용하여에 배포할 수 있습니다. 콘솔에서 이를 테스트하고 GitHub에서 소스 코드를 검사할 수 있습니다.

![\[AWS 서비스를 통합하는 서버리스 전자 상거래 애플리케이션의 아키텍처입니다. 이 그림은 API Gateway를 통해 주문을 하는 전자 상거래 사용자의 흐름을 주문 스토리지, 검색 분석 및 재생을 포함한 다양한 처리 파이프라인으로 묘사하여 Amazon SNS, Lambda, Amazon SQS, DynamoDB 및 Kibana를 통해 이벤트를 관리하고 분석하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/images/sns-fork-example-use-case.png)


이 전자 상거래 애플리케이션은 API Gateway에서 호스팅하고 AWS Lambda 함수에서 지원하는 RESTful API를 통해 구매자로부터 주문을 받습니다`CheckoutApiBackendFunction`. 이 함수는 모든 수신된 주문을 `CheckoutEventsTopic`이라는 Amazon SNS 주제 에 게시하고, 이 주제는 주문을 4가지 파이프라인으로 분산합니다.

첫 번째 파이프라인은 전자 상거래 애플리케이션의 소유자가 설계 및 구현한 정규 체크아웃 처리 파이프라인입니다. 이 파이프라인에는 수신된 모든 주문을 버퍼링`CheckoutQueue`하는 Amazon SQS 대기열, 이러한 주문을 처리하기 위해 대기열을 폴링`CheckoutFunction`하는 라는 AWS Lambda 함수, 제출된 모든 주문을 안전하게 저장하는 DynamoDB 테이블`CheckoutTable`이 있습니다.

## AWS Event Fork 파이프라인 적용
<a name="applying-sns-fork-pipelines"></a>

전자 상거래 애플리케이션의 구성 요소가 핵심 비즈니스 로직을 처리합니다. 그러나 전자 상거래 애플리케이션 소유자도 다음을 처리해야 합니다.
+ **규정 준수**—안전한 압축 백업(저장 시 암호화) 및 민감한 정보의 폐기
+ **복원성**—이행 프로세스 중단 시 최근 주문 다시 보기
+ **검색 가능성**—접수된 주문에 대한 분석 실행 및 지표 생성

애플리케이션 소유자는이 이벤트 처리 로직을 구현하는 대신 AWS Event Fork Pipelines에서 `CheckoutEventsTopic` Amazon SNS 주제를 구독할 수 있습니다.
+ [이벤트 저장 및 백업 파이프라인](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline)은 데이터를 변환하여 신용카드 세부 정보를 제거하고, 데이터를 60초간 버퍼링하고, GZIP을 사용하여 데이터를 압축하고, Amazon S3용 기본 고객 관리형 키를 사용하여 암호화하도록 구성되어 있습니다. 이 키는 AWS Key Management Service ()에서 관리 AWS 및 구동됩니다AWS KMS.

  자세한 정보는 *Amazon Data Firehose 개발자 안내서*의 [대상에 대해 Amazon S3 선택](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-s3), [Amazon Data Firehose 데이터 변환](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html) 및 [설정 구성](https://docs.aws.amazon.com/firehose/latest/dev/create-configure.html)을 참조하세요.
+ [이벤트 검색 및 분석 파이프라인](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)은 인덱스 재시도 지속시간 30초, 검색 도메인에서 인덱싱되지 않은 주문을 저장할 버킷, 인덱싱할 주문을 제한하는 필터 정책으로 구성되어 있습니다.

  자세한 정보는 *Amazon Data Firehose 개발자 가이드*의 [대상에 대한 OpenSearch Service 선택](https://docs.aws.amazon.com/firehose/latest/dev/create-destination.html#create-destination-elasticsearch)을 참조하세요.
+ [이벤트 다시 보기 파이프라인](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline)은 전자 상거래 애플리케이션 소유자가 설계 및 구현한 일반 체크아웃 처리 파이프라인의 Amazon SQS 대기열 부분으로 구성되어 있습니다.

  자세한 정보는 *Amazon Simple Queue Service 개발자 안내서*의 [대기열 이름 및 URL](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-general-identifiers.html#queue-name-url)을 참조하세요.

다음 JSON filter 필터 정책은 이벤트 검색 및 분석 파이프라인의 구성에 설정되었습니다. 수신 주문 중 전체 금액이 \$1100 이상인 주문만 일치됩니다. 자세한 내용은 [Amazon SNS 메시지 필터링](sns-message-filtering.md) 단원을 참조하십시오.

```
{				
   "amount": [{ "numeric": [ ">=", 100 ] }]
}
```

전자 상거래 애플리케이션 소유자는 AWS Event Fork Pipelines 패턴을 사용하여 이벤트 처리를 위한 차별화되지 않는 로직 코딩을 따르는 개발 오버헤드를 피할 수 있습니다. 대신에서 AWS Serverless Application Repository 로 직접 AWS Event Fork Pipelines을 배포할 수 있습니다 AWS 계정.

# 1단계: 샘플 Amazon SNS 애플리케이션 배포
<a name="deploy-sample-application"></a>

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

1. 탐색 창에서 **함수**를 선택한 후 **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 다음을 수행합니다.

   1. **서버리스 앱 리포지토리 찾아보기**, **퍼블릭 애플리케이션**, **사용자 지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시**를 선택합니다.

   1. `fork-example-ecommerce-checkout-api`을 검색하여 이 애플리케이션을 선택합니다.

1. **fork-example-ecommerce-checkout-api** 페이지에서 다음을 수행합니다.

   1. **Application settings(애플리케이션 설정)** 섹션에서 **애플리케이션 이름**을 입력합니다(예: `fork-example-ecommerce-my-app`).
**참고**  
나중에 손쉽게 리소스를 찾을 수 있도록 접두사 `fork-example-ecommerce`를 유지하세요.
각 배포에서 애플리케이션 이름이 고유해야 합니다. 애플리케이션 이름을 재사용하면 배포는 (새 스택을 생성하는 대신) 이전에 배포된 CloudFormation 스택만 업데이트합니다.

   1. (선택 사항) 애플리케이션의 Lambda 함수 실행을 위해 다음 **LogLevel** 설정 중 하나를 입력합니다.
      + `DEBUG`
      + `ERROR`
      + `INFO`(기본값)
      + `WARNING`

1. **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications.(본인은 이 앱이 사용자 지정 IAM 역할, 리소스 정책을 생성하고 중첩 애플리케이션을 배포함을 확인합니다.)**를 선택하고 페이지 맨 아래에서 **배포**를 선택합니다.

**Deployment status for fork-example-ecommerce-*my-app*(fork-example-ecommerce-my-app 배포 상태)** 페이지에서 Lambda가 **Your application is being deployed(애플리케이션을 배포 중)** 상태를 표시합니다.

**리소스** 섹션에서는 스택 생성을 CloudFormation 시작하고 각 리소스에 대한 **CREATE\$1IN\$1PROGRESS** 상태를 표시합니다. 프로세스가 완료되면 **CREATE\$1COMPLETE** 상태가 CloudFormation 표시됩니다.

**참고**  
모든 리소스를 배포하는 데 20\$130분 정도 걸릴 수 있습니다.

배포가 완료되면 Lambda가 **Your application has been deployed(애플리케이션이 배포됨)** 상태를 표시합니다.

# 2단계: SNS 연결 샘플 애플리케이션 실행
<a name="execute-sample-application"></a>

1.  AWS Lambda 콘솔의 탐색 패널에서 **애플리케이션을** 선택합니다.

1. **애플리케이션** 페이지의 검색란에서 `serverlessrepo-fork-example-ecommerce-my-app`을 검색하여 이 애플리케이션을 선택합니다.

1. **리소스** 섹션에서 다음을 수행합니다.

   1. 유형이 **ApiGateway RestApi**인 리소스를 찾으려면 **유형**(예: `ServerlessRestApi`)별로 리소스를 정렬한 다음 리소스를 확장합니다.

   1. 유형이 각각 **ApiGateway Deployment** 및 **ApiGateway Stage**인 2개의 중첩 리소스가 표시됩니다.

   1. **Prod API endpoint(Prod API 엔드포인트)** 링크를 복사하고 여기에 `/checkout`를 추가합니다. 예: 

      ```
      https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
      ```

1. 다음 JSON을 `test_event.json` 파일에 복사합니다.

   ```
   {
      "id": 15311,
      "date": "2019-03-25T23:41:11-08:00",
      "status": "confirmed",
      "customer": {
         "id": 65144,		
   	 "quantity": 2,
         "price": 25.00,
         "subtotal": 50.00
      }]
   }
   ```

1. HTTPS 요청을 API 엔드포인트로 전송하려면 `curl` 명령을 실행하여 샘플 이벤트 페이로드를 입력으로 전달합니다. 예:

   ```
   curl -d "$(cat test_event.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API가 다음과 같이 실행 성공을 나타내는 빈 응답을 반환합니다.

   ```
   { }
   ```

# 3단계: Amazon SNS 애플리케이션 및 파이프라인 성능 확인
<a name="verify-sample-application-pipelines"></a>

## 1단계: 샘플 체크아웃 애플리케이션의 실행을 확인
<a name="verify-execution-checkout-pipeline"></a>

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

1. 탐색 창에서 **테이블**을 선택합니다.

1. `serverlessrepo-fork-example`을 검색하고 `CheckoutTable`을 선택합니다.

1. 테이블 세부 정보에서 **항목**을 선택한 다음 생성된 항목을 선택합니다.

   저장된 속성이 표시됩니다.

## 2단계: 이벤트 저장 및 백업 파이프라인의 실행을 확인
<a name="verify-execution-event-storage-backup-pipeline"></a>

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

1. 탐색 창에서 **버킷**을 선택합니다.

1. `serverlessrepo-fork-example`을 검색하고 `CheckoutBucket`을 선택합니다.

1. 확장명이 `.gz`인 파일을 찾을 때까지 디렉터리 계층을 탐색합니다.

1. 파일을 다운로드하려면 **작업**, **열기**를 선택합니다.

1. 이 파이프라인은 규정 준수를 위해 신용카드 정보를 폐기하는 Lambda 함수로 구성되어 있습니다.

   저장된 JSON 페이로드가 신용카드 정보를 포함하지 않는지 확인하려면 파일을 압축합니다.

## 3단계: 이벤트 검색 및 분석 파이프라인의 실행을 확인
<a name="verify-execution-event-search-analytics-pipeline"></a>

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

1. 탐색 창의 **My domains(내 도메인)**에서 접두사가 `serverl-analyt`인 도메인을 선택합니다.

1. 이 파이프라인은 숫자 일치 조건을 설정하는 Amazon SNS 구독 필터 정책으로 구성되어 있습니다.

   이벤트가 금액이 USD \$1100를 초과하는 주문을 참조하기 때문에 인덱싱되는지 확인하려면, **serverl-analyt-*abcdefgh1ijk*** 페이지에서 **Indices(인덱스)**, **checkout\$1events(체크아웃 이벤트)**를 선택합니다.

## 4단계: 이벤트 다시 보기 애플리케이션의 실행을 확인
<a name="verify-execution-event-replay-pipeline"></a>

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

1. 대기열 목록에서 `serverlessrepo-fork-example`을 검색하고 `ReplayQueue`를 선택합니다.

1. [**메시지 전송 및 수신(Send and receive messages)**]을 선택합니다.

1. **Send and receive messages in fork-example-ecommerce-*my-app*...ReplayP-ReplayQueue-*123ABCD4E5F6***(fork-example-ecommerce-my-app...ReplayP-ReplayQueue-123ABCD4E5F6에서 메시지 보내기 및 받기) 대화 상자에서 **Poll for messages**(메시지 폴링)를 선택합니다.

1. 이벤트가 대기 상태로 전환되는지 확인하려면 대기열에 표시되는 메시지 옆의 **추가 정보**를 선택합니다.

# 4단계: 문제를 시뮬레이션하고 복구를 위해 이벤트를 다시 보기
<a name="simulate-issue-replay-events-for-recovery"></a>

## 1단계: 시뮬레이션된 문제를 활성화하고 두 번째 API 요청을 전송
<a name="enable-simulated-issue-send-second-api-request"></a>

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

1. 탐색 창에서 **함수**를 선택합니다.

1. `serverlessrepo-fork-example`을 검색하고 `CheckoutFunction`을 선택합니다.

1. **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** 페이지의 **환경 변수** 섹션에서 **BUG\$1ENABLED** 변수를 **true**로 설정하고 **저장**을 선택합니다.

1. 다음 JSON을 `test_event_2.json` 파일에 복사합니다.

   ```
   {
   	   "id": 9917,
   	   "date": "2019-03-26T21:11:10-08:00",
   	   "status": "confirmed",
   	   "customer": {
   	      "id": 56999,
   "quantity": 1,
   	      "price": 75.00,
   	      "subtotal": 75.00
   	   }]
   	}
   ```

1. HTTPS 요청을 API 엔드포인트로 전송하려면 `curl` 명령을 실행하여 샘플 이벤트 페이로드를 입력으로 전달합니다. 예:

   ```
   curl -d "$(cat test_event_2.json)" https://abcdefghij.execute-api.us-east-2.amazonaws.com/Prod/checkout
   ```

   API가 다음과 같이 실행 성공을 나타내는 빈 응답을 반환합니다.

   ```
   { }
   ```

## 2단계: 시뮬레이션된 데이터 손상 확인
<a name="verify-simulated-data-corruption"></a>

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

1. 탐색 창에서 **테이블**을 선택합니다.

1. `serverlessrepo-fork-example`을 검색하고 `CheckoutTable`을 선택합니다.

1. 테이블 세부 정보에서 **항목**을 선택한 다음 생성된 항목을 선택합니다.

   저장된 속성이 표시되고 일부가 **CORRUPTED\$1(손상됨\$1)**으로 표시됩니다.

## 3단계: 시뮬레이션된 문제 비활성화
<a name="disable-simulated-issue"></a>

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

1. 탐색 창에서 **함수**를 선택합니다.

1. `serverlessrepo-fork-example`을 검색하고 `CheckoutFunction`을 선택합니다.

1. **fork-example-ecommerce-*my-app*-CheckoutFunction-*ABCDEF*...** 페이지의 **환경 변수** 섹션에서 **BUG\$1ENABLED** 변수를 **false**로 설정하고 **저장**을 선택합니다.

## 4단계: 문제로부터 복구하기 위해 다시 보기 활성화
<a name="enable-replay-recover-from-simulated-issue"></a>

1.  AWS Lambda 콘솔의 탐색 패널에서 **함수**를 선택합니다.

1. `serverlessrepo-fork-example`을 검색하고 `ReplayFunction`을 선택합니다.

1. **Designer(디자이너)** 섹션을 확장하고, **SQS** 타일을 선택한 다음, **SQS** 섹션에서 **활성**을 선택합니다.
**참고**  
Amazon SQS 이벤트 소스 트리거가 활성화되려면 약 1분 정도 걸립니다.

1. **저장**을 선택합니다.

1. 복구된 속성을 보려면 Amazon DynamoDB 콘솔로 돌아갑니다.

1. 재생을 비활성화하려면 AWS Lambda 콘솔로 돌아가에 대한 Amazon SQS 이벤트 소스 트리거를 비활성화합니다`ReplayFunction`.

# AWS Event Fork Pipelines에서 Amazon SNS 주제 구독
<a name="sns-subscribe-event-fork-pipelines"></a>

이벤트 기반 애플리케이션의 개발을 가속화하기 위해 AWS Event Fork Pipelines 기반 이벤트 처리 파이프라인에서 Amazon SNS 주제를 구독할 수 있습니다. AWS Event Fork Pipelines은 [AWS 서버리스 애플리케이션 모델](https://aws.amazon.com/serverless/sam/)(AWS SAM)을 기반으로 하는 오픈 소스 [중첩](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-nested-applications.html) 애플리케이션 제품군으로, [AWS Event Fork Pipelines 제품군](https://serverlessrepo.aws.amazon.com/applications?query=aws-event-fork-pipelines)(사용자 **지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시** 선택)에서 AWS 계정에 직접 배포할 수 있습니다. 자세한 내용은 [AWS Event Fork Pipelines 작동 방식](sns-fork-pipeline-as-subscriber.md#how-sns-fork-works) 단원을 참조하십시오.

이 섹션에서는를 사용하여 파이프라인 AWS Management Console 을 배포한 다음 AWS Event Fork Pipelines에서 Amazon SNS 주제를 구독하는 방법을 보여줍니다. 시작하기 전에 [Amazon SNS 주제를 생성](sns-create-topic.md)합니다.

파이프라인을 구성하는 리소스를 삭제하려면 AWS Lambda 콘솔의 **애플리케이션** 페이지에서 파이프라인을 찾아 **SAM 템플릿 섹션을** 확장하고 **CloudFormation 스택**을 선택한 다음 **기타 작업**, **스택 삭제를** 선택합니다.

# 이벤트 스토리지 및 백업 파이프라인을 Amazon SNS에 배포 및 구독
<a name="deploy-event-storage-backup-pipeline"></a>


|  | 
| --- |
| 이벤트 아카이빙 및 분석을 위해 Amazon SNS는 이제 Amazon Data Firehose와의 기본 통합 기능을 사용할 것을 권장합니다. Firehose 전송 스트림에서 SNS 주제를 구독하여 Amazon Simple Storage Service(Amazon S3) 버킷, Amazon Redshift 테이블, Amazon OpenSearch Service(OpenSearch Service) 등과 같은 아카이브 및 분석 엔드포인트에 알림을 보낼 수 있습니다. Firehose 전송 스트림에서 Amazon SNS를 사용하는 것은 AWS Lambda 함수를 사용할 필요가 없는 완전 관리형 코드 없는 솔루션입니다. 자세한 내용은 [Firehose 전송 스트림으로 팬아웃](sns-firehose-as-subscriber.md) 단원을 참조하십시오. | 

이 페이지에서는 [이벤트 저장 및 백업 파이프라인](sns-fork-pipeline-as-subscriber.md#sns-fork-event-storage-and-backup-pipeline)을 배포하여 Amazon SNS 주제를 구독하는 방법을 보여줍니다. 이 프로세스는 파이프라인과 연결된 AWS SAM 템플릿을 자동으로 CloudFormation 스택으로 변환한 다음 스택을에 배포합니다 AWS 계정. 또한 이 프로세스는 이벤트 저장 및 백업 파이프라인을 구성하는 다음과 같은 리소스 세트를 생성하고 구성합니다.
+ Amazon SQS 대기열
+ Lambda 함수
+ Firehose 전송 스트림
+ Amazon S3 백업 버킷

Amazon S3 버킷을 대상으로 하여 스트림을 구성하는 방법에 대한 자세한 정보는 *Amazon Data Firehose API 참조*의 `[S3DestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_S3DestinationConfiguration.html)` 섹션에서 확인하세요.

이벤트 변환 및 이벤트 버퍼링, 이벤트 압축 및 이벤트 암호화 구성에 대한 자세한 정보는 *Amazon Data Firehose 개발자 안내서*의 [전송 스트림 생성](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html) 섹션을 참조하세요.

이벤트 필터링에 대한 자세한 정보는 이 설명서의 [Amazon SNS 구독 필터 정책](sns-subscription-filter-policies.md)에서 확인하세요.

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

1. 탐색 창에서 **함수**를 선택한 후 **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 다음을 수행합니다.

   1. **서버리스 앱 리포지토리 찾아보기**, **퍼블릭 애플리케이션**, **사용자 지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시**를 선택합니다.

   1. `fork-event-storage-backup-pipeline`을 검색하여 이 애플리케이션을 선택합니다.

1. **fork-event-storage-backup-pipeline** 페이지에서 다음을 수행합니다.

   1. **Application settings(애플리케이션 설정)** 섹션에서 **애플리케이션 이름**을 입력합니다(예: `my-app-backup`).
**참고**  
각 배포에서 애플리케이션 이름이 고유해야 합니다. 애플리케이션 이름을 재사용하면 배포는 (새 스택을 생성하는 대신) 이전에 배포된 CloudFormation 스택만 업데이트합니다.

   1. (선택 사항) **BucketArn**에 수신 이벤트가 로드될 Amazon S3 버킷의 ARN을 입력합니다. 값을 입력하지 않으면 AWS 계정에 새 Amazon S3 버킷이 생성됩니다.

   1. (선택 사항) **DataTransformationFunctionArn**에 수신 이벤트를 변환할 Lambda 함수의 ARN을 입력합니다. 값을 입력하지 않을 경우 데이터 변환이 비활성화됩니다.

   1. (선택 사항) 애플리케이션의 Lambda 함수 실행을 위해 다음 **LogLevel** 설정 중 하나를 입력합니다.
      + `DEBUG`
      + `ERROR`
      + `INFO`(기본값)
      + `WARNING`

   1. **TopicArn**에 이 포크 파이프라인 인스턴스가 구독할 Amazon SNS 주제의 ARN을 입력합니다.

   1. (선택 사항) **StreamBufferingIntervalInSeconds** 및 **StreamBufferingSizeInMBs**에 수신 이벤트 버퍼링을 구성하기 위한 값을 입력합니다. 값을 입력하지 않을 경우 300초 및 5MB가 사용됩니다.

   1. (선택 사항) 수신 이벤트를 압축하기 위한 다음 **StreamCompressionFormat** 설정 중 하나를 입력합니다.
      + `GZIP`
      + `SNAPPY`
      + `UNCOMPRESSED`(기본값)
      + `ZIP`

   1. (선택 사항) **StreamPrefix**에 Amazon S3 백업 버킷에 저장된 파일을 명명할 문자열 접두사를 입력합니다. 값을 입력하지 않을 경우 접두사가 사용되지 않습니다.

   1. (선택 사항) **SubscriptionFilterPolicy**에 수신 이벤트를 필터링하는 데 사용할 Amazon SNS 구독 필터 정책을 JSON 형식으로 입력합니다. 이 필터 정책은 OpenSearch Service 인덱스에 인덱싱할 이벤트를 결정합니다. 값을 입력하지 않을 경우 필터링이 사용되지 않습니다(모든 이벤트가 인덱싱됨).

   1. (선택 사항) **SubscriptionFilterPolicyScope**에 `MessageBody` 또는 `MessageAttributes` 문자열을 입력하거나 페이로드 기반 또는 속성 기반 메시지 필터링을 활성화합니다.

   1. **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications.(본인은 이 앱이 사용자 지정 IAM 역할, 리소스 정책을 생성하고 중첩 애플리케이션을 배포함을 확인합니다.)**를 선택하고 **배포**를 선택합니다.

**Deployment status for *my-app*(my-app 배포 상태)** 페이지에서 Lambda가 **Your application is being deployed(애플리케이션을 배포 중)** 상태를 표시합니다.

**리소스** 섹션에서는 스택 생성을 CloudFormation 시작하고 각 리소스에 대한 **CREATE\$1IN\$1PROGRESS** 상태를 표시합니다. 프로세스가 완료되면 **CREATE\$1COMPLETE** 상태가 CloudFormation 표시됩니다.

배포가 완료되면 Lambda가 **Your application has been deployed(애플리케이션이 배포됨)** 상태를 표시합니다.

Amazon SNS 주제에 게시되는 메시지는 이벤트 저장 및 백업 파이프라인에 의해 프로비저닝되는 Amazon S3 백업 버킷에 자동으로 저장됩니다.

# 이벤트 검색 및 분석 파이프라인을 Amazon SNS에 배포 및 구독
<a name="deploy-event-search-analytics-pipeline"></a>


|  | 
| --- |
| 이벤트 아카이빙 및 분석을 위해 Amazon SNS는 이제 Amazon Data Firehose와의 기본 통합 기능을 사용할 것을 권장합니다. Firehose 전송 스트림에서 SNS 주제를 구독하여 Amazon Simple Storage Service(Amazon S3) 버킷, Amazon Redshift 테이블, Amazon OpenSearch Service(OpenSearch Service) 등과 같은 아카이브 및 분석 엔드포인트에 알림을 보낼 수 있습니다. Firehose 전송 스트림에서 Amazon SNS를 사용하는 것은 AWS Lambda 함수를 사용할 필요가 없는 완전 관리형 코드 없는 솔루션입니다. 자세한 내용은 [Firehose 전송 스트림으로 팬아웃](sns-firehose-as-subscriber.md) 단원을 참조하십시오. | 

이 페이지에서는 [이벤트 검색 및 분석 파이프라인](sns-fork-pipeline-as-subscriber.md#sns-fork-event-search-and-analytics-pipeline)을 배포하여 Amazon SNS 주제를 구독 설정하는 방법을 보여줍니다. 이 프로세스는 파이프라인과 연결된 AWS SAM 템플릿을 자동으로 CloudFormation 스택으로 변환한 다음 스택을에 배포합니다 AWS 계정. 또한 이 프로세스는 이벤트 검색 및 분석 파이프라인을 구성하는 다음과 같은 리소스 세트를 생성하고 구성합니다.
+ Amazon SQS 대기열
+ Lambda 함수
+ Firehose 전송 스트림
+ Amazon OpenSearch Service 도메인
+ Amazon S3 배달 못한 편지 버킷

인덱스를 대상으로 하여 스트림을 구성하는 방법에 대한 자세한 정보는 *Amazon Data Firehose API 참조*의 `[ElasticsearchDestinationConfiguration](https://docs.aws.amazon.com/firehose/latest/APIReference/API_ElasticsearchDestinationConfiguration.html)` 섹션에서 참조하세요.

이벤트 변환 및 이벤트 버퍼링, 이벤트 압축 및 이벤트 암호화 구성에 대한 자세한 정보는 *Amazon Data Firehose 개발자 안내서*의 [전송 스트림 생성](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html) 섹션을 참조하세요.

이벤트 필터링에 대한 자세한 정보는 이 설명서의 [Amazon SNS 구독 필터 정책](sns-subscription-filter-policies.md)에서 확인하세요.

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

1. 탐색 창에서 **함수**를 선택한 후 **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 다음을 수행합니다.

   1. **서버리스 앱 리포지토리 찾아보기**, **퍼블릭 애플리케이션**, **사용자 지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시**를 선택합니다.

   1. `fork-event-search-analytics-pipeline`을 검색하여 이 애플리케이션을 선택합니다.

1. **fork-event-search-analytics-pipeline** 페이지에서 다음을 수행합니다.

   1. **Application settings(애플리케이션 설정)** 섹션에서 **애플리케이션 이름**을 입력합니다(예: `my-app-search`).
**참고**  
각 배포에서 애플리케이션 이름이 고유해야 합니다. 애플리케이션 이름을 재사용하면 배포는 (새 스택을 생성하는 대신) 이전에 배포된 CloudFormation 스택만 업데이트합니다.

   1. (선택 사항) **DataTransformationFunctionArn**에 수신 이벤트를 변환하는 데 사용할 Lambda 함수의 ARN을 입력합니다. 값을 입력하지 않을 경우 데이터 변환이 비활성화됩니다.

   1. (선택 사항) 애플리케이션의 Lambda 함수 실행을 위해 다음 **LogLevel** 설정 중 하나를 입력합니다.
      + `DEBUG`
      + `ERROR`
      + `INFO`(기본값)
      + `WARNING`

   1. (선택 사항) **SearchDomainArn**에 필요한 컴퓨팅 및 스토리지 기능을 구성하는 클러스터인 OpenSearch Service 도메인의 ARN을 입력합니다. 값을 입력하지 않을 경우 기본 구성으로 새 도메인이 생성됩니다.

   1. **TopicArn**에 이 포크 파이프라인 인스턴스가 구독할 Amazon SNS 주제의 ARN을 입력합니다.

   1. **SearchIndexName**에 이벤트 검색 및 분석용 OpenSearch Service 인덱스의 이름을 입력합니다.
**참고**  
다음 할당량이 인덱스 이름에 적용됩니다.  
대문자를 포함할 수 없음
다음 문자를 포함할 수 없음: `\ / * ? " < > | ` , #`
다음 문자로 시작할 수 없음: `- + _`
다음과 같을 수 없음: `. ..`
80자를 초과할 수 없음
255바이트를 초과할 수 없음
콜론을 포함할 수 없음(OpenSearch Service 7.0 이후)

   1. (선택 사항) OpenSearch Service 인덱스 순환 기간에 대해 다음 **SearchIndexRotationPeriod** 설정 중 하나를 입력합니다.
      + `NoRotation`(기본값)
      + `OneDay`
      + `OneHour`
      + `OneMonth`
      + `OneWeek`

      인덱스 교체는 오래된 데이터를 만료시킬 수 있도록 인덱스 이름에 타임스탬프를 추가합니다.

   1. **SearchTypeName**에 인덱스에서 이벤트를 구성하는 데 사용할 OpenSearch Service 유형의 이름을 입력합니다.
**참고**  
OpenSearch Service 유형 이름은 null 바이트를 제외한 모든 문자를 포함할 수 있으나 `_`로 시작할 수는 없습니다.
OpenSearch Service 6.x의 경우 인덱스당 한 유형만 가능합니다. 다른 유형을 보유한 기존 인덱스에 새 유형을 지정하면 Firehose가 런타임 오류를 반환합니다.

   1. (선택 사항) **StreamBufferingIntervalInSeconds** 및 **StreamBufferingSizeInMBs**에 수신 이벤트 버퍼링을 구성하기 위한 값을 입력합니다. 값을 입력하지 않을 경우 300초 및 5MB가 사용됩니다.

   1. (선택 사항) 수신 이벤트를 압축하기 위한 다음 **StreamCompressionFormat** 설정 중 하나를 입력합니다.
      + `GZIP`
      + `SNAPPY`
      + `UNCOMPRESSED`(기본값)
      + `ZIP`

   1. (선택 사항) **StreamPrefix**에 Amazon S3 배달 못한 편지 버킷에 저장된 파일을 명명할 문자열 접두사를 입력합니다. 값을 입력하지 않을 경우 접두사가 사용되지 않습니다.

   1. (선택 사항) **StreamRetryDurationInSecons**에 Firehose가 OpenSearch Service 인덱스에서 이벤트를 인덱싱할 수 없을 경우 재시도 지속 시간을 입력합니다. 값을 입력하지 않을 경우 300초가 사용됩니다.

   1. (선택 사항) **SubscriptionFilterPolicy**에 수신 이벤트를 필터링하는 데 사용할 Amazon SNS 구독 필터 정책을 JSON 형식으로 입력합니다. 이 필터 정책은 OpenSearch Service 인덱스에 인덱싱할 이벤트를 결정합니다. 값을 입력하지 않을 경우 필터링이 사용되지 않습니다(모든 이벤트가 인덱싱됨).

   1. **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications.(본인은 이 앱이 사용자 지정 IAM 역할, 리소스 정책을 생성하고 중첩 애플리케이션을 배포함을 확인합니다.)**를 선택하고 **배포**를 선택합니다.

**Deployment status for *my-app-search*(my-app-search 배포 상태)** 페이지에서 Lambda가 **Your application is being deployed(애플리케이션을 배포 중)** 상태를 표시합니다.

**리소스** 섹션에서는 스택 생성을 CloudFormation 시작하고 각 리소스에 대한 **CREATE\$1IN\$1PROGRESS** 상태를 표시합니다. 프로세스가 완료되면 **CREATE\$1COMPLETE** 상태가 CloudFormation 표시됩니다.

배포가 완료되면 Lambda가 **Your application has been deployed(애플리케이션이 배포됨)** 상태를 표시합니다.

Amazon SNS 주제에 게시되는 메시지는 이벤트 검색 및 분석 파이프라인에 의해 프로비저닝되는 OpenSearch Service 인덱스에 자동으로 인덱싱됩니다. 파이프라인이 이벤트를 인덱싱할 수 없을 경우 해당 이벤트가 Amazon S3 배달 못한 편지 버킷에 저장됩니다.

# Amazon SNS와 통합하여 이벤트 재전송 파이프라인 배포
<a name="deploy-event-replay-pipeline"></a>

이 페이지에서는 [이벤트 다시 보기 파이프라인](sns-fork-pipeline-as-subscriber.md#sns-fork-event-replay-pipeline)을 배포하여 Amazon SNS 주제를 구독 설정하는 방법을 보여줍니다. 이 프로세스는 파이프라인과 연결된 AWS SAM 템플릿을 자동으로 CloudFormation 스택으로 변환한 다음 스택을에 배포합니다 AWS 계정. 또한 이 프로세스는 Amazon SQS 대기열 및 Lambda 함수 등 이벤트 다시 보기 파이프라인을 구성하는 리소스 세트를 생성하고 구성합니다.

이벤트 필터링에 대한 자세한 정보는 이 설명서의 [Amazon SNS 구독 필터 정책](sns-subscription-filter-policies.md)에서 확인하세요.

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

1. 탐색 창에서 **함수**를 선택한 후 **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 다음을 수행합니다.

   1. **서버리스 앱 리포지토리 찾아보기**, **퍼블릭 애플리케이션**, **사용자 지정 IAM 역할 또는 리소스 정책을 생성하는 앱 표시**를 선택합니다.

   1. `fork-event-replay-pipeline`을 검색하여 이 애플리케이션을 선택합니다.

1. **fork-event-replay-pipeline** 페이지에서 다음을 수행합니다.

   1. **Application settings(애플리케이션 설정)** 섹션에서 **애플리케이션 이름**을 입력합니다(예: `my-app-replay`).
**참고**  
각 배포에서 애플리케이션 이름이 고유해야 합니다. 애플리케이션 이름을 재사용하면 배포는 (새 스택을 생성하는 대신) 이전에 배포된 CloudFormation 스택만 업데이트합니다.

   1. (선택 사항) 애플리케이션의 Lambda 함수 실행을 위해 다음 **LogLevel** 설정 중 하나를 입력합니다.
      + `DEBUG`
      + `ERROR`
      + `INFO`(기본값)
      + `WARNING`

   1. (선택 사항) **ReplayQueueRetentionPeriodInSeconds**에 Amazon SQS 다시 보기 대기열이 메시지를 유지하는 시간을 초 단위로 입력합니다. 값을 입력하지 않을 경우 1,209,600초(14일)가 사용됩니다.

   1. **TopicArn**에 이 포크 파이프라인 인스턴스가 구독할 Amazon SNS 주제의 ARN을 입력합니다.

   1. **DestinationQueueName**에 Lambda 다시 보기 함수가 메시지를 전달할 Amazon SQS 대기열의 이름을 입력합니다.

   1. (선택 사항) **SubscriptionFilterPolicy**에 수신 이벤트를 필터링하는 데 사용할 Amazon SNS 구독 필터 정책을 JSON 형식으로 입력합니다. 이 필터 정책은 다시 보기를 위해 버퍼링할 이벤트를 결정합니다. 값을 입력하지 않을 경우 필터링이 사용되지 않습니다(모든 이벤트가 버퍼링됨).

   1. **I acknowledge that this app creates custom IAM roles, resource policies and deploys nested applications.(본인은 이 앱이 사용자 지정 IAM 역할, 리소스 정책을 생성하고 중첩 애플리케이션을 배포함을 확인합니다.)**를 선택하고 **배포**를 선택합니다.

**Deployment status for *my-app-replay*(my-app-replay 배포 상태)** 페이지에서 Lambda가 **Your application is being deployed(애플리케이션을 배포 중)** 상태를 표시합니다.

**리소스** 섹션에서는 스택 생성을 CloudFormation 시작하고 각 리소스에 대한 **CREATE\$1IN\$1PROGRESS** 상태를 표시합니다. 프로세스가 완료되면 **CREATE\$1COMPLETE** 상태가 CloudFormation 표시됩니다.

배포가 완료되면 Lambda가 **Your application has been deployed(애플리케이션이 배포됨)** 상태를 표시합니다.

Amazon SNS 주제에 게시되는 메시지는 이벤트 다시 보기 파이프라인에 의해 프로비저닝되는 Amazon SQS 대기열에서 다시 보기를 위해 자동으로 버퍼링됩니다.

**참고**  
기본적으로 다시 보기는 비활성화됩니다. 다시 보기를 활성화하려면 Lambda 콘솔에서 해당 함수의 페이지로 이동하여 **Designer(디자이너)** 섹션을 확장하고, **SQS** 타일을 선택한 다음, **SQS** 섹션에서 **활성**을 선택합니다.

# Amazon SNS와 함께 Amazon EventBridge 스케줄러 사용
<a name="using-eventbridge-scheduler"></a>

[Amazon EventBridge Scheduler](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)는 하나의 중앙 관리형 서비스에서 작업을 생성, 실행 및 관리할 수 있는 서버리스 스케줄러입니다. EventBridge 스케줄러를 사용하면 반복 패턴에 대해 cron 및 rate 표현식을 사용하여 일정을 만들거나 일회성 간접 호출을 구성할 수 있습니다. 전송을 위한 유연한 기간을 설정하고, 재시도 제한을 정의하고, 실패한 API 간접 호출의 최대 보존 시간을 설정할 수 있습니다.

이 페이지에서는 EventBridge 스케줄러를 사용하여 일정에 따라 Amazon SNS 주제의 메시지를 게시하는 방법을 설명합니다.



## 실행 역할 설정
<a name="using-eventbridge-scheduler-execution-role"></a>

 새 일정을 생성할 때 EventBridge 스케줄러에 사용자를 대신하여 대상 API 작업을 간접적으로 간접 호출할 수 있는 권한이 있어야 합니다. *실행 역할*을 사용하여 EventBridge 스케줄러에 이러한 권한을 부여합니다. 일정의 실행 역할에 연결하는 권한 정책은 필요한 권한을 정의합니다. 이러한 권한은 EventBridge 스케줄러가 간접적으로 간접 호출하려는 대상 API에 따라 달라집니다.

 다음 절차와 같이 EventBridge 스케줄러 콘솔을 사용하여 일정을 생성하면 EventBridge 스케줄러가 선택한 대상을 기준으로 실행 역할을 자동으로 설정합니다. EventBridge 스케줄러 SDKs, AWS CLI또는 중 하나를 사용하여 일정을 생성하려면 EventBridge 스케줄러가 대상을 호출하는 데 필요한 권한을 부여하는 기존 실행 역할이 있어야 CloudFormation합니다. 일정에 대한 실행 역할을 수동으로 설정하는 방법에 대한 자세한 내용은 *EventBridge 스케줄러 사용 설명서*의 [실행 역할 설정](https://docs.aws.amazon.com/scheduler/latest/UserGuide/setting-up.html#setting-up-execution-role)을 참조하세요.

## 일정 생성
<a name="using-eventbridge-scheduler-create"></a>

**콘솔을 사용하여 일정 생성**

1. [https://console.aws.amazon.com/scheduler/home](https://console.aws.amazon.com/scheduler/home/)에서 Amazon EventBridge Scheduler 콘솔을 엽니다.

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

1.  **일정 세부 정보 지정** 페이지의 **일정 이름 및 설명** 섹션에서 다음을 수행합니다.

   1. **일정 이름**에 일정의 이름을 입력합니다. 예를 들어 **MyTestSchedule**입니다.

   1. (선택 사항) **설명**에 일정에 대한 설명을 입력합니다. 예를 들어 **My first schedule**입니다.

   1. **일정 그룹** 드롭다운 목록에서 일정 그룹을 선택합니다. 그룹이 없는 경우 **기본값**을 선택합니다. 일정 그룹을 생성하려면 **자체 일정 생성**을 선택합니다.

      일정 그룹을 사용하여 일정 그룹에 태그를 추가합니다.

1. 

   1. 일정 옵션을 선택합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/using-eventbridge-scheduler.html)

1. (선택 사항) 이전 단계에서 **반복 일정**을 선택한 경우 **기간** 섹션에서 다음을 수행합니다.

   1. **시간대**에서 시간대를 선택합니다.

   1. **시작 날짜 및 시간**에 `YYYY/MM/DD` 형식으로 유효한 날짜를 입력한 다음 24시간 `hh:mm` 형식으로 타임스탬프를 지정합니다.

   1. **종료 날짜 및 시간**에 `YYYY/MM/DD` 형식으로 유효한 날짜를 입력한 다음 24시간 `hh:mm` 형식으로 타임스탬프를 지정합니다.

1. **다음**을 선택합니다.

1. **대상 선택** 페이지에서 EventBridge 스케줄러가 호출하는 AWS API 작업을 선택합니다.

   1. **Amazon SNS 게시**를 선택합니다.

   1. **게시** 섹션에서 SNS 주제를 선택하거나 **새 SNS 주제 생성**을 선택합니다.

   1. (선택 사항) JSON 페이로드를 입력합니다. 페이로드를 입력하지 않으면 EventBridge 스케줄러는 빈 이벤트를 사용하여 함수를 간접적으로 간접 호출합니다.

1. **다음**을 선택합니다.

1. **설정** 페이지에서 다음 작업을 수행합니다.

   1. 일정을 켜려면 **일정 상태**에서 **일정 활성화**를 토글합니다.

   1. 일정에 대한 재시도 정책을 구성하려면 **재시도 정책 및 데드-레터 큐(DLQ)**에서 다음을 수행합니다.
      + **재시도**를 토글합니다.
      + **최대 이벤트 수명**에 EventBridge 스케줄러가 처리되지 않은 이벤트를 보관해야 하는 최대 **시간**과 **분**을 입력합니다.
      + 최대 시간은 24시간입니다.
      + **최대 재시도 횟수**에는 대상이 오류를 반환할 경우 EventBridge 스케줄러가 일정을 재시도하는 최대 횟수를 입력합니다.

         최댓값은 185회입니다.

      재시도 정책을 사용하면 일정이 대상을 간접적으로 간접 호출하지 못할 경우 EventBridge 스케줄러가 일정을 다시 실행합니다. 구성된 경우 일정에 대한 최대 보존 기간과 재시도 횟수를 설정해야 합니다.

   1. EventBridge 스케줄러가 전송되지 않은 이벤트를 저장하는 위치를 선택합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/using-eventbridge-scheduler.html)

   1. 고객 관리형 키를 사용하여 대상 입력을 암호화하려면 **암호화**에서 **암호화 설정 사용자 지정(고급)**을 선택합니다.

      이 옵션을 선택하는 경우 기존 KMS 키 ARN을 입력하거나 ** AWS KMS key생성**을 선택하여 AWS KMS 콘솔로 이동합니다. EventBridge 스케줄러가 저장 데이터를 암호화하는 방법에 대한 자세한 내용은 *Amazon EventBridge 스케줄러 사용 설명서*의 [Encryption at rest](https://docs.aws.amazon.com/scheduler/latest/UserGuide/encryption-rest.html)를 참조하세요.

   1. EventBridge 스케줄러가 새 실행 역할을 생성하도록 하려면 **이 일정에 대한 새 역할 생성**을 선택합니다. 그런 다음 **역할 이름**을 입력합니다. 이 옵션을 선택하면 EventBridge 스케줄러가 템플릿 대상에 필요한 필수 권한을 역할에 연결합니다.

1. **다음**을 선택합니다.

1.  **일정 검토 및 생성** 페이지에서 일정의 세부 정보를 검토합니다. 각 섹션에서 **편집**을 선택하여 해당 단계로 돌아가서 세부 정보를 편집합니다.

1. **일정 생성**을 선택합니다.

   **일정** 페이지에서 새 일정과 기존 일정 목록을 볼 수 있습니다. **상태** 열에서 새 일정이 **활성화됨** 상태인지 확인합니다.

## 관련 리소스
<a name="using-eventbridge-scheduler-related-resources"></a>

 EventBridge 스케줄러에 대한 자세한 내용은 다음을 참조하세요.
+ [EventBridge 스케줄러 사용 설명서](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)
+ [EventBridge 스케줄러 API 참조](https://docs.aws.amazon.com/scheduler/latest/APIReference/Welcome.html)
+ [EventBridge 스케줄러 요금](https://aws.amazon.com/eventbridge/pricing/#Scheduler)