

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

# 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 开发人员指南》**中的 [customer managed key](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

您可以使用**客户管理的 AWS Step Functions 状态机和活动密钥**对数据进行加密。在创建或更新**状态机**以及创建 Act **ivit** y 时，您可以配置对称 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 密钥解密负载数据，然后将其传递给其他服务以执行任务。数据在传输过程中使用传输层安全性协议（TLS）进行加密。

 当从集成服务返回数据时，Step Functions 会使用您的客户托管 AWS KMS 密钥对数据进行加密。您可以使用相同的密钥对许多 AWS 服务进行一致的加密。

可以将客户自主管理型密钥与以下资源结合使用：
+ **状态机**：标准和快速工作流程类型
+ **活动**

可以通过输入 **KMS 密钥 ID** 来指定数据密钥，Step Functions 使用该密钥来加密您的数据。
+ **KMS 密钥 ID** [— AWS KMS 客户托管密钥的密钥标识符](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)，其形式为密钥 ID、密钥 ARN、别名或别名 ARN。

## 使用客户自主管理型密钥创建状态机
<a name="create-state-machine-with-cmk"></a>

**先决条件：**在使用客户托管 AWS KMS 密钥创建状态机之前，您的用户或角色必须拥有`DescribeKey`和的 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 开发人员指南》**中的 [Managing access to customer managed keys](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": "*"
    }
  ]
}
```

有关 [specifying permissions in a policy](https://docs.aws.amazon.com/kms/latest/developerguide/control-access-overview.html#overview-policy-elements) 和 [troubleshooting key access](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 日志集成时，必须`delivery.logs.amazonaws.com`允许根据 AWS KMS 密钥策略执行`kms:Decrypt`操作：

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

如果您使用 AWS KMS 密钥启用状态机加密，并且状态机启用了 CloudWatch 日志集成，则状态机的执行角色需要以下策略：

****  

```
{
  "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 日志组*（可选）*
<a name="encrypt-cloudwatch-log-group"></a>

您可以使用自己的密 AWS KMS 钥对日志组中的 CloudWatch 日志启用加密。为此，您还必须向该 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 日志组设置 AWS KMS 密钥权限的更多信息，请参阅日志文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#cmk-permissions)。

### 步骤 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)关联。

要使用客户自主管理型密钥成功启动标准工作流程和异步快速工作流程的执行，您的执行角色需要 `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 活动资源保持**不可变**。无法更新现有活动的活动 ARN 的 `encryptionConfiguration`；而必须创建新的活动资源。Activity 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`，来控制对于对称客户自主管理型密钥的访问权限。要将 AWS KMS 密钥的使用限制为代表特定角色从 Step Functions 发出的请求，您可以使用`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`用于状态机或活动，值为资源[亚马逊资源名称](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:states:stateMachineArn`上下文 AWS KMS 密钥将执行角色的密钥限制在特定的状态机上：`kms:EncryptionContext`

****  

```
{
  "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`条件，仅当请求来自该区域的 Step Functions 时，才允许将 AWS KMS 密钥用于特定操作，并代表该`us-east-1`区域的 Step Functions： 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`权限。

下表显示了您需要向 Step Functions API 调用者提供的 APIs 使用**状态机 AWS KMS 密钥的 AWS KMS **权限。可以在密钥策略或 IAM 策略中为角色提供权限。


|  |  | 
| --- |--- |
|  APIs 使用状态机的密 AWS KMS 钥  |  调用方需要  | 
|  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:解密  | 

 下表显示了您需要向 Step Functions API 调用者提供的 APIs 使用**活动 AWS KMS 密钥的 AWS KMS **权限。可以在密钥策略或 IAM 策略中为角色提供权限。


|  |  | 
| --- |--- |
|  APIs 使用活动密 AWS KMS 钥  |  调用方需要  | 
|  CreateActivity  |  kms:DescribeKey  | 
|  GetActivityTask  |  kms:解密  | 

**何时向调用方或执行角色授予权限？**  
当 IAM 角色或用户调用 Step Functions API 时，Step Function AWS KMS s 服务会代表 API 调用者进行调用。在这种情况下，您必须向 API 调用者授予 AWS KMS 权限。当执行角色 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)接受一个可选`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
```

 **属性**
+ **Type**：状态机或活动的加密选项。*允许的值*：`CUSTOMER_MANAGED_KMS_KEY` \$1 `AWS_OWNED_KEY`
+ **KmsKeyId**-加密数据密钥的对称加密密钥的别名、别名 ARN、密钥 ID 或 AWS KMS 密钥 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`。只有当 **Type** 为 `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``DescribeKey`、和`GenerateDataKey`监控 Step Functions 为访问由客户托管密钥加密的数据而调用的 AWS KMS 操作 CloudTrail 的事件：

------
#### [ 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 concepts](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html) 和 [security best practices for AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/best-practices.html)。