

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

# Amazon SQS のキー管理
<a name="sqs-key-management"></a>

Amazon SQS は AWS Key Management Service (KMS) と統合して、サーバー側の暗号化 (SSE) 用の [KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)を管理します。SSE 情報およびキー管理の定義については、「[Amazon SQS での保管中の暗号化](sqs-server-side-encryption.md)」をご参照ください。Amazon SQS は KMS キーでメッセージを暗号化および復号するデータキーを検証および保護します。以下のセクションは Amazon SQS サービスの KMS キーとデータキーの操作について説明します。

## AWS KMS アクセス許可の設定
<a name="sqs-what-permissions-for-sse"></a>

すべての KMS キーにはキーポリシーが必要です。Amazon SQS の AWS マネージド KMS キーのキーポリシーを変更することはできません。この KMS キーのポリシーには、暗号化されたキューを使用するためのアカウント内 (Amazon SQS の使用が承認されているもの) にあるすべてのプリンシパルのアクセス許可が含まれています。

 Amazon SQS は、異なる AWS アカウント、IAM ユーザー、または IAM ロールを使用しているかどうかにかかわらず、 AWS 認証情報に基づいて発信者を区別します。さらに、スコープポリシーが異なる同じ IAM ロールは、個別のリクエスタとして扱われます。ただし、IAM ロールセッションを使用する場合、同じ IAM ロールとスコープポリシーを使用する限り、`RoleSessionName` のみを変更しても、個別のリクエスタは作成されません。したがって、 AWS KMS キーポリシープリンシパルを指定する場合、これらのセッションは同じリクエスタとして扱われるため、`RoleSessionName`違いのみに依存することは避けてください。

または、必要な許可をIAM ポリシーで指定して、暗号化されたメッセージを作成および使用するプリンシパルにこのポリシーを割り当てます。詳細については、[デベロッパーガイド AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html) の「*AWS Key Management Service IAM ポリシーの使用*」を参照してください。

**注記**  
Amazon SQS との間で送受信するグローバルアクセス許可を設定できますが、 では、IAM ポリシーの `Resource`セクションの特定のリージョンで KMS キーの完全な ARN に明示的に名前を付ける AWS KMS 必要があります。

### AWS サービスの KMS アクセス許可を設定する
<a name="compatibility-with-aws-services"></a>

いくつかの AWS サービスは、Amazon SQS キューにイベントを送信できるイベントソースとして機能します。これらのイベントソースが暗号化されたキューと連携できるようにするには、カスタマーマネージド KMS キーを作成し、必要な AWS KMS API メソッドを使用するためのアクセス許可をサービスのキーポリシーに追加する必要があります。アクセス許可を設定するには、次の手順を実行します。

**警告**  
Amazon SQS メッセージを暗号化するための KMS キーを変更する場合、古い KMS キーで暗号化した既存のメッセージはそのキーで暗号化されたままになることに注意してください。これらのメッセージを復号するには、古い KMS キーを保持していて、そのキーポリシーで `kms:Decrypt` および `kms:GenerateDataKey` へのアクセス許可を Amazon SQS に付与していることを確認する必要があります。新しいメッセージを暗号化するために新しい KMS キーに更新したら、古い KMS キーで暗号化したすべての既存のメッセージを処理してキューから削除したことを確認してから、古い KMS キーを削除または無効にします。

1. カスタマーマネージド KMS キーを作成。詳細については、*AWS Key Management Service デベロッパーガイド*の[キーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)を参照してください。

1.  AWS サービスイベントソースが `kms:Decrypt`および `kms:GenerateDataKey` API メソッドを使用できるようにするには、KMS キーポリシーに次のステートメントを追加します。

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
         "Statement": [{
            "Effect": "Allow",
            "Principal": {
               "Service": "service.amazonaws.com"
            },
            "Action": [
               "kms:Decrypt",
               "kms:GenerateDataKey"
            ],
            "Resource": "*"
          }]
   }
   ```

------

   上記の例の「Service」をイベント出典の*サービス名*に置き換えます。イベントソースには、次のサービスが含まれます。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html)

1.  KMS キーの ARN を使用して[既存の SSE キューを設定](sqs-configure-sse-existing-queue.md)します。

1. 暗号化されたキューのARNをイベント出典に追加します。

### プロデューサーの AWS KMS アクセス許可を設定する
<a name="send-to-encrypted-queue"></a>

[データキー再利用期間](#sqs-how-does-the-data-key-reuse-period-work)が終了した場合、プロデューサーによる次回の`SendMessage`または`SendMessageBatch`の呼び出しでは、`kms:Decrypt`と`kms:GenerateDataKey`の呼び出しもトリガーされます。`kms:Decrypt`の呼び出しでは、新しいデータキーを使用する前に整合性を検証します。したがって、プロデューサーは KMS キーの `kms:Decrypt` および `kms:GenerateDataKey` 許可が必要です。

次のステートメントをプロデューサーの IAMポリシーに追加します。キーリソースとキューリソースには正しい ARN 値を使用してください。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-2:123456789012:key/111112222233333"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:SendMessage"
            ],
            "Resource": "arn:aws:sqs:*:123456789012:MyQueue"
        }
    ]
}
```

------

### コンシューマーの AWS KMS アクセス許可を設定する
<a name="receive-from-encrypted-queue"></a>

データキー再利用期間が終了した場合、コンシューマーが次回に `ReceiveMessage` を呼び出すと、それを使用する前に新しいデータキーの整合性を検証するために、`kms:Decrypt` の呼び出しもトリガーされます。したがって、コンシューマーは指定されたキューのメッセージの暗号化に使用される KMS キーへの `kms:Decrypt` 許可が必要です。キューが[デッドレターキュー](sqs-dead-letter-queues.md)として機能する場合、コンシューマーはソースキューのメッセージの暗号化に使用される KMS キーへの `kms:Decrypt` 許可も必要です。次のステートメントをコンシューマーの IAM ポリシーに追加します。キーリソースとキューリソースには正しい ARN 値を使用してください。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:123456789012:key/111112222233333"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ReceiveMessage"
            ],
            "Resource": "arn:aws:sqs:*:123456789012:MyQueue"
        }
    ]
}
```

------

### 混乱した代理保護を使用して AWS KMS アクセス許可を設定する
<a name="sqs-adding-confused-deputy-protection"></a>

キーポリシーステートメントのプリンシパルが [AWS サービスプリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services)の場合、[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) のグローバル条件キーを使用して[混乱した使節問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)から保護できます。これらの条件キーを使用する場合、暗号化されているリソースの Amazon リソースネーム (ARN) の値を設定します。リソースの ARN が不明の場合は、代わりに `aws:SourceAccount` を使用してください。

この KMS キーポリシーでは、アカウント `111122223333` が保有された*サービス*の特定リソースは、`Decrypt` および `GenerateDataKey` アクションにおいて KMS を呼び出すことが許可されます。これは Amazon SQS の SSE 使用中に発生します。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "sqs.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": [
                        "arn:aws:sqs:us-west-1:111122223333:resource"
                    ]
                }
            }
        }
    ]
}
```

------

SSE を有効にした Amazon SQS キューを使用する場合、以下のサービスが `aws:SourceArn` をサポートします:
+ Amazon SNS
+ Amazon S3
+ CloudWatch Events
+ AWS Lambda
+ CodeBuild
+ Amazon Connect Customer Profiles
+ AWS Auto Scaling
+ Amazon Chime

## データキー再利用期間について
<a name="sqs-how-does-the-data-key-reuse-period-work"></a>

[データキー再利用期間](sqs-server-side-encryption.md#sqs-sse-key-terms)は、Amazon SQSが同じデータキーを再利用するための最大期間を定義します。データキー再利用期間が終了すると、Amazon SQSは新しいデータキーを生成します。再利用期間については、次のガイドラインに注意してください。
+ 再利用期間が短いほどセキュリティが向上しますが、 への呼び出しが増え AWS KMS、無料利用枠を超える料金が発生する可能性があります。
+ データキーは暗号化用と復号化用に別々にキャッシュされますが、再利用期間はデータキーの両方のコピーに適用されます。
+ データキーの再利用期間が終了すると、 への次の呼び出し、`SendMessage`または`SendMessageBatch`通常、 メソッドへの呼び出しを AWS KMS `GenerateDataKey`トリガーして新しいデータキーを取得します。また、次に `SendMessage`と を呼び出すと`ReceiveMessage`、それぞれが の AWS KMS 呼び出しをトリガー`Decrypt`して、データキーを使用する前にデータキーの整合性を検証します。
+ [プリンシパル](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal) (AWS アカウント またはユーザー) はデータキーを共有しません (一意のプリンシパルによって送信されるメッセージは常に一意のデータキーを取得します）。したがって、 への呼び出しのボリューム AWS KMS は、データキーの再利用期間中に使用されている一意のプリンシパルの数の倍数です。

## AWS KMS コストの見積もり
<a name="sqs-estimate-kms-usage-costs"></a>

コストを予測し、 AWS 請求をよりよく理解するために、Amazon SQS が KMS キーを使用する頻度を知りたい場合があります。

**注記**  
コストは以下の計算式でかなり正確に予測できますが、Amazon SQSの分散性により、実際のコストの方が高くなることがあります。

APIリクエスト(`R`) *キューごと*の数を計算する場合は、次の式を使用します。

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

`B` は請求期間(秒)です。

`D` は、[データキー再利用期間](sqs-server-side-encryption.md#sqs-sse-key-terms)(秒)です。

`P`は[メイン](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Principal)の生産数は Amazon SQS キューに送信されます。

`C` は、Amazon SQSキューから受信する、コンシューマー側のプリンシパル数です。

**重要**  
一般的に、プロデューサー側プリンシパルで発生するコストはコンシューマー側プリンシパルの倍程度になります。詳細については、「[データキー再利用期間について](#sqs-how-does-the-data-key-reuse-period-work)」を参照してください。  
プロデューサーとコンシューマーの ユーザーが異なる場合、コストは増加します。

以下は計算の例です。正確な料金については、「[AWS Key Management Service 料金表](https://aws.amazon.com/kms/pricing/)」を参照してください。

### 例 1: 2 つのプリンシパルと 1 つのキューの AWS KMS API コールの数を計算する
<a name="example-1-queue-2-principals"></a>

この例では、以下を想定しています。
+ 請求期間は1月1日から31日(2,678,400秒)です。
+ データキー再利用期間は5分(300秒)に設定されています。
+ キューの数は 1 つです。
+ プロデューサー側プリンシパルが1つ、コンシューマー側プリンシパルが1つあります。

```
(2,678,400 / 300) * (2 * 1 + 1) = 26,784
```

### 例 2: 複数のプロデューサーとコンシューマー、2 つのキューの AWS KMS API コールの数を計算する
<a name="example-2-queues-multiple-principals"></a>

この例では、以下を想定しています。
+ 請求期間は2月1日から28日(2,419,200秒) です。
+ データキー再利用期間は24時間(86,400秒)に設定されています。
+ キューの数は2つです。
+ 1つ目のキューのプロデューサー側プリンシパルは3つ、コンシューマー側プリンシパルは1つです。
+ 2つ目のキューのプロデューサー側プリンシパルは5つ、コンシューマー側プリンシパルは2つです。

```
(2,419,200 / 86,400 * (2 * 3 + 1)) + (2,419,200 / 86,400 * (2 * 5 + 2)) = 532
```

## AWS KMS エラー
<a name="sqs-sse-troubleshooting-errors"></a>

Amazon SQS と を使用すると AWS KMS、エラーが発生する可能性があります。次のリファレンスでは、エラーおよび考えられるトラブルシューティング方法について説明します。
+ [AWS KMS の一般的なエラー](https://docs.aws.amazon.com/kms/latest/APIReference/CommonErrors.html)
+ [AWS KMS 復号エラー](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html#API_Decrypt_Errors)
+ [AWS KMS GenerateDataKey エラー](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html#API_GenerateDataKey_Errors)