

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 管理 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` 是發布的[委託人](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal)數量，傳送至 Amazon SNS 主題。

以下為計算範例。如需確切的定價資訊，請參閱 [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 主題選取客戶管理金鑰，且您使用別名來透過 IAM 政策或具有條件金鑰 `kms:ResourceAliases` 的 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/zh_tw/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 資源政策，以進一步保護 KMS 金鑰免遭[混淆代理人](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)攻擊。有關每種情況的確切詳細資訊，請參閱服務專屬文件清單（上方）。
**重要**  
EventBridge-to-encrypted主題不支援將 `aws:SourceAccount``aws:SourceArn`、 和 `aws:SourceOrgID`新增至 AWS KMS 政策。

   ```
   {
     "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. [啟用主題的 SSE](sns-enable-encryption-for-topic.md) 使用您的 KMS。

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