

# 为 Amazon ECS 的 Fargate 临时存储创建加密密钥
<a name="fargate-create-storage-key"></a>

创建一个客户自主管理型密钥来加密存储在 Fargate 临时存储上的数据。

**注意**  
使用客户自主管理型密钥加密 Fargate 临时存储的功能不适用于 Windows 任务集群。  
使用客户自主管理型密钥加密 Fargate 临时存储的功能不适用于早于 `1.4.0` 的 `platformVersions`。  
Fargate 在临时存储中预留了仅供 Fargate 使用的空间，您无需为此空间付费。具体分配可能与非客户自主管理密钥任务不同，但总空间保持不变。您可以通过 `df` 等工具查看此更改。  
Fargate 临时存储不支持多区域密钥。  
Fargate 临时存储不支持 KMS 密钥别名。

要在 AWS KMS 中创建客户自主管理型密钥（CMK）来加密 Fargate 临时存储，请执行以下步骤。

1. 导航到 [https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms)。

1. 按照《AWS Key Management Service 开发人员指南》中 [Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)[https://docs.aws.amazon.com/kms/latest/developerguide/overview.html](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 部分的说明操作。

1. 创建 AWS KMS 密钥时，请务必在密钥策略中提供 Fargate 服务相关 AWS KMS 操作权限。要将客户自主管理型密钥用于 Amazon ECS 集群资源，策略中必须允许以下 API 操作。
   + `kms:GenerateDataKeyWithoutPlainText` – 调用 `GenerateDataKeyWithoutPlainText` 以利用提供的 AWS KMS 密钥生成加密的数据密钥。
   + `kms:CreateGrant` – 向客户自主管理型密钥添加授权。这些授权会控制对指定 AWS KMS 密钥的访问权限，从而允许访问 Amazon ECS Fargate 所需的授权操作。有关[使用授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)的更多信息，请参阅[https://docs.aws.amazon.com/kms/latest/developerguide/overview.html](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)《AWS Key Management Service 开发人员指南》。这将允许 Amazon ECS Fargate 执行以下操作：
     + 调用 `Decrypt` 以便 AWS KMS 获取加密密钥，以便解密临时存储数据。
     + 设置停用主体，以允许服务 `RetireGrant`。
   + `kms:DescribeKey` – 提供客户自主管理型密钥详细信息，以便 Amazon ECS 验证该密钥是否是对称密钥以及是否已经启用。

   以下示例演示了一个将应用到目标加密密钥的 AWS KMS 密钥策略。要使用示例策略语句，请将 *user input placeholders* 替换为您自己的信息。与往常一样，只配置您需要的权限，但需要向至少一个用户提供具有权限的 AWS KMS 以免出现错误。

   ```
   {
         "Sid": "Allow generate data key access for Fargate tasks.",
         "Effect": "Allow",
         "Principal": { "Service":"fargate.amazonaws.com" },
         "Action": [
           "kms:GenerateDataKeyWithoutPlaintext"
         ],
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:aws:ecs:clusterAccount": [
               "customerAccountId"
             ],
             "kms:EncryptionContext:aws:ecs:clusterName": [
                "clusterName"
             ]   
           }
         },
         "Resource": "*"
       },
       {
         "Sid": "Allow grant creation permission for Fargate tasks.",
         "Effect": "Allow",
         "Principal": { "Service":"fargate.amazonaws.com" },
         "Action": [
           "kms:CreateGrant"
         ],
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:aws:ecs:clusterAccount": [
               "customerAccountId"
             ],
             "kms:EncryptionContext:aws:ecs:clusterName": [
                "clusterName"
             ]   
           },
          "ForAllValues:StringEquals": {
             "kms:GrantOperations": [
                "Decrypt"
             ]
          }
         },
         "Resource": "*"
       },
       {
         "Sid": "Allow describe key permission for cluster operator - CreateCluster and UpdateCluster.",
         "Effect": "Allow",
         "Principal": { "AWS":"arn:aws:iam::customerAccountId:role/customer-chosen-role" },
         "Action": [
           "kms:DescribeKey"
         ],
         "Resource": "*"
       }
   ```

   Fargate 任务使用 `aws:ecs:clusterAccount` 和 `aws:ecs:clusterName` 加密上下文密钥来执行密钥的加密操作。客户应添加这些权限以限制对特定账户和/或集群的访问。当您指定集群时，请使用集群名称而不是 ARN。

   有关更多信息，请参阅 [AWS KMS 开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)中的[加密内容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。

   创建或更新集群时，您可以选择使用条件键 `fargateEphemeralStorageKmsKeyId`。借助此条件减，客户可以更精细地控制 IAM 策略。对 `fargateEphemeralStorageKmsKeyId` 配置的更新仅对新的服务部署生效。

   以下示例将允许客户仅向一组特定的已批准 AWS KMS 密钥授予权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "ecs:CreateCluster",
           "ecs:UpdateCluster"
         ],
         "Resource": "*",
         "Condition": {
           "StringEquals": {
             "ecs:fargate-ephemeral-storage-kms-key": "arn:aws:kms:us-west-2:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
           }
         }
       }
     ]
   }
   ```

------

   下一个示例将拒绝删除已与集群关联的 AWS KMS 密钥的尝试。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Deny",
       "Action": [
           "ecs:CreateCluster",
           "ecs:UpdateCluster"
       ],
       "Resource": "*",
       "Condition": {
         "Null": {
           "ecs:fargate-ephemeral-storage-kms-key": "true"
         }
       }
     }
   }
   ```

------

   客户可以使用 AWS CLI `describe-tasks`、`describe-cluster` 或 `describe-services` 命令查看其非托管式任务或服务任务是否在使用该密钥进行加密。

   有关更多信息，请参阅《AWS KMS 开发人员指南》中的 [Condition keys for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html)[https://docs.aws.amazon.com/kms/latest/developerguide/overview.html](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)。

------
#### [ AWS 管理控制台 ]

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 选择左侧导航栏中的**集群**，然后选择右上角的**创建集群**，或者选择一个现有的集群。对于现有集群，请选择右上角的**更新集群**。

1. 在工作流的**加密**部分下，您可以选择在**托管存储**和 **Fargate 临时存储**下选择您的 AWS KMS 密钥。您也可以在此处选择**创建 AWS KMS 密钥**。

1. 创建完新集群后选择**创建**，或在要更新现有集群时选择**更新**。

------
#### [ AWS CLI ]

以下是使用 AWS CLI 创建集群并配置 Fargate 临时存储的示例（请用自己的值替换*红色的*值）：

```
aws ecs create-cluster --cluster clusterName \
--configuration '{"managedStorageConfiguration":{"fargateEphemeralStorageKmsKeyId":"arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"}}'
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:us-west-2:012345678901:cluster/clusterName",
        "clusterName": "clusterName",
        "configuration": {
            "managedStorageConfiguration": {
                "fargateEphemeralStorageKmsKeyId": "arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            }
        },
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [],
        "capacityProviders": [],
        "defaultCapacityProviderStrategy": []
    },
    "clusterCount": 5
}
```

------
#### [ CloudFormation ]

以下是使用 CloudFormation 创建集群并配置 Fargate 临时存储的示例模板（请用自己的值替换*红色的*值）：

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyCluster: 
    Type: AWS::ECS::Cluster
    Properties: 
      ClusterName: "clusterName" 
      Configuration:
        ManagedStorageConfiguration:
          FargateEphemeralStorageKmsKeyId: "arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
```

------