

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

# Amazon SNS 암호화 키 및 비용 관리
<a name="sns-key-management"></a>

다음 섹션에서는 AWS Key Management Service (AWS KMS)의 관리형 키 작업에 대해 설명합니다.

**참고**  
Amazon SNS는 대칭 암호화 KMS 키만 지원합니다. 다른 유형의 KMS 키를 사용하여 서비스 리소스를 암호화할 수 없습니다. KMS 키가 대칭인지 암호화 키인지 확인하는 것과 관련된 도움말은 [비대칭 KMS 키 식별](https://docs.aws.amazon.com/kms/latest/developerguide/find-symm-asymm.html)을 참조하세요.

## AWS KMS 비용 추정
<a name="sse-estimate-kms-usage-costs"></a>

비용을 예측하고 AWS 청구서를 더 잘 이해하려면 Amazon SNS에서를 사용하는 빈도를 알고 싶을 수 있습니다 AWS KMS key.

**참고**  
다음 공식으로 예상되는 비용을 거의 정확하게 짐작할 수 있지만, Amazon SNS의 분산 특성상 실제 비용은 더 높을 수 있습니다.

*주제당* API 요청 수(`R`)를 계산하려면 다음 수식을 사용하세요.

```
R = B / D * (2 * P)
```

여기서 `B`는 청구 기간(초)입니다.

`D`는 데이터 키 재사용 기간입니다(초 단위—Amazon SNS는 최대 5 분 동안 데이터 키를 재사용함).

`P`는 Amazon SNS 주제로 보내는 게시 [보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal)의 수입니다.

다음은 계산 예제입니다. 정확한 요금 정보는 [AWS Key Management Service 요금](https://aws.amazon.com/kms/pricing/)을 참조하세요.

### 예제 1: 1개의 게시자 및 1개의 주제에 대한 AWS KMS API 호출 수 계산
<a name="example-1-topic-1-publisher"></a>

이 예에서는 다음과 같이 가정합니다.
+ 청구 기간은 1월 1일부터 31일까지입니다(2,678,400초).
+ 데이터 키 재사용 기간은 5분(300초)입니다.
+ 1개의 주제가 있습니다.
+ 1개의 게시 보안 주체가 있습니다.

```
2,678,400 / 300 * (2 * 1) = 17,856
```

### 예제 2: 여러 게시자 및 주제 2개에 대한 AWS KMS API 호출 수 계산
<a name="example-2-topics-multiple-publishers"></a>

이 예에서는 다음과 같이 가정합니다.
+ 청구 기간은 2월 1일부터 28일까지입니다(2,419,200초).
+ 데이터 키 재사용 기간은 5분(300초)입니다.
+ 2개의 주제가 있습니다.
+ 첫 번째 주제에는 3개의 게시 보안 주체가 있습니다.
+ 두 번째 주제에는 5개의 게시 보안 주체가 있습니다.

```
(2,419,200 / 300 * (2 * 3)) + (2,419,200 / 300 * (2 * 5)) = 129,024
```

## AWS KMS 권한 구성
<a name="sns-what-permissions-for-sse"></a>

SSE를 사용하려면 먼저 주제 암호화와 메시지 암호화 및 복호화를 허용하는 AWS KMS key 정책을 구성해야 합니다. AWS KMS 권한에 대한 예제 및 자세한 정보는 *AWS Key Management Service 개발자 안내서*의 [AWS KMS API 권한: 작업 및 리소스 참조](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)를 참조하세요. Amazon SNS 주제에 서버 측 암호화를 설정하는 방법에 대한 자세한 내용은 [추가 정보](sns-enable-encryption-for-topic.md#set-up-topic-with-sse) 섹션을 참조하세요.

**참고**  
IAM 정책을 사용하여 대칭 암호화 KMS 키 권한을 관리할 수도 있습니다. 자세한 내용은에서 [IAM 정책 사용을 참조하세요 AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html).  
Amazon SNS와 송수신하기 위한 전역 권한을 구성해도 되지만, AWS KMS 는 IAM 정책의 `Resource` 섹션에 구체적인 리전별 KMS의 전체 ARN을 명시적으로 지정할 것을 요구합니다.

또한의 키 정책이 필요한 권한을 AWS KMS key 허용하는지 확인해야 합니다. 이렇게 하려면 Amazon SNS에서 암호화된 메시지를 생산하고 소비하는 보안 주체를 KMS 키 정책에서 사용자로 지정해야 합니다.

또는 Amazon SNS에서 암호화된 메시지를 수신하도록 게시하고 구독하는 보안 주체에 할당된 IAM 정책에서 필요한 AWS KMS 작업과 KMS ARN을 지정할 수 있습니다. 자세한 정보는 *AWS Key Management Service 개발자 안내서*의 [AWS KMS에 대한 액세스 관리](https://docs.aws.amazon.com/kms/latest/developerguide/control-access-overview.html#managing-access)를 참조하세요.

Amazon SNS 주제에 대한 고객 관리형 키를 선택하고 조건 키 `kms:ResourceAliases`와 함께 IAM 정책 또는 KMS 키 정책을 사용하여 KMS 키에 대한 액세스를 제어하도록 별칭을 사용하는 경우 선택한 고객 관리형 키에도 별칭이 연결되어 있어야 합니다. *별칭을 사용하여 KMS 키에 대한 액세스를 제어하는 방법에 대한 자세한 내용은 AWS Key Management Service  개발자 안내서*의 [별칭을 사용하여 KMS 키에 대한 액세스 제어](https://docs.aws.amazon.com/kms/latest/developerguide/alias-authorization.html)를 참조하세요.

### 사용자가 SSE를 사용하여 주제에 메시지 보내기 허용
<a name="send-to-encrypted-topic"></a>

게시자에게 AWS KMS key에 대한 `kms:GenerateDataKey*` 및 `kms:Decrypt` 권한이 있어야 합니다.

```
{
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "kms:GenerateDataKey*",
      "kms:Decrypt"
    ],
    "Resource": "arn:aws:kms:us-east-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }, {
    "Effect": "Allow",
    "Action": [
      "sns:Publish"
    ],
    "Resource": "arn:aws:sns:*:123456789012:MyTopic"
  }]
}
```

### AWS 서비스 및 암호화된 주제의 이벤트 소스 간 호환성 활성화
<a name="compatibility-with-aws-services"></a>

여러 AWS 서비스가 Amazon SNS 주제에 이벤트를 게시합니다. 이러한 이벤트 소스가 암호화된 주제와 연동되도록 하려면 다음 단계를 수행해야 합니다.

1. 고객 관리형 키를 사용합니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)을 참조하세요.

1.  AWS 서비스에 `kms:GenerateDataKey*` 및 `kms:Decrypt` 권한을 부여하려면 KMS 정책에 다음 문을 추가합니다.

   ```
   {
     "Statement": [{
       "Effect": "Allow",
       "Principal": {
         "Service": "{{service}}.amazonaws.com"
       },
       "Action": [
         "kms:GenerateDataKey*",
         "kms:Decrypt"
       ],
       "Resource": "*"
     }]
   }
   ```    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-key-management.html)
**참고**  
일부 Amazon SNS 이벤트 소스에서는 AWS KMS key 정책에 IAM 역할(서비스 보안 주체가 아님)을 제공해야 합니다.  
[Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ASGettingNotifications.html)
[Amazon Elastic Transcoder](https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/notifications.html)
[AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/approvals.html#approvals-configuration-options)
[AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/notifications-for-AWS-Config.html)
[AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.sns.html)
[AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sns-rule.html)
[EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-integrations.html#integ-sns-encrypted)

1. `aws:SourceAccount` 및 `aws:SourceArn` 조건 키를 KMS 리소스 정책에 추가하여 [혼동된 대리자](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) 공격으로부터 KMS 키를 더 보호합니다. 각 경우에 대한 정확한 세부 정보는 서비스별 설명서 목록(위)을 참조하세요.
**중요**  
 AWS KMS 정책에 `aws:SourceArn`, 및 `aws:SourceAccount``aws:SourceOrgID`를 추가하는 것은 EventBridge-to-encrypted 주제에 대해 지원되지 않습니다.

   ```
   {
     "Effect": "Allow",
     "Principal": {
       "Service": "service.amazonaws.com"
     },
     "Action": [
       "kms:GenerateDataKey*",
       "kms:Decrypt"
     ],
     "Resource": "*",
     "Condition": {
       "StringEquals": {
         "aws:SourceAccount": "{{customer-account-id}}"
       },
       "ArnLike": {
         "aws:SourceArn": "arn:aws:service:region:{{customer-account-id}}:resource-type:{{customer-resource-id}}"
       }
     }
   }
   ```

1. KMS를 사용하여 [주제의 SSE를 활성화합니다](sns-enable-encryption-for-topic.md).

1. 암호화된 주제의 ARN을 이벤트 소스에 제공합니다.

## AWS KMS 오류
<a name="sse-troubleshooting-errors"></a>

Amazon SNS 및 로 작업 AWS KMS할 때 오류가 발생할 수 있습니다. 아래 목록에서 이러한 오류와 문제 해결 방법을 설명합니다.

**KMSAccessDeniedException**  
암호화 텍스트가 존재하지 않는 키 또는 액세스 권한이 없는 키를 참조합니다.  
HTTP 상태 코드: 400

**KMSDisabledException**  
지정한 KMS가 활성화되지 않아서 요청이 거부되었습니다.  
HTTP 상태 코드: 400

**KMSInvalidStateException**  
지정한 리소스의 상태가 이 요청에 유효하지 않아서 요청이 거부되었습니다. 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [AWS KMS keys의 키 상태](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)를 참조하세요.  
HTTP 상태 코드: 400

**KMSNotFoundException**  
지정한 엔터티 또는 리소스를 찾을 수 없으므로 요청이 거부되었습니다.  
HTTP 상태 코드: 400

**KMSOptInRequired**  
 AWS 액세스 키 ID에는 서비스에 대한 구독이 필요합니다.  
HTTP 상태 코드: 403

**KMSThrottlingException**  
요청 스로틀링으로 인해 요청이 거부되었습니다. 제한에 대한 자세한 정보는 **AWS Key Management Service 개발자 안내서의 [할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html#requests-per-second)을 참조하세요.  
HTTP 상태 코드: 400