

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用管理 CMK APIs
<a name="manage-cmk-api"></a>

本主题介绍如何 CMKs 使用 Amazon MSF 创建和更新您的 KM APIs S。要按照本主题中描述的步骤进行操作，您必须拥有管理 KMS 密钥和 Amazon MSF 应用程序的权限。本主题中的过程使用宽松的密钥策略，该策略仅用于演示和测试目的。我们**不建议**对生产工作负载使用这种宽松的密钥策略。在生产工作负载的现实场景中，角色、权限和工作流程是隔离的。

**Topics**
+ [创建和分配 KMS 密钥](#create-assign-cmk-api)
+ [更新现有应用程序以使用 CMK](#update-existing-app-use-cmk-api)
+ [从 CMK 恢复到 AWS 拥有的密钥](#revert-cmk-to-aok-api)

## 创建和分配 KMS 密钥
<a name="create-assign-cmk-api"></a>

在开始之前，请创建 KMS 密钥。有关创建 KMS 密钥的信息，请参阅 *AWS Key Management Service 开发人员指南*中的[创建 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。

**Topics**
+ [创建 KMS 密钥策略](#create-cmk-kms-key-policy)
+ [应用程序生命周期操作员（API 调用方）权限](#create-cmk-kms-api-caller-permissions)

### 创建 KMS 密钥策略
<a name="create-cmk-kms-key-policy"></a>

要在 Amazon MSF 中使用 CMK，您必须在密钥策略中添加以下服务主体：`kinesisanalytics.amazonaws.com` 和 `infrastructure.kinesisanalytics.amazonaws.com`。Amazon MSF 使用这些服务主体进行验证和资源访问。如果您没有包含这些服务主体，Amazon MSF 会拒绝请求。

以下 KMS 密钥策略允许 Amazon MSF 使用应用程序的 CMK。*MyCmkApplication*该策略向 **Operator** 角色和 Amazon MSF 服务主体、`kinesisanalytics.amazonaws.com` 以及 `infrastructure.kinesisanalytics.amazonaws.com` 授予执行以下操作所需的权限：
+ 描述 CMK
+ 加密应用程序数据
+ 解密应用程序数据
+ 为密钥创建授权

下面的示例使用 IAM 角色。您可以使用以下示例作为模板为 KMS 密钥创建密钥策略，但请务必执行以下操作：
+ 将 `arn:aws:iam::123456789012:role/Operator` 替换为 **Operator** 角色。在创建密钥策略之前，必须先创建 **Operator** 角色或用户。未能执行此操作将导致您的请求失败。
+ 将 `arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication` 替换为您应用程序的 ARN。
+ 将 `kinesisanalytics.us-east-1.amazonaws.com` 替换为相应区域的服务值。
+ *123456789012*用您的账户 IDKey 策略替换为 CMK。
+ 添加其他策略声明，以[允许密钥管理员管理 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#key-policy-default-allow-administrators)。未能执行此操作将导致无法管理密钥。

以下密钥策略声明包含大量内容，因为它们旨在明确并显示每个操作所需的条件。

```
{
    "Version":"2012-10-17",			 	 	 	 	 	 
    "Id": "MyMsfCmkApplicationKeyPolicy",
    "Statement": [
        {
            "Sid": "AllowOperatorToDescribeKey",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/Operator"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com"
                }
            }
        },
        {
            "Sid": "AllowOperatorToConfigureAppToUseKeyForApplicationState",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/Operator"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com"
                }
            }
        },
        {
            "Sid": "AllowOperatorToConfigureAppToCreateGrantForRunningState",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/Operator"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com",
                    "kms:GrantConstraintType": "EncryptionContextSubset"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": "Decrypt"
                }
            }
        },
        {
            "Sid": "AllowMSFServiceToDescribeKey",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "kinesisanalytics.amazonaws.com",
                    "infrastructure.kinesisanalytics.amazonaws.com"
                ]
            },
            "Action": "kms:DescribeKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "aws:SourceAccount": "123456789012"
                }
            }
        },
        {
            "Sid": "AllowMSFServiceToGenerateDataKeyForDurableState",
            "Effect": "Allow",
            "Principal": {
                "Service": "kinesisanalytics.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "aws:SourceAccount": "123456789012"
                }
            }
        },
        {
            "Sid": "AllowMSFServiceToDecryptForDurableState",
            "Effect": "Allow",
            "Principal": {
                "Service": "kinesisanalytics.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication"
                }
            }
        },
        {
            "Sid": "AllowMSFServiceToUseKeyForRunningState",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "infrastructure.kinesisanalytics.amazonaws.com"
                ]
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication"
                }
            }
        },
        {
            "Sid": "AllowMSFServiceToCreateGrantForRunningState",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "infrastructure.kinesisanalytics.amazonaws.com"
                ]
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "kms:GrantConstraintType": "EncryptionContextSubset"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": "Decrypt"
                }
            }
        }
    ]
}
```

### 应用程序生命周期操作员（API 调用方）权限
<a name="create-cmk-kms-api-caller-permissions"></a>

以下 IAM 策略可确保应用程序生命周期操作员拥有向应用程序分配 KMS 密钥所需的权限*MyCmkApplication*。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowMSFAPICalls",
            "Effect": "Allow",
            "Action": "kinesisanalytics:*",
            "Resource": "*"
        },
        {
            "Sid": "AllowPassingServiceExecutionRole",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam::123456789012:role/MyCmkApplicationRole"
        },
        {
            "Sid": "AllowDescribeKey",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com"
                }
            }
        },
        {
            "Sid": "AllowMyCmkApplicationKeyOperationsForDurableState",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com",
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication"
                }
            }
        },
        {
            "Sid": "AllowMyCmkApplicationKeyOperationsForRunningState",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKeyWithoutPlaintext"
            ],
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com",
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication"
                }
            }
        },
        {
            "Sid": "AllowMyCmkApplicationCreateGrantForRunningState",
            "Effect": "Allow",
            "Action": "kms:CreateGrant",
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": "Decrypt"
                },
                "StringEquals": {
                    "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com",
                    "kms:EncryptionContext:aws:kinesisanalytics:arn": 
                        "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication",
                    "kms:GrantConstraintType": "EncryptionContextSubset"
                }
            }
        }
    ]
}
```

------

## 更新现有应用程序以使用 CMK
<a name="update-existing-app-use-cmk-api"></a>

在 Amazon MSF 中，您可以将 CMK 策略应用于使用 AWS 拥有的密钥 () AOKs 的现有应用程序。

默认情况下，Amazon MSF 使用 AOKs 临时存储（运行应用程序存储）和耐用（耐用应用程序存储）存储来加密您的所有数据。这意味着默认情况下，所有受 Flink [检查点](how-fault.md)或[快照](how-snapshots.md)约束的数据都是使用加密 AOKs 的。使用 CMK 替换 AOK 时，新的检查点和快照将使用 CMK 进行加密。但是，历史快照仍将使用 AOK 进行加密。

**更新现有应用程序以使用 CMK**

1. 使用以下配置创建 JSON 文件。

   确保将 `CurrentApplicationVersionId` 的值替换为应用程序的当前版本号。您可以使用获取应用程序的当前版本号[DescribeApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplication.html)。

   在此 JSON 配置中，请记住将*sample*值替换为实际值。

   ```
   {
       "ApplicationName": "MyCmkApplication",
       "CurrentApplicationVersionId": 1,
       "ApplicationConfigurationUpdate": {
           "ApplicationEncryptionConfigurationUpdate": {
               "KeyTypeUpdate": "CUSTOMER_MANAGED_KEY",
               "KeyIdUpdate": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
           }
       }
   }
   ```

1. 保存此文件。例如，使用名称 **enable-cmk.json** 保存该文件。

1. 运行[更新应用程序 AWS CLI 命令，](https://docs.aws.amazon.com/cli/latest/reference/kinesisanalyticsv2/update-application.html)如以下示例所示。在此命令中，提供您在前面步骤中创建的 JSON 配置文件作为文件参数。

   ```
   aws kinesisanalyticsv2 update-application \
       --cli-input-json file://enable-cmk.json
   ```

接受上述配置，使其只能在满足以下条件时更新使用 CMK 的应用程序：
+ API 调用方具有允许访问密钥的策略语句。
+ 密钥策略具有允许 API 调用方访问密钥的策略声明。
+ 密钥策略具有允许 Amazon MSF 服务主体（例如 `kinesisanalytics.amazonaws.com`）访问密钥的策略声明。

## 从 CMK 恢复到 AWS 拥有的密钥
<a name="revert-cmk-to-aok-api"></a>

**从 CMK 恢复为 AOK**

1. 使用以下配置创建 JSON 文件。

   在此 JSON 配置中，请记住将*sample*值替换为实际值。

   ```
   {
       "ApplicationName": "MyCmkApplication",
       "CurrentApplicationVersionId": 1,
       "ApplicationConfigurationUpdate": {
           "ApplicationEncryptionConfigurationUpdate": {
               "KeyTypeUpdate": "AWS_OWNED_KEY"
           }
       }
   }
   ```

1. 保存此文件。例如，使用名称 **disable-cmk.json** 保存该文件。

1. 运行[更新应用程序 AWS CLI 命令，](https://docs.aws.amazon.com/cli/latest/reference/kinesisanalyticsv2/update-application.html)如以下示例所示。在此命令中，提供您在前面步骤中创建的 JSON 配置文件作为文件参数。

   ```
   aws kinesisanalyticsv2 update-application \
       --cli-input-json file://disable-cmk.json
   ```