

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

本主題說明如何使用 Amazon MSF APIs 建立和更新 KMS CMKs。若要遵循本主題中所述的程序，您必須具有管理 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 為應用程式 *MyCmkApplication* 使用 CMK。此政策會將必要的許可授予**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* 取代為您的 CMK 帳戶 idKey 政策。
+ 新增其他政策陳述式，[以允許金鑰管理員管理 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 組態中，請記得將*範例*值取代為實際值。

   ```
   {
       "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. 執行 [update-application](https://docs.aws.amazon.com/cli/latest/reference/kinesisanalyticsv2/update-application.html) AWS CLI 命令，如下列範例所示。在此命令中，提供您在先前步驟中建立的 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 組態中，請記得將*範例*值取代為實際值。

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

1. 儲存此檔案。例如，將其儲存為名稱 **disable-cmk.json**。

1. 執行 [update-application](https://docs.aws.amazon.com/cli/latest/reference/kinesisanalyticsv2/update-application.html) AWS CLI 命令，如下列範例所示。在此命令中，提供您在先前步驟中建立的 JSON 組態檔案做為檔案引數。

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