

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 つあります。
+ 2 つめのトピックには、公開中のプリンシパルが 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 キーポリシーと条件キー `kms:ResourceAliases` により 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/ja_jp/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 イメージビルダー](https://docs.aws.amazon.com/imagebuilder/latest/userguide/ibhow-integrations.html#integ-sns-encrypted)

1. KMS リソースポリシーに `aws:SourceAccount` キーと `aws:SourceArn` 条件キーを追加して、[混乱した代理](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)攻撃から KMS キーをさらに保護します。それぞれの場合の正確な詳細については、サービス固有のドキュメントリスト (上記) を参照してください。
**重要**  
 AWS KMS ポリシー`aws:SourceOrgID`への `aws:SourceAccount`、`aws:SourceArn`、 の追加は、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