

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# API를 사용한 CMK 관리
<a name="manage-cmk-api"></a>

이 주제에서는 Amazon MSF API를 사용하여 KMS CMK를 생성하고 업데이트하는 방법을 설명합니다. 이 주제에 설명된 절차를 따르려면 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** 역할과 `kinesisanalytics.amazonaws.com` 및 `infrastructure.kinesisanalytics.amazonaws.com` Amazon MSF 서비스 보안 주체 모두에게 다음 작업을 수행하는 데 필요한 권한을 부여합니다.
+ 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에 대한 사용자의 계정 ID 키 정책으로 교체합니다.
+ [키 관리자가 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 정책은 애플리케이션 수명 주기 연산자가 애플리케이션 *MyCmkApplication*에 KMS 키를 할당하는 데 필요한 권한을 갖도록 보장합니다.

------
#### [ 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에서는 AWS 소유 키 (AOKs.

Amazon MSF는 기본적으로 AOK를 사용하여 임시 스토리지(실행 중 애플리케이션 스토리지)와 내구성 스토리지(내구성 애플리케이션 스토리지)에 있는 모든 데이터를 암호화합니다. 따라서 Flink [체크포인트](how-fault.md) 또는 [스냅샷](how-snapshots.md)의 대상이 되는 모든 데이터는 기본적으로 AOK를 사용하여 암호화됩니다. AOK를 CMK로 교체하면 새 체크포인트와 스냅샷이 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 호출자의 키 접근을 허용하는 정책 문이 포함되어 있어야 합니다.
+ 키 정책에 예를 들면 `kinesisanalytics.amazonaws.com`과 같은 Amazon MSF 서비스 보안 주체에 키 접근을 허용하는 정책 문이 포함되어 있어야 합니다.

## 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
   ```