Amazon Managed Service for Apache Flink(Amazon MSF)之前称为 Amazon Kinesis Data Analytics for Apache Flink。
使用 API 管理 CMK
本主题介绍如何使用 Amazon MSF API 创建和更新 KMS CMK。要按照本主题中描述的步骤进行操作,您必须拥有管理 KMS 密钥和 Amazon MSF 应用程序的权限。本主题中的过程使用宽松的密钥策略,该策略仅用于演示和测试目的。我们不建议对生产工作负载使用这种宽松的密钥策略。在生产工作负载的现实场景中,角色、权限和工作流程是隔离的。
创建和分配 KMS 密钥
在开始之前,请创建 KMS 密钥。有关创建 KMS 密钥的信息,请参阅 Amazon Key Management Service 开发人员指南中的创建 KMS 密钥。
创建 KMS 密钥策略
要在 Amazon MSF 中使用 CMK,您必须在密钥策略中添加以下服务主体:kinesisanalytics.amazonaws.com 和 infrastructure.kinesisanalytics.amazonaws.com。Amazon MSF 使用这些服务主体进行验证和资源访问。如果您没有包含这些服务主体,Amazon MSF 会拒绝请求。
以下 KMS 密钥策略允许 Amazon MSF 针对应用程序 MyCmkApplication 使用 CMK。该策略向 Operator 角色和 Amazon MSF 服务主体、kinesisanalytics.amazonaws.com 以及 infrastructure.kinesisanalytics.amazonaws.com 授予执行以下操作所需的权限:
-
描述 CMK
-
加密应用程序数据
-
解密应用程序数据
-
为密钥创建授权
下面的示例使用 IAM 角色。您可以使用以下示例作为模板为 KMS 密钥创建密钥策略,但请务必执行以下操作:
-
将
arn:aws:iam::替换为123456789012:role/OperatorOperator角色。在创建密钥策略之前,必须先创建Operator角色或用户。未能执行此操作将导致您的请求失败。 -
将
arn:aws:kinesisanalytics:us-east-1:替换为您应用程序的 ARN。123456789012:application/MyCmkApplication -
将
kinesisanalytics.替换为相应区域的服务值。us-east-1.amazonaws.com -
将
123456789012替换为 CMK 的账户 idKey 策略。 -
添加其他策略声明,以允许密钥管理员管理 KMS 密钥。未能执行此操作将导致无法管理密钥。
以下密钥策略声明包含大量内容,因为它们旨在明确并显示每个操作所需的条件。
{ "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 调用方)权限
以下 IAM 策略可确保应用程序生命周期操作员拥有向应用程序 MyCmkApplication 分配 KMS 密钥所需的权限。
更新现有应用程序以使用 CMK
在 Amazon MSF 中,您可以将 CMK 策略应用于使用 Amazon 拥有的密钥(AOK)的现有应用程序。
默认情况下,Amazon MSF 使用 AOK 在临时(正在运行的应用程序存储)和耐久(持久应用程序存储)存储中加密您的数据。这意味着,默认情况下,所有受 Flink 检查点或快照约束的数据都将使用 AOK 进行加密。使用 CMK 替换 AOK 时,新的检查点和快照将使用 CMK 进行加密。但是,历史快照仍将使用 AOK 进行加密。
更新现有应用程序以使用 CMK
-
使用以下配置创建 JSON 文件。
确保将
CurrentApplicationVersionId的值替换为应用程序的当前版本号。可以使用 DescribeApplication 获取应用程序的当前版本号。在此 JSON 配置中,请记住将
示例值替换为实际值。{ "ApplicationName": "MyCmkApplication", "CurrentApplicationVersionId":1, "ApplicationConfigurationUpdate": { "ApplicationEncryptionConfigurationUpdate": { "KeyTypeUpdate": "CUSTOMER_MANAGED_KEY", "KeyIdUpdate": "arn:aws:kms:us-east-1:" } } }123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab -
保存此文件。例如,使用名称
enable-cmk.json保存该文件。 -
运行 update-application Amazon CLI 命令,如以下示例所示。在此命令中,提供您在前面步骤中创建的 JSON 配置文件作为文件参数。
aws kinesisanalyticsv2 update-application \ --cli-input-json file://enable-cmk.json
接受上述配置,使其只能在满足以下条件时更新使用 CMK 的应用程序:
-
API 调用方具有允许访问密钥的策略语句。
-
密钥策略具有允许 API 调用方访问密钥的策略声明。
-
密钥策略具有允许 Amazon MSF 服务主体(例如
kinesisanalytics.amazonaws.com)访问密钥的策略声明。
从 CMK 恢复为 Amazon 拥有的密钥
从 CMK 恢复为 AOK
-
使用以下配置创建 JSON 文件。
在此 JSON 配置中,请记住将
示例值替换为实际值。{ "ApplicationName": "MyCmkApplication", "CurrentApplicationVersionId":1, "ApplicationConfigurationUpdate": { "ApplicationEncryptionConfigurationUpdate": { "KeyTypeUpdate": "AWS_OWNED_KEY" } } } -
保存此文件。例如,使用名称
disable-cmk.json保存该文件。 -
运行 update-application Amazon CLI 命令,如以下示例所示。在此命令中,提供您在前面步骤中创建的 JSON 配置文件作为文件参数。
aws kinesisanalyticsv2 update-application \ --cli-input-json file://disable-cmk.json