KMSで暗号化したSNS Topicに投入したメッセージをKMSで暗号化したSQS Queueに投入する

## はじめに

*　[こちら](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-tutorial-enable-encryption-for-topic-sqs-queue-subscriptions.html)の手順に則って作業します。
*　（けど、上記の手順は昔のコンソール用の手順）
*　構築が終わったら、Resource Policyをガチャガチャいじる予定

## Custom CMKを作る

1. KMS のコンソールにアクセス
2. `Create Key`をクリック
3. Key typeは`Symmetric`を選択し、Key Material Originは`KMS`を選択する
4. Aliasに`MyCustomCMK`を入力する
5. Key Administratorに`IAM_ROLE_DEFAULT`（自分で作ったIAM ROLEかIAM USER）を選択する
6. Key Usage Permissionに`IAM_ROLE_DEFAULT`（キーの使用者に該当。検証用なので、Administratorと同一）を選択する
7. Reviewで、SNSをPrincipal指定したStatementを追加する

```json

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam:: xxxxxxxxxxxx:role/IAM_ROLE_DEFAULT"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam:: xxxxxxxxxxxx:role/IAM_ROLE_DEFAULT"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam:: xxxxxxxxxxxx:role/IAM_ROLE_DEFAULT"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        },
        {
            "Sid": "Allow Amazon SNS to use this key",
            "Effect": "Allow",
            "Principal": {
                "Service": "sns.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*"
        }
    ]
}
```

## SSEが有効なSNS Topicを作る

1. SNSのコンソールにアクセス
2. `Create Topic`をクリックする
3. Topic Nameに`MyEncryptedTopic`を入力する
4. Encryptionで`Enable encryption`を選択し、フォームに`alias/MyCustomCMK`（さっき作ったCMKのalias）を入力する
5. `Create Topic`をクリックする

## SSEが有効なSQS Queueを作る

1. SQSのコンソールにアクセス
2. `Create New Queue`をクリックする
3. Queue Nameに`MyEncryptedQueue`を入力し、`Configure Queue`をクリックする
4. SSE Settingsで`Use SSE`をチェックし、AWS KMS CMKで`MyCustomCMK`（さっき作ったCMKの名前）を選択する
5. `Create Queue`をクリックする

## SNS Topicへのサブスクライブ

1. SQSのコンソールにアクセスする
2. `MyEncryptedQueue`を選択、`Queue Action`から`Subscribe Queue to SNS Topic`をクリックする
3. Choose a Topicから`MyEncrypted`を選択する
4. `Subscribe`をクリックする

## SSEが有効なSNS Topicにメッセージをパブリッシュする

1. SNSのコンソールにアクセスする
2. Topicsから`MyEncryptedTopic`を選択し、`Publish Message`をクリックする
3. Subjectに`Test Message Subject`、Message Bodyに`Test Message Body`を入力し、`Publish Message`をクリックする

## SSEが有効なSQS Queueにキューイングされていることを確認する

1. SQSのコンソールにアクセスする
2. `MyEncryptedQueue`を選択し、`Queue Action`から`View/Delete Messages`をクリックする
3. `Start Polling for Messages`をクリックし、`Test Message Subject`がキューイングされていることを確認できる

## （参考）各オブジェクトのJSON

### sqs get-queue-attributes

```json

{
    "Attributes": {
        "ApproximateNumberOfMessagesNotVisible": "0", 
        "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"arn:aws:sqs:ap-northeast-1: xxxxxxxxxxxx:MyEncryptedQueue/SQSDefaultPolicy\",\"Statement\":[{\"Sid\":\"Sid1594222624729\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"SQS:SendMessage\",\"Resource\":\"arn:aws:sqs:ap-northeast-1: xxxxxxxxxxxx:MyEncryptedQueue\",\"Condition\":{\"ArnEquals\":{\"aws:SourceArn\":\"arn:aws:sns:ap-northeast-1: xxxxxxxxxxxx:MyEncryptedTopic\"}}}]}", 
        "KmsMasterKeyId": "arn:aws:kms:ap-northeast-1: xxxxxxxxxxxx:key/73f9e34b-a538-4049-91e0-yyyyyyyyyyyy", 
        "MessageRetentionPeriod": "345600", 
        "ApproximateNumberOfMessagesDelayed": "0", 
        "KmsDataKeyReusePeriodSeconds": "300", 
        "MaximumMessageSize": "262144", 
        "CreatedTimestamp": "1594222364", 
        "ApproximateNumberOfMessages": "1", 
        "ReceiveMessageWaitTimeSeconds": "0", 
        "DelaySeconds": "0", 
        "VisibilityTimeout": "30", 
        "LastModifiedTimestamp": "1594222626", 
        "QueueArn": "arn:aws:sqs:ap-northeast-1:xxxxxxxxxxxx:MyEncryptedQueue"
    }
}
```

### sns get-topic-attributes

```json

{
    "Attributes": {
        "KmsMasterKeyId": "arn:aws:kms:ap-northeast-1: xxxxxxxxxxxx:key/73f9e34b-a538-4049-91e0-yyyyyyyyyyyy", 
        "DisplayName": "", 
        "SubscriptionsDeleted": "0", 
        "EffectiveDeliveryPolicy": "{\"http\":{\"defaultHealthyRetryPolicy\":{\"minDelayTarget\":20,\"maxDelayTarget\":20,\"numRetries\":3,\"numMaxDelayRetries\":0,\"numNoDelayRetries\":0,\"numMinDelayRetries\":0,\"backoffFunction\":\"linear\"},\"disableSubscriptionOverrides\":false}}", 
        "Owner": "xxxxxxxxxxxx", 
        "SubscriptionsConfirmed": "1", 
        "Policy": "{\"Version\":\"2008-10-17\",\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Sid\":\"__default_statement_ID\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"SNS:GetTopicAttributes\",\"SNS:SetTopicAttributes\",\"SNS:AddPermission\",\"SNS:RemovePermission\",\"SNS:DeleteTopic\",\"SNS:Subscribe\",\"SNS:ListSubscriptionsByTopic\",\"SNS:Publish\",\"SNS:Receive\"],\"Resource\":\"arn:aws:sns:ap-northeast-1: xxxxxxxxxxxx:MyEncryptedTopic\",\"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"xxxxxxxxxxxx\"}}}]}", 
        "TopicArn": "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:MyEncryptedTopic", 
        "SubscriptionsPending": "0"
    }
}
```

おしまい。