

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

# Step Functions 中的靜態資料加密
<a name="encryption-at-rest"></a>

**閱讀部落格**  
閱讀使用客戶受管金鑰[增強資料安全性中的客戶受管 AWS KMS 金鑰](https://aws.amazon.com/blogs/compute/strengthening-data-security-in-aws-step-functions-with-a-customer-managed-aws-kms-key/)

AWS Step Functions 一律使用透明的伺服器端加密來加密靜態資料。根據預設，靜態資料的加密可減少保護敏感資料所涉及的操作開銷和複雜性。您可以建置安全敏感的應用程式，以滿足嚴格的加密合規性和法規要求。

雖然您無法停用此層加密或選取替代加密類型，但您可以在建立狀態機器和活動資源時選擇客戶受管金鑰，在現有 AWS 擁有的加密金鑰上新增第二層加密：
+ **客戶受管金鑰** — Step Functions 支援使用您建立、擁有和管理的對稱客戶受管金鑰，以透過現有 AWS 擁有的加密新增第二層加密。您可以完全控制此層加密，因此能執行以下任務：
  + 建立和維護金鑰政策
  + 建立和維護 IAM 政策和授予操作
  + 啟用和停用金鑰政策
  + 輪換金鑰密碼編譯資料
  + 新增 標籤
  + 建立金鑰別名
  + 安排金鑰供刪除

  如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

您可以使用**客戶管理的金鑰**來加密您的資料，以進行 AWS Step Functions 狀態機器和活動。您可以在建立或更新**狀態機器**和建立**活動**時設定對稱 AWS KMS 金鑰和資料金鑰重複使用期間。執行歷史記錄和狀態機器定義將使用套用至狀態機器的金鑰加密。活動輸入將使用套用至活動的金鑰加密。

使用客戶受管 AWS KMS 金鑰，您可以保護包含**受保護醫療資訊 (PHI)** 的客戶資料，避免未經授權的存取。Step Functions 已與 CloudTrail 整合，因此您可以在事件歷史記錄中的 CloudTrail 主控台中檢視和稽核最新的事件。

如需詳細資訊 AWS KMS，請參閱[什麼是 AWS Key Management Service？](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 

**注意**  
Step Functions 會免費使用 AWS 擁有的金鑰自動啟用靜態加密。不過，使用客戶受管金鑰時會產生 AWS KMS 費用。如需定價的詳細資訊，請參閱 [AWS Key Management Service 定價。](https://aws.amazon.com/kms/pricing/)

## 使用客戶受管金鑰加密
<a name="enable-custom-encryption"></a>

 Step Functions 會先使用客戶受管 AWS KMS 金鑰解密承載資料，再將其傳遞給其他服務來執行任務。資料會使用 Transport Layer Security (TLS) 在傳輸中加密。

 從整合服務傳回資料時，Step Functions 會使用客戶受管 AWS KMS 金鑰加密資料。您可以使用相同的金鑰，在許多 AWS 服務中一致地套用加密。

您可以使用客戶受管金鑰搭配下列資源：
+ **狀態機器** - 標準和快速工作流程類型
+ **活動**

您可以輸入 **KMS 金鑰 ID 來指定資料金鑰**，Step Functions 會使用該 ID 來加密您的資料。
+ **KMS 金鑰 ID** — AWS KMS 以金鑰 ID、金鑰 ARN、別名名稱或別名 ARN 格式的客戶受管金鑰的金鑰[識別符](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)。

## 使用客戶受管金鑰建立狀態機器
<a name="create-state-machine-with-cmk"></a>

**先決條件：**您的使用者或角色必須具有 `DescribeKey`和 的 AWS KMS 許可，才能使用客戶受管 AWS KMS 金鑰建立狀態機器`GenerateDataKey`。

您可以在 AWS 主控台、透過 API 或透過 CloudFormation 資源佈建基礎設施來執行下列步驟。（本指南稍後將介紹 CloudFormation 範例。)

### 步驟 1：建立 AWS KMS 金鑰
<a name="create-key"></a>

 您可以使用 AWS KMS 主控台或 AWS KMS APIs 建立對稱客戶受管金鑰。

**建立對稱客戶受管金鑰**

請依照《AWS Key Management Service 開發人員指南》**中[建立對稱客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)的步驟進行。

**注意**  
*選用*：建立金鑰時，您可以選擇**金鑰管理員**。選取的使用者或角色將獲授予存取管理金鑰，例如透過 API 啟用或停用金鑰。您也可以選擇**金鑰使用者**。這些使用者或角色將有權在密碼編譯操作中使用 AWS KMS 金鑰。

### 步驟 2：設定 AWS KMS 金鑰政策
<a name="create-key-policy"></a>

金鑰政策會控制客戶受管金鑰的存取權限。每個客戶受管金鑰都必須只有一個金鑰政策，其中包含決定誰可以使用金鑰及其使用方式的陳述式。在建立客戶受管金鑰時，可以指定金鑰政策。如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[管理對客戶受管金鑰的存取](https://docs.aws.amazon.com/kms/latest/developerguide/control-access-overview.html#managing-access)。

以下是來自 主控台的範例 AWS KMS 金鑰政策，不含**金鑰管理員**或**金鑰使用者**：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "key-consolepolicy-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions for the key",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    }
  ]
}
```

如需在[政策中指定許可](https://docs.aws.amazon.com/kms/latest/developerguide/control-access-overview.html#overview-policy-elements)和對[金鑰存取進行疑難排解](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html#example-no-iam)的相關資訊，請參閱 *AWS Key Management Service 開發人員指南*。

### 步驟 3：新增金鑰政策來加密 CloudWatch 日誌
<a name="encrypt-logs"></a>

 Step Functions 已與 CloudWatch 整合，用於記錄和監控。當您使用自己的 KMS 金鑰為狀態機器啟用伺服器端加密並啟用 CloudWatch Log 整合時，您必須允許 從您的 AWS KMS 金鑰政策`delivery.logs.amazonaws.com`執行`kms:Decrypt`動作：

```
{
  "Sid": "Enable log service delivery for integrations",
  "Effect": "Allow",
  "Principal": {
    "Service": "delivery.logs.amazonaws.com"
  },
  "Action": "kms:Decrypt",
  "Resource": "*"
}
```

如果您使用 AWS KMS 金鑰啟用狀態機器加密，且狀態機器已啟用 CloudWatch Logs 整合，則狀態機器的執行角色需要下列政策：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowKMSPermissionForCloudWatchLogGroup",
      "Effect": "Allow",
      "Action": "kms:GenerateDataKey",
      "Resource": "arn:aws:kms:us-east-1:123456789012:key/keyId",
      "Condition": {
        "StringEquals": {
          "kms:EncryptionContext:SourceArn": "arn:aws:logs:us-east-1:123456789012:*"
        }
      }
    }
  ]
}
```

### 步驟 4：加密 CloudWatch Log Group *（選用）*
<a name="encrypt-cloudwatch-log-group"></a>

您可以使用自己的 AWS KMS 金鑰啟用 CloudWatch Log Group 中的日誌加密。若要這麼做，您還必須將下列政策新增至該 AWS KMS 金鑰。

**注意**  
您可以選擇相同或不同的 AWS KMS 金鑰來加密日誌和狀態機器定義。

****  

```
{
  "Id": "key-consolepolicy-logging",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "Enable log service for a single log group",
      "Effect": "Allow",
      "Principal": {
        "Service": "logs.us-east-1.amazonaws.com"
      },
      "Action": [
        "kms:Encrypt*",
        "kms:Decrypt*",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:Describe*"
      ],
      "Resource": "*",
      "Condition": {
        "ArnEquals": {
          "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:123456789012:log-group:LOG_GROUP_NAME"
        }
      }
    }
  ]
}
```

**注意**  
`Condition` 區段會將 AWS KMS 金鑰限制為單一日誌群組 ARN。

**注意**  
請參閱 [CloudWatch 日誌文件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#cmk-permissions)，進一步了解如何設定日誌群組 AWS KMS 金鑰的許可。

### 步驟 5：建立狀態機器
<a name="create-state-machine"></a>

在您建立金鑰並設定政策之後，您可以使用金鑰來建立新的狀態機器。

建立狀態機器時，請選擇**其他組態**，然後選擇使用客戶受管金鑰加密。然後，您可以選取您的金鑰，並將資料金鑰重複使用期間從 1 分鐘設定為 15 分鐘。

或者，您可以透過設定日誌層級並選擇使用 AWS KMS 金鑰加密日誌群組來啟用日誌記錄。

**注意**  
您只能在 Step Functions 主控台中的**新日誌群組**上啟用加密。若要了解如何將 AWS KMS 金鑰與現有日誌群組建立關聯，請參閱[將 AWS KMS 金鑰與日誌群組建立關聯](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#associate-cmk)。

若要使用客戶受管金鑰成功啟動標準工作流程和非同步 Express 工作流程的執行，您的執行角色需要 `kms:Decrypt`和 `kms:GenerateDataKey`許可。同步快速執行的執行角色需要 `kms:Decrypt`。當您在主控台中建立狀態機器並選擇**建立新角色**時，系統會自動為您包含這些許可。

以下是範例執行角色政策：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowKMSPermissionsForStepFunctionsWorkflowExecutions",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": [
        "arn:aws:kms:us-east-1:123456789012:key/keyId"
      ],
      "Condition": {
        "StringEquals": {
          "kms:EncryptionContext:aws:states:stateMachineArn": [
            "arn:aws:states:us-east-1:123456789012:stateMachine:stateMachineName"
          ]
        }
      }
    }
  ]
}
```

### 步驟 6：叫用使用 AWS KMS 金鑰加密的狀態機器
<a name="invoke-encrypted-state-machine"></a>

您可以像平常一樣叫用加密狀態機器，而您的資料將使用客戶受管金鑰加密。

## 使用客戶受管金鑰建立活動
<a name="create-activity-with-cmk"></a>

使用客戶受管金鑰建立 Step Functions 活動類似於使用客戶受管金鑰建立狀態機器。在您使用客戶受管 AWS KMS 金鑰建立活動之前，您的使用者或角色只需要 的 AWS KMS 許可`DescribeKey`。在建立活動期間，您可以選擇 金鑰並設定加密組態參數。

請注意，Step Functions 活動資源保持不變****。您無法`encryptionConfiguration`為現有活動的活動 ARN 更新 ；您必須建立新的活動資源。活動 API 端點的呼叫者必須具有使用 AWS KMS 金鑰成功建立活動的`kms:DescribeKey`許可。

在活動任務上啟用客戶受管金鑰加密時，狀態機器執行角色將需要活動金鑰的 `kms:GenerateDataKey`和 `kms:Decrypt`許可。如果您是從 Step Functions 主控台建立此狀態機器，則自動角色建立功能會新增這些許可。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowKMSPermissionsForStepFunctionsActivities",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": [
        "arn:aws:kms:us-east-1:123456789012:key/keyId"
      ],
      "Condition": {
        "StringEquals": {
          "kms:EncryptionContext:aws:states:activityArn": [
            "arn:aws:states:us-east-1:123456789012:activity:activityName"
          ]
        }
      }
    }
  ]
}
```

## 使用條件縮小 AWS KMS 許可政策的範圍
<a name="scope-down-kms-permission-policies-with-conditions"></a>

您可以在金鑰政策和 IAM 政策中使用*加密內容*`conditions`，以控制對對稱客戶受管金鑰的存取。若要限制對 Step Functions 代表特定角色請求使用 AWS KMS 金鑰，您可以使用 `kms:ViaService`條件。

### 使用加密內容進行擴展
<a name="stepfunctions-encryption-context"></a>

[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)是一組選用的金鑰值對，包含資料的其他相關內容資訊。

AWS KMS 使用加密內容做為額外的已驗證資料，以支援已驗證的加密。當您在加密資料的請求中包含加密內容時， 會將加密內容 AWS KMS 繫結至加密的資料。若要解密資料，您必須在請求中包含相同的加密內容。

Step Functions 在 AWS KMS 密碼編譯操作中提供加密內容，其中 金鑰`aws:states:stateMachineArn`用於狀態機器或`aws:states:activityArn`活動，而 值為資源 [Amazon Resource Name](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) (ARN)。

**Example**  

```
"encryptionContext": {"aws:states:stateMachineArn": "arn:aws:states:region:account-id:stateMachine:stateMachineName"}
```

**Example**  

```
"encryptionContext": {"aws:states:activityArn": "arn:aws:states:region:account-id:activity:activityName"}
```

下列範例顯示如何將執行角色的 AWS KMS 金鑰使用限制為具有 `kms:EncryptionContext`和 `aws:states:stateMachineArn`內容金鑰的特定狀態機器：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowKeyManagement",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": [
        "arn:aws:kms:us-east-1:123456789012:key/keyId"
      ],
      "Condition": {
        "StringEquals": {
          "kms:EncryptionContext:aws:states:stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:stateMachineName"
        }
      }
    }
  ]
}
```

### 使用 kms:ViaService 範圍
<a name="stepfunctions-via-service"></a>

`kms:ViaService` 條件金鑰會將 AWS Key Management Service 金鑰的使用限制為來自指定 AWS 服務的請求。

下列範例政策使用 `kms:ViaService`條件，只有在請求源自 `us-east-1`區域中的 Step Functions 時，才允許 AWS KMS 金鑰用於特定動作，代表 ExampleRole：

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "Allow access for Key Administrators in a region",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/ExampleRole"
      },
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "states.us-east-1.amazonaws.com"
        }
      }
    }
  ]
}
```

**注意**  
`kms:ViaService` 條件僅適用於 API 發起人需要 AWS KMS 許可時 （例如 `CreateStateMachine`、`CreateActivity`、 `GetActivityTask`等）。將`kms:ViaService`條件新增至**執行角色**可防止新的執行啟動或導致執行中的執行失敗。

## API 呼叫者的必要許可
<a name="using-api-with-encryption-required-permissions"></a>

若要呼叫傳回加密資料的 Step Functions API 動作，呼叫者需要 AWS KMS 許可。或者，某些 API 動作具有僅傳回中繼資料的選項 (`METADATA_ONLY`)，移除 AWS KMS 許可的需求。如需詳細資訊，請參閱 Step Functions API。

若要在使用客戶受管金鑰加密時成功完成執行，需要授予執行角色`kms:GenerateDataKey`和狀態機器使用的 AWS KMS 金鑰`kms:Decrypt`許可。

下表顯示使用**狀態機器 AWS KMS 金鑰**為 API 的 Step Functions APIs 發起人提供所需的 AWS KMS 許可。您可以為角色提供金鑰政策或 IAM 政策的許可。


|  |  | 
| --- |--- |
|  使用狀態機器金鑰的 AWS KMS APIs   |  來電者需要  | 
|  CreateStateMachine  |  kms:DescribeKey、 kms:GenerateDataKey  | 
|  UpdateStateMachine  |  kms:DescribeKey、 kms:GenerateDataKey  | 
|  DescribeStateMachine  |  kms:解密  | 
|  DescribeStateMachineForExecution  |  kms:解密  | 
|  StartExecution  |  --  | 
|  StartSyncExecution  |  kms:解密  | 
|  SendTaskSuccess  |  --  | 
|  SendTaskFailure  |  --  | 
|  StopExecution  |  --  | 
|  RedriveExecution  |  --  | 
|  DescribeExecution  |  kms:解密  | 
|  GetExecutionHistory  |  kms:解密  | 

 下表顯示使用 **活動 AWS KMS 金鑰**為 API 的 Step Functions APIs 發起人提供所需的 AWS KMS 許可。您可以在 角色的金鑰政策或 IAM 政策中提供許可。


|  |  | 
| --- |--- |
|  使用活動金鑰的 AWS KMS APIs   |  來電者需要  | 
|  CreateActivity  |  kms:描述金鑰  | 
|  GetActivityTask  |  kms:解密  | 

**何時將許可授予呼叫者或執行角色？**  
當 IAM 角色或使用者呼叫 Step Functions API 時，Step Functions 服務 AWS KMS 會代表 API 呼叫者呼叫 。在這種情況下，您必須將 AWS KMS 許可授予 API 發起人。當執行角色 AWS KMS 直接呼叫 時，您必須授予執行角色的 AWS KMS 許可。

## CloudFormation 加密組態的資源
<a name="cfn-resources-for-encryption-configuration"></a>

 CloudFormation Step Functions 的 資源類型可以使用加密組態佈建狀態機器和活動資源。

 根據預設，Step Functions 提供透明的伺服器端加密。[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html) 和 都[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-statemachine.html)接受選用`EncryptionConfiguration`屬性，可設定客戶受管 AWS KMS 金鑰進行伺服器端加密。

**先決條件：**在建立具有客戶受管 AWS KMS 金鑰的狀態機器之前，您的使用者或角色必須具有 `DescribeKey`和 的 AWS KMS 許可`GenerateDataKey`。

 StateMachine 的更新不需要[中斷](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)。活動資源的更新需要：[取代](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement)。

 若要在您的 CloudFormation 範本中宣告 **`EncryptionConfiguration`** 屬性，請使用下列語法：

 **JSON**

```
{
  "KmsKeyId" : String,
  "KmsDataKeyReusePeriodSeconds" : Integer,
  "Type" : String
}
```

 **YAML**

```
KmsKeyId: String
KmsDataKeyReusePeriodSeconds: Integer
Type: String
```

 **屬性**
+ **類型** - 狀態機器或活動的加密選項。*允許值*：`CUSTOMER_MANAGED_KMS_KEY` \$1 `AWS_OWNED_KEY`
+ **KmsKeyId** - 加密資料金鑰之對稱加密 AWS KMS 金鑰的別名、別名 ARN、金鑰 ID 或金鑰 ARN。若要在不同的 AWS 帳戶中指定 AWS KMS 金鑰，客戶必須使用金鑰 ARN 或別名 ARN。如需有關 kmsKeyId 的資訊，請參閱 AWS KMS 文件中的 [KeyId](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters)。
+ **KmsDataKeyReusePeriodSeconds** - SFN 將重複使用資料金鑰的最大持續時間。當期間過期時，Step Functions 會呼叫 `GenerateDataKey`。此設定只能在**類型**為 時設定`CUSTOMER_MANAGED_KMS_KEY`。值的範圍為 60-900 秒。預設為 300 秒。

### CloudFormation 範例
<a name="cfn-examples"></a>

#### 範例：StateMachine 搭配客戶受管金鑰
<a name="statemachine-with-managed-key"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: An example template for a Step Functions State Machine.
Resources:
  MyStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: HelloWorld-StateMachine
      Definition:
        StartAt: PassState
        States:
          PassState:
            Type: Pass
            End: true
      RoleArn: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/example"
      EncryptionConfiguration:
        KmsKeyId: !Ref MyKmsKey
        KmsDataKeyReusePeriodSeconds: 100
        Type: CUSTOMER_MANAGED_KMS_KEY

  MyKmsKey:
    Type: AWS::KMS::Key
    Properties:
      Description: Symmetric KMS key used for encryption/decryption
```

#### 範例：使用客戶受管金鑰的活動
<a name="activity-with-managed-key"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: An example template for a Step Functions Activity.
Resources:
  Activity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: ActivityWithKmsEncryption
      EncryptionConfiguration:
        KmsKeyId: !Ref MyKmsKey
        KmsDataKeyReusePeriodSeconds: 100
        Type: CUSTOMER_MANAGED_KMS_KEY

  MyKmsKey:
    Type: AWS::KMS::Key
    Properties:
      Description: Symmetric KMS key used for encryption/decryption
```

#### 更新活動的加密需要建立新的資源
<a name="updating-encryption-for-an-activity-requires-creating-a-new-resource"></a>

 活動組態不可變，資源名稱必須是唯一的。若要設定客戶受管金鑰進行加密，您必須**建立新的活動**。如果您嘗試變更現有活動的 CFN 範本中的組態，您將會收到`ActivityAlreadyExists`例外狀況。

 若要更新您的活動以包含客戶受管金鑰，請在 CFN 範本中設定新的活動名稱。以下顯示使用客戶受管金鑰組態建立新活動的範例：

 **現有活動定義**

```
AWSTemplateFormatVersion: '2010-09-09'
  Description: An example template for a new Step Functions Activity.
  Resources:
    Activity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: ActivityName
      EncryptionConfiguration:
        Type: AWS_OWNED_KEY
```

 **新的活動定義 **

```
AWSTemplateFormatVersion: '2010-09-09'
  Description: An example template for a Step Functions Activity.
  Resources:
    Activity:
      Type: AWS::StepFunctions::Activity
      Properties:
        Name: ActivityWithKmsEncryption
        EncryptionConfiguration:
          KmsKeyId: !Ref MyKmsKey
          KmsDataKeyReusePeriodSeconds: 100
          Type: CUSTOMER_MANAGED_KMS_KEY

    MyKmsKey:
      Type: AWS::KMS::Key
      Properties:
        Description: Symmetric KMS key used for encryption/decryption
```

## 監控您的加密金鑰用量
<a name="monitoring-encryption-keys"></a>

當您使用 AWS KMS 客戶受管金鑰加密 Step Functions 資源時，您可以使用 CloudTrail 追蹤 Step Functions 傳送的請求 AWS KMS。

您也可以在稽核記錄和記錄中使用加密內容，以識別客戶受管金鑰的使用方式。加密內容也會出現在 產生的日誌中[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)。

下列範例是 `Decrypt`、 和 的 CloudTrail 事件`DescribeKey`，`GenerateDataKey`用於監控 Step Functions 呼叫 AWS KMS 的操作，以存取客戶受管金鑰加密的資料：

------
#### [ Decrypt ]

當您存取加密狀態機器或活動時，Step Functions 會呼叫 `Decrypt`操作，以使用儲存的加密資料金鑰來存取加密的資料。

下面的範例事件會記錄 `Decrypt` 操作：

```
{
  "eventVersion": "1.09",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "111122223333:Sampleuser01",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
    "accountId": "111122223333",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "111122223333:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "userName": "Admin"
      },
      "attributes": {
        "creationDate": "2024-07-05T21:06:27Z",
        "mfaAuthenticated": "false"
      }
    },
    "invokedBy": "states.amazonaws.com"
  },
  "eventTime": "2024-07-05T21:12:21Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "Decrypt",
  "awsRegion": "aa-example-1",
  "sourceIPAddress": "states.amazonaws.com",
  "userAgent": "states.amazonaws.com",
  "requestParameters": {
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "keyId": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "encryptionContext": {
            "aws:states:stateMachineArn": "arn:aws:states:aa-example-1:111122223333:stateMachine:example1"
        }
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

------
#### [ DescribeKey ]

Step Functions 使用 `DescribeKey`操作來驗證與狀態機器或活動相關聯的 AWS KMS 客戶受管金鑰是否存在於帳戶和區域中。

下面的範例事件會記錄 `DescribeKey` 操作：

```
{
  "eventVersion": "1.09",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "111122223333:Sampleuser01",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
    "accountId": "111122223333",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "111122223333:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "userName": "Admin"
      },
      "attributes": {
        "creationDate": "2024-07-05T21:06:27Z",
        "mfaAuthenticated": "false"
      }
    },
    "invokedBy": "states.amazonaws.com"
  },
  "eventTime": "2024-07-05T21:12:21Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "DescribeKey",
  "awsRegion": "aa-example-1",
  "sourceIPAddress": "states.amazonaws.com",
  "userAgent": "states.amazonaws.com",
  "requestParameters": {
    "keyId": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
  },
  "responseElements": null,
  "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "readOnly": true,
  "resources": [
    {
      "accountId": "111122223333",
      "type": "AWS::KMS::Key",
      "ARN": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    }
  ],
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "111122223333",
  "eventCategory": "Management",
  "sessionCredentialFromConsole": "true"
}
```

------
#### [ GenerateDataKey ]

當您為狀態機器或活動啟用 AWS KMS 客戶受管金鑰時，Step Functions 會傳送`GenerateDataKey`請求，以取得加密狀態機器定義或執行資料的資料金鑰。

下面的範例事件會記錄 `GenerateDataKey` 操作：

```
{
  "eventVersion": "1.09",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "111122223333:Sampleuser01",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
    "accountId": "111122223333",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "111122223333:Sampleuser01",
        "arn": "arn:aws:iam::111122223333:role/Admin",
        "accountId": "111122223333",
        "userName": "Admin"
      },
      "attributes": {
        "creationDate": "2024-07-05T21:06:27Z",
        "mfaAuthenticated": "false"
      }
    },
    "invokedBy": "states.amazonaws.com"
  },
  "eventTime": "2024-07-05T21:12:21Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "GenerateDataKey",
  "awsRegion": "aa-example-1",
  "sourceIPAddress": "states.amazonaws.com",
  "userAgent": "states.amazonaws.com",
  "requestParameters": {
    "keySpec": "AES_256",
    "encryptionContext": {
      "aws:states:stateMachineArn": "arn:aws:states:aa-example-1:111122223333:stateMachine:example1"
    },
    "keyId": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
  },
  "responseElements": null,
  "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "readOnly": true,
  "resources": [
    {
      "accountId": "111122223333",
      "type": "AWS::KMS::Key",
      "ARN": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    }
  ],
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "111122223333",
  "eventCategory": "Management"
}
```

------

## FAQs
<a name="faqs"></a>

### 如果我的金鑰在 中標記為刪除或刪除，會發生什麼情況 AWS KMS？
<a name="what-happens-if-my-key-is-marked-for-deletion-or-deleted-in-kms-"></a>

 如果金鑰已刪除或標記為刪除 AWS KMS，則任何相關的執行都會失敗。在您移除或變更與工作流程相關聯的金鑰之前，無法啟動新的執行。刪除 AWS KMS 金鑰後，與工作流程執行相關聯的所有加密資料都會保持加密，且無法再解密，使資料***無法復原***。

### 如果在 中停用 AWS KMS 金鑰，會發生什麼情況 AWS KMS？
<a name="what-happens-if-a-kms-key-is-disabled-in-kms-"></a>

 如果在 中停用 AWS KMS 金鑰 AWS KMS，則任何相關的執行都會失敗。新的執行無法啟動。在重新啟用之前，您無法再解密在該停用 AWS KMS 金鑰下加密的資料。

### 傳送至 EventBridge 的執行狀態變更事件會發生什麼情況？
<a name="what-happens-to-execution-status-change-events-sent-to-ev-"></a>

 使用客戶受管 AWS KMS 金鑰加密之工作流程的執行狀態變更事件不會包含執行輸入、輸出、錯誤和原因。

## 進一步了解
<a name="learn-more-data-at-rest-encryption"></a>

如需有關靜態資料加密的資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的 的[AWS Key Management Service 概念](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)和安全性最佳實務。 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/best-practices.html)