

# 将 Amazon EBS 卷与 Amazon ECS 结合使用
<a name="ebs-volumes"></a>

Amazon Elastic Block Store（Amazon EBS）卷为数据密集型工作负载提供高度可用、经济高效、持久、高性能的块存储。Amazon EBS 卷可以与 Amazon ECS 任务一起用于高吞吐量和事务密集型应用程序。有关 Amazon EBS 卷的更多信息，请参阅《Amazon EBS 用户指南》[https://docs.amazonaws.cn/ebs/latest/userguide/ebs-volumes.html](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-volumes.html)中的 *Amazon EBS 卷*。

附加到 Amazon ECS 任务的 Amazon EBS 卷由 Amazon ECS 代表您管理。在独立任务启动期间，您可以提供用于将一个 EBS 卷附加到任务的配置。在创建或更新服务期间，您可以提供针对 Amazon ECS 服务管理的每个任务，用于为每个任务挂载一个 EBS 卷的配置。您可以配置新的空卷以进行附加，也可以使用快照从现有卷加载数据。

**注意**  
使用快照配置卷时，您可以指定一个 `volumeInitializationRate`（以 MiB/s 为单位），以该速度从快照中提取数据，从而创建在可预测的时间内完全初始化的卷。有关卷初始化的更多信息，请参阅《*Amazon EBS 用户指南*》中的 [Initialize Amazon EBS volumes](https://docs.amazonaws.cn/ebs/latest/userguide/initalize-volume.html)。有关配置 Amazon EBS 卷的更多信息，请参阅[在 Amazon ECS 任务定义中将卷配置推迟到启动时间](specify-ebs-config.md)和[指定 Amazon ECS 部署时的 Amazon EBS 卷配置](configure-ebs-volume.md)。

使用任务定义中的 `configuredAtLaunch` 参数将卷配置推迟到启动时间。通过在启动时提供卷配置而不是在任务定义中提供，您可以创建不受特定数据卷类型或特定 EBS 卷设置限制的任务定义。然后，您可以在不同的运行时环境中重复使用任务定义。例如在部署期间，您可以为生产工作负载提供比预生产环境更多的吞吐量。

 附加到任务的 Amazon EBS 卷可以使用 Amazon Key Management Service（Amazon KMS）密钥进行加密，以保护您的数据。有关更多信息，请参阅[加密附加到 Amazon ECS 任务的 Amazon EBS 卷中存储的数据](ebs-kms-encryption.md)。

要监控卷的性能，您还可以使用 Amazon CloudWatch 指标。有关 Amazon EBS 卷的 Amazon ECS 指标的更多信息，请参阅 [Amazon ECS CloudWatch 指标](available-metrics.md) 和 [Amazon ECS Container Insights 指标](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-ECS.html)。

所有支持 Amazon ECS 的商业和中国 [Amazon Web Services 区域](https://docs.amazonaws.cn/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#region) 都支持将 Amazon EBS 卷附加到任务。

## 支持的操作系统和容量
<a name="ebs-volumes-configuration"></a>

下表提供了支持的操作系统和容量配置。


| 容量 | Linux  | Windows | 
| --- | --- | --- | 
| Fargate |  平台版本 1.4.0 或更高版本（Linux）支持 Amazon EBS 卷。有关更多信息，请参阅 [适用于 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。 | 不支持 | 
| EC2 | 托管在基于 Nitro 的实例上并具有经 Amazon ECS 优化的亚马逊机器映像（AMI）的任务支持 Amazon EBS 卷。有关实例类型的信息，请参阅《Amazon EC2 用户指南》中的[实例类型](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/instance-types.html)。ECS 优化型 AMI `20231219` 或更高版本支持 Amazon EBS 卷。有关更多信息，请参阅[检索经 Amazon ECS 优化的 AMI 元数据](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html)。 | 在使用 Amazon ECS 优化型亚马逊机器映像（AMI）的基于 Nitro 的实例上托管的任务。有关实例类型的信息，请参阅《Amazon EC2 用户指南》中的[实例类型](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/instance-types.html)。ECS 优化型 AMI `20241017` 或更高版本支持 Amazon EBS 卷。有关更多信息，请参阅[检索 Amazon ECS 优化型 Windows AMI 元数据](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/retrieve-ecs-optimized_windows_AMI.html)。 | 
| Amazon ECS 托管实例 | Linux 上的 Amazon ECS 托管实例上托管的任务支持 Amazon EBS 卷。 | 不支持 | 

## 注意事项
<a name="ebs-volume-considerations"></a>

 使用 Amazon EBS 卷时应考虑以下事项：
+ 您无法将 Amazon EBS 卷配置为附加到 `use1-az3` 可用区中的 Fargate Amazon ECS 任务。
+ 托管在 Fargate 上的任务不支持磁性（`standard`）Amazon EBS 卷类型。有关 Amazon EBS 卷类型的更多信息，请参阅《Amazon EC2 用户指南》[https://docs.amazonaws.cn/ebs/latest/userguide/ebs-volume-types.html](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-volume-types.html)中的 *Amazon EBS 卷*。
+ 创建服务或在部署时配置卷的独立任务时，需要 Amazon ECS 基础设施的 IAM 角色。您可以将 Amazon 托管的 `AmazonECSInfrastructureRolePolicyForVolumes` IAM 策略附加到角色，也可以使用托管策略作为指南，以创建并附加您自己的具有满足您特定需求的权限的策略。有关更多信息，请参阅 [Amazon ECS 基础设施 IAM 角色](infrastructure_IAM_role.md)。
+ 您最多可以将一个 Amazon EBS 卷附加到每个 Amazon ECS 任务，并且该卷必须是新卷。您不能将现有的 Amazon EBS 卷挂载到任务中。但是，您可以在部署时使用现有卷的快照来配置新的 Amazon EBS 卷。
+ 要将 Amazon EBS 卷与 Amazon ECS 服务结合使用，部署控制器必须是 `ECS`。使用此部署控制器时，支持滚动和蓝/绿部署策略。
+ 要使任务中的容器写入已装载的 Amazon EBS 卷，该容器必须具有适当的文件系统权限。当您在容器定义中指定非根用户时，Amazon ECS 会自动为卷配置基于组的权限，以允许指定的用户读取和写入该卷。如果未指定用户，则容器以根用户身份运行，并拥有对卷的完全访问权限。
+ Amazon ECS 会自动将保留的标签 `AmazonECSCreated` 和 `AmazonECSManaged` 添加到附加的卷中。如果您从卷中移除这些标签，则 Amazon ECS 将无法代表您管理该卷。有关标记 Amazon EBS 卷的更多信息，请参阅[标记 Amazon EBS 卷](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/specify-ebs-config.html#ebs-volume-tagging)。有关标记 Amazon ECS 源的更多信息，请参阅[标记 Amazon ECS 资源](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ecs-using-tags.html)。
+ 不支持通过包含分区的 Amazon EBS 卷的快照预调配卷。
+ 附加到由服务管理的任务的卷不会被保留，并且总是会在任务终止时被删除。
+ 您无法将 Amazon EBS 卷配置为附加到正在 Amazon Outposts 上运行的 Amazon ECS 任务。

# 非根用户行为
<a name="ebs-non-root-behavior"></a>

当您在容器定义中指定非根用户时，Amazon ECS 会自动为 Amazon EBS 卷配置基于组的权限，以允许指定的用户读取和写入该卷。卷装载时具有以下特性：
+ 卷由根用户和根组拥有。
+ 组权限设置为允许读写访问。
+ 将非根用户添加到合适的组以访问卷。

将 Amazon EBS 卷用于非根容器时，请遵循下面的最佳实践：
+ 在容器映像中使用一致的用户 ID（UID）和组 ID（GID），以确保权限一致。
+ 在容器映像中预先创建挂载点目录，并设置合适的所有权和权限。
+ 在开发环境中使用 Amazon EBS 卷测试您的容器，以确认文件系统权限是否按预期工作。
+ 如果同一任务中的多个容器共享一个卷，请确保它们使用兼容的 UID/GID，或者以一致的访问期望挂载卷。

# 在 Amazon ECS 任务定义中将卷配置推迟到启动时间
<a name="specify-ebs-config"></a>

要将 Amazon EBS 卷配置为附加到您的任务，您必须在任务定义中指定卷和挂载点配置和给卷命名。您还必须将 `configuredAtLaunch` 设置为 `true`，因为无法在任务定义中为附加配置 Amazon EBS 卷。反之，在部署期间可配置 Amazon EBS 卷进行附加。

要使用 Amazon Command Line Interface（Amazon CLI）注册任务定义，请将模板另存为 JSON 文件，然后将该文件作为 `[register-task-definition](https://docs.amazonaws.cn/cli/latest/reference/ecs/register-task-definition.html)` 命令的输入传递。

要使用 Amazon Web Services 管理控制台 创建和注册任务定义，请参阅[使用控制台创建 Amazon ECS 任务定义](create-task-definition.md)。

以下任务定义在任务定义中显示 `mountPoints` 和 `volumes` 对象的语法。有关任务定义参数的更多信息，请参阅[Fargate 的 Amazon ECS 任务定义参数](task_definition_parameters.md)。要使用此示例，请将 `user input placeholders` 替换为您自己的信息。

## Linux
<a name="linux-example"></a>

```
{
    "family": "mytaskdef",
    "containerDefinitions": [
        {
            "name": "nginx",
            "image": "public.ecr.aws/nginx/nginx:latest",
            "networkMode": "awsvpc",
           "portMappings": [
                {
                    "name": "nginx-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEBSVolume",
                    "containerPath": "/mount/ebs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEBSVolume",
            "configuredAtLaunch": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE", "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "networkMode": "awsvpc"
}
```

## Windows
<a name="windows-example"></a>

```
{
    "family": "mytaskdef",
     "memory": "4096",
     "cpu": "2048",
    "family": "windows-simple-iis-2019-core",
    "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
    "runtimePlatform": {"operatingSystemFamily": "WINDOWS_SERVER_2019_CORE"},
    "requiresCompatibilities": ["EC2"]
    "containerDefinitions": [
        {
             "command": ["New-Item -Path C:\\inetpub\\wwwroot\\index.html -Type file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>'; C:\\ServiceMonitor.exe w3svc"],
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "essential": true,
            "cpu": 2048,
            "memory": 4096,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "name": "sample_windows_app",
            "portMappings": [
                {
                    "hostPort": 443,
                    "containerPort": 80,
                    "protocol": "tcp"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEBSVolume",
                    "containerPath": "drive:\ebs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEBSVolume",
            "configuredAtLaunch": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE", "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "networkMode": "awsvpc"
}
```

`mountPoints`  
类型：对象数组  
必需：否  
容器中数据卷的挂载点。此参数对应于 create-container Docker API 中的 `Volumes` 和 docker run 命令的 `--volume` 选项。  
Windows 容器可在 `$env:ProgramData` 所在的驱动器上挂载整个目录。Windows 容器无法在其他驱动器上挂载目录，并且挂载点不能跨驱动器使用。您必须指定挂载点才能将 Amazon EBS 卷直接附加到 Amazon ECS 任务。    
`sourceVolume`  
类型：字符串  
必需：是，当使用 `mountPoints` 时  
要挂载的卷的名称。  
`containerPath`  
类型：字符串  
必需：是，当使用 `mountPoints` 时  
挂载卷的容器中的路径。  
`readOnly`  
类型：布尔值  
必需：否  
如果此值为`true`，则容器具有对卷的只读访问权。如果此值为`false`，则容器可对卷进行写入。默认值为 `false`。  
对于在运行 Windows 操作系统的 EC2 实例上运行的任务，请保留默认值 `false`。

`name`  
类型：字符串  
必需：否  
卷的名称。最多允许 255 个字母（大写和小写字母）、数字、连字符（`-`）和下划线（`_`）。此名称已在容器定义 `mountPoints` 对象的 `sourceVolume` 参数中引用。

`configuredAtLaunch`  
类型：布尔值  
必需：是，当您要使用将 EBS 卷直接附加到任务时。  
指定卷在启动时是否可配置。如果设置为 `true`，您可以在运行独立任务或者创建或更新服务时配置卷。如果设置为 `false`，则无法在任务定义中提供其他卷配置。必须提供此参数并将其设置为 `true` 才能将 Amazon EBS 卷配置为附加到一个任务中。

# 加密附加到 Amazon ECS 任务的 Amazon EBS 卷中存储的数据
<a name="ebs-kms-encryption"></a>

您可以使用 Amazon Key Management Service（Amazon KMS）来创建和管理用于保护您的数据的加密密钥。Amazon EBS 卷通过使用 Amazon KMS keys 进行静态加密。将加密以下类型的数据：
+ 在卷上静态存储的数据
+ 磁盘 I/O
+ 从卷中创建的快照
+ 从加密的快照创建的新卷

附加到任务的 Amazon EBS 卷可以通过使用别名为 `alias/aws/ebs` 的默认 Amazon 托管式密钥 或卷配置中指定的对称客户自主管理型密钥进行加密。默认的 Amazon 托管式密钥 对每个 Amazon Web Services 区域 的每个 Amazon Web Services 账户 都是唯一的，并且将自动创建。要创建对称的客户托管密钥，请按照《Amazon KMS 开发人员指南》**的[创建对称加密 KMS 密钥](https://docs.amazonaws.cn/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)中的步骤进行操作。

您可以默认配置 Amazon EBS 加密，以便使用您为账户指定的 KMS 密钥，对创建并附加到特定 Amazon Web Services 区域中的任务的所有新卷进行加密。有关 Amazon EBS 加密和默认加密的更多信息，请参阅《*Amazon EBS 用户指南*》中的 [Amazon EBS encryption](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-encryption.html)。

## Amazon ECS 托管实例行为
<a name="managed-instances"></a>

您可以通过启用加密来加密 Amazon EBS 卷：使用默认加密，或者在创建要加密的卷时启用加密。有关如何默认启用加密（在账户级别）的信息，请参阅《Amazon EBS 用户指南》**中的[默认加密](https://docs.amazonaws.cn/ebs/latest/userguide/encryption-by-default.html)。

您可以配置这些密钥的任意组合。KMS 密钥的优先顺序如下：

1. 卷配置中指定的 KMS 密钥。在卷配置中指定 KMS 密钥时，它会覆盖 Amazon EBS 默认值以及在账户级别指定的任何 KMS 密钥。

1. 在账户级别指定的 KMS 密钥。为 Amazon ECS 托管存储的集群级加密指定 KMS 密钥时，它会覆盖 Amazon EBS 默认加密，但不会覆盖卷配置中指定的任何 KMS 密钥。

1. Amazon EBS 默认加密。当您未指定账户级 KMS 密钥或卷配置中的密钥时，将应用默认加密。如果默认启用 Amazon EBS 加密，则默认值是您默认指定用于加密的 KMS 密钥。否则，默认值是别名为 `alias/aws/ebs` 的 Amazon 托管式密钥。
**注意**  
如果在卷配置中将 `encrypted` 设置为 `false`，不指定账户级 KMS 密钥，并且默认启用 Amazon EBS 加密，则默认情况下，仍将使用为 Amazon EBS 加密指定的密钥对卷进行加密。

## 非 Amazon ECS 托管实例行为
<a name="non-managed-instances"></a>

您还可以在创建或更新集群时为 Amazon ECS 托管存储设置 Amazon ECS 集群级加密。集群级加密在任务级别生效，可用于使用指定的 KMS 密钥加密附加到特定集群中运行的每个任务的 Amazon EBS 卷。有关如何为每个任务在集群级别配置加密的更多信息，请参阅《Amazon ECS API 参考》**中的 [ManagedStorageConfiguration](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_ManagedStorageConfiguration.html)。

您可以配置这些密钥的任意组合。KMS 密钥的优先顺序如下：

1. 卷配置中指定的 KMS 密钥。在卷配置中指定 KMS 密钥时，它会覆盖 Amazon EBS 默认值以及在集群级别指定的任何 KMS 密钥。

1. 在集群级别指定的 KMS 密钥。为 Amazon ECS 托管存储的集群级加密指定 KMS 密钥时，它会覆盖 Amazon EBS 默认加密，但不会覆盖卷配置中指定的任何 KMS 密钥。

1. Amazon EBS 默认加密。当您未指定集群级 KMS 密钥或卷配置中的密钥时，将应用默认加密。如果默认启用 Amazon EBS 加密，则默认值是您默认指定用于加密的 KMS 密钥。否则，默认值是别名为 `alias/aws/ebs` 的 Amazon 托管式密钥。
**注意**  
如果在卷配置中将 `encrypted` 设置为 `false`，不指定集群级 KMS 密钥，并且默认启用 Amazon EBS 加密，则默认情况下，仍将使用为 Amazon EBS 加密指定的密钥对卷进行加密。

## 客户托管的 KMS 密钥策略
<a name="ebs-kms-encryption-policy"></a>

要使用客户自主管理型密钥对附加到任务的 EBS 卷进行加密，您必须配置 KMS 密钥策略，以确保用于卷配置的 IAM 角色拥有使用该密钥的必要权限。密钥策略必须包含 `kms:CreateGrant` 和 `kms:GenerateDataKey*` 权限。`kms:ReEncryptTo` 和 `kms:ReEncryptFrom` 权限是加密使用快照创建的卷所必需的。如果您只想为附加配置和加密新的空卷，您可以排除 `kms:ReEncryptTo` 和 `kms:ReEncryptFrom` 权限。

以下 JSON 代码段显示您可以附加到 KMS 密钥策略的密钥策略语句。使用这些语句将为 Amazon ECS 提供使用该密钥来加密 EBS 卷的权限。要使用策略语句示例，请将 `user input placeholders` 替换为您自己的信息。与往常一样，只配置您需要的权限。

```
{
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": "kms:DescribeKey",
      "Resource":"*"
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": [
      "kms:GenerateDataKey*",
      "kms:ReEncryptTo",
      "kms:ReEncryptFrom"
      ],
      "Resource":"*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "aws_account_id",
          "kms:ViaService": "ec2.region.amazonaws.com"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:ebs:id"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": "kms:CreateGrant",
      "Resource":"*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "aws_account_id",
          "kms:ViaService": "ec2.region.amazonaws.com"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:ebs:id"
        },
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
```

有关密钥策略和权限的更多信息，请参阅《Amazon KMS 开发人员指南》**中的 [Amazon KMS 中的密钥策略](https://docs.amazonaws.cn/kms/latest/developerguide/key-policies.html)和 [Amazon KMS 权限](https://docs.amazonaws.cn/kms/latest/developerguide/kms-api-permissions-reference.html)。要排查与密钥权限相关的 EBS 卷附加问题，请参阅[排查 Amazon ECS 任务挂载 Amazon EBS 卷的问题](troubleshoot-ebs-volumes.md)。

# 指定 Amazon ECS 部署时的 Amazon EBS 卷配置
<a name="configure-ebs-volume"></a>

将 `configuredAtLaunch` 参数设置为 `true` 注册任务定义后，您可以在运行独立任务或创建或更新服务时在部署时配置 Amazon EBS 卷。有关使用 `configuredAtLaunch` 参数将卷配置推迟到启动时间的更多信息，请参阅[在 Amazon ECS 任务定义中将卷配置推迟到启动时间](specify-ebs-config.md)。

要配置卷，您可以使用 Amazon ECS API，也可以将 JSON 文件作为以下 Amazon CLI 命令的输入传递：
+ 运行独立 ECS 任务的 `[run-task](https://docs.amazonaws.cn/cli/latest/reference/ecs/run-task.html)`。
+ 在特定的容器实例中运行独立 ECS 任务的 `[start-task](https://docs.amazonaws.cn/cli/latest/reference/ecs/start-task.html)`。此命令不适用于 Fargate 任务。
+ 创建新的 ECS 服务的 `[create-service](https://docs.amazonaws.cn/cli/latest/reference/ecs/create-service.html)`。
+ 更新现有服务的 `[update-service](https://docs.amazonaws.cn/cli/latest/reference/ecs/update-service.html)`。

**注意**  
要使任务中的容器写入已装载的 Amazon EBS 卷，该容器必须具有适当的文件系统权限。当您在容器定义中指定非根用户时，Amazon ECS 会自动为卷配置基于组的权限，以允许指定的用户读取和写入该卷。如果未指定用户，则容器以根用户身份运行，并拥有对卷的完全访问权限。

 您也可以使用 Amazon Web Services 管理控制台 来配置 Amazon EBS 卷。有关更多信息，请参阅 [将应用程序作为 Amazon ECS 任务运行](standalone-task-create.md)、[创建 Amazon ECS 滚动更新部署](create-service-console-v2.md) 和 [更新 Amazon ECS 服务](update-service-console-v2.md)。

以下 JSON 代码段显示可在部署时配置的 Amazon EBS 卷的所有参数。要使用这些参数进行卷配置，请将 `user input placeholders` 替换为您自己的信息。有关这些参数的更多信息，请参阅[卷配置](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/service_definition_parameters.html#sd-volumeConfigurations)。

```
"volumeConfigurations": [
        {
            "name": "ebs-volume", 
            "managedEBSVolume": {
                "encrypted": true, 
                "kmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", 
                "volumeType": "gp3", 
                "sizeInGiB": 10, 
                "snapshotId": "snap-12345", 
                "volumeInitializationRate":100,
                "iops": 3000, 
                "throughput": 125, 
                "tagSpecifications": [
                    {
                        "resourceType": "volume", 
                        "tags": [
                            {
                                "key": "key1", 
                                "value": "value1"
                            }
                        ], 
                        "propagateTags": "NONE"
                    }
                ], 
                "roleArn": "arn:aws:iam::1111222333:role/ecsInfrastructureRole", 
                 "terminationPolicy": {
                    "deleteOnTermination": true//can't be configured for service-managed tasks, always true 
                },
                "filesystemType": "ext4"
            }
        }
    ]
```

**重要**  
确保您在配置中指定的 `volumeName` 与您在任务定义中指定的 `volumeName` 相同。

有关检查卷附加状态的信息，请参阅[排查 Amazon ECS 任务挂载 Amazon EBS 卷的问题](troubleshoot-ebs-volumes.md)。有关 EBS 卷附加所需的 Amazon ECS 基础设施 Amazon Identity and Access Management（IAM）角色的信息，请参阅[Amazon ECS 基础设施 IAM 角色](infrastructure_IAM_role.md)。

以下是显示 Amazon EBS 卷配置的 JSON 代码段示例。这些示例可以通过将代码段保存在 JSON 文件中并将文件作为 Amazon CLI 命令的参数（使用 `--cli-input-json file://filename` 参数）传递来使用。将 `user input placeholders` 替换为您自己的信息。

## 为独立任务配置卷
<a name="ebs-run-task"></a>

以下代码段显示配置 Amazon EBS 卷以附加到独立任务的语法。以下 JSON 代码段显示配置 `volumeType`、`sizeInGiB`、`encrypted` 和 `kmsKeyId` 设置的语法。JSON 文件中指定的配置用于创建 EBS 卷并将其附加到独立任务。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "volumeConfigurations": [
        {
            "name": "datadir",
            "managedEBSVolume": {
                "volumeType": "gp3",
                "sizeInGiB": 100,
                "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
                "encrypted": true,
                "kmsKeyId": "arn:aws:kms:region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        }
   ]
}
```

## 在创建服务时配置卷
<a name="ebs-create-service"></a>

以下代码段显示配置 Amazon EBS 卷以附加到服务管理的任务的语法。卷来自使用 `snapshotId` 参数指定的快照，速率为 200 MiB/s。JSON 文件中指定的配置用于创建 EBS 卷并将其附加到服务管理的每个任务。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "serviceName": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": [
        {
            "name": "myEbsVolume",
            "managedEBSVolume": {
              "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
              "snapshotId": "snap-12345",
              "volumeInitializationRate": 200
            }
        }
   ]
}
```

## 在更新服务时配置卷
<a name="ebs-update-service"></a>

以下 JSON 代码段显示更新以前未将 Amazon EBS 卷配置为附加到任务的服务的语法。您必须提供任务定义修订的 ARN，其 `configuredAtLaunch` 被设置为 `true`。以下 JSON 代码段显示配置 `volumeType`、`sizeInGiB`、`throughput` 和 `iops` 以及 `filesystemType` 设置的语法。此配置用于创建 EBS 卷并将其附加到服务管理的每个任务。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "service": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": [
        {
            "name": "myEbsVolume",
            "managedEBSVolume": {
              "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
               "volumeType": "gp3",
                "sizeInGiB": 100,
                 "iops": 3000, 
                "throughput": 125, 
                "filesystemType": "ext4"
            }
        }
   ]
}
```

### 将服务配置为不再利用 Amazon EBS 卷
<a name="ebs-service-disable-ebs"></a>

以下 JSON 代码段显示更新服务以不再利用 Amazon EBS 卷的语法。您必须提供 `configuredAtLaunch` 被设置为 `false` 的任务定义的 ARN，或者不带 `configuredAtLaunch` 参数的任务定义。您还必须提供一个空的 `volumeConfigurations` 对象。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "service": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": []
}
```

## Amazon EBS 卷的终止策略
<a name="ebs-volume-termination-policy"></a>

当 Amazon ECS 任务终止时，Amazon ECS 使用 `deleteOnTermination` 值来确定是否应删除与已终止的任务关联的 Amazon EBS 卷。默认情况下，任务终止时，将会删除附加到任务的 EBS 卷。对于独立任务，您可以更改此设置，改为在任务终止时保留卷。

**注意**  
附加到由服务管理的任务的卷不会被保留，并且总是会在任务终止时被删除。

## 标记 Amazon EBS 卷
<a name="ebs-volume-tagging"></a>

您可以使用 `tagSpecifications` 对象标记 Amazon EBS 卷。使用该对象，您可以提供自己的标签，并从任务定义或服务中设置标签的传播，具体取决于卷是附加到一项独立任务还是附加到服务中的某项任务。可以附加到一个卷上的最大标签数为 50。

**重要**  
Amazon ECS 会自动将保留的 `AmazonECSCreated` 和 `AmazonECSManaged` 标签附加到 Amazon EBS 卷中。这意味着您可以控制最多将 48 个其他标签附加到卷的情况。这些附加标签可以是用户定义的、ECS 管理的或传播的标签。

如果您想向卷中添加 Amazon ECS 托管的标签，则必须在 `UpdateService`、`CreateService`、`RunTask` 或 `StartTask` 调用中将 `enableECSManagedTags` 设置为 `true`。如果您启用 Amazon ECS 管理的标签，Amazon ECS 将使用集群和服务信息（`aws:ecs:clusterName` 和 `aws:ecs:serviceName`）自动标记卷。有关标记 Amazon ECS 源的更多信息，请参阅[标记 Amazon ECS 资源](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ecs-using-tags.html)。

以下 JSON 代码段显示使用用户定义的标签标记附加到服务中每个任务的每个 Amazon EBS 卷的语法。要使用此示例创建服务，请将 `user input placeholders` 替换为您自己的信息。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "serviceName": "mysvc",
   "desiredCount": 2,
   "enableECSManagedTags": true,
   "volumeConfigurations": [
        {
            "name": "datadir",
            "managedEBSVolume": {
                "volumeType": "gp3",
                "sizeInGiB": 100,
                 "tagSpecifications": [
                    {
                        "resourceType": "volume", 
                        "tags": [
                            {
                                "key": "key1", 
                                "value": "value1"
                            }
                        ], 
                        "propagateTags": "NONE"
                    }
                ],
                "roleArn":"arn:aws:iam:1111222333:role/ecsInfrastructureRole",
                "encrypted": true,
                "kmsKeyId": "arn:aws:kms:region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        }
   ]
}
```

**重要**  
您必须指定 `volume` 资源类型来标记 Amazon EBS 卷。

# Fargate 按需任务的 Amazon EBS 卷的性能
<a name="ebs-fargate-performance-limits"></a>

可用于 Fargate 按需任务的基准 Amazon EBS 卷 IOPS 和吞吐量取决于您为任务请求的总 CPU 单位数。如果您为 Fargate 任务请求 0.25、0.5 或 1 个虚拟 CPU 单位（vCPU），建议您配置通用型 SSD 卷（`gp2` 或 `gp3`）或硬盘驱动器（HDD）卷（`st1` 或 `sc1`）。如果您为 Fargate 任务请求 1 个以上 vCPU，则以下基准性能限制适用于附加到该任务的 Amazon EBS 卷。您可能会暂时获得比以下限制更高的 EBS 性能。但是，建议您根据这些限制来计划工作负载。


| 请求的 CPU 单位数（以 vCPU 为单位） | 基准 Amazon EBS IOPS（16 KiB I/O） | 基准 Amazon EBS 吞吐量（以 MiBps 为单位，128 KiB I/O） | 基准带宽（以 Mbps 为单位） | 
| --- | --- | --- | --- | 
| 2 | 3000 | 75 | 360 | 
| 4 | 5000 | 120 | 1,150 | 
| 8 | 10000 | 250 | 2,300 | 
| 16 | 15000 | 500 | 4,500 | 

**注意**  
 当您配置 Amazon EBS 卷以附加到 Fargate 任务时，Fargate 任务的 Amazon EBS 性能限制将在任务的临时存储和附加的卷之间共享。

# EC2 任务的 Amazon EBS 卷的性能
<a name="ebs-fargate-performance-limits-ec2"></a>

Amazon EBS 提供卷类型，各种类型性能特点和价格不同，因此您可根据应用程序要求定制您所需的存储性能和相应成本。有关性能的信息，包括每个卷的 IOPS 和每个卷的吞吐量，请参阅《Amazon Elastic Block Store 用户指南》中的 [Amazon EBS volume types](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-volume-types.html)**。

# Amazon ECS 托管实例任务的 Amazon EBS 卷的性能
<a name="ebs-managed-instances-performance"></a>

Amazon EBS 提供卷类型，各种类型性能特点和价格不同，因此您可根据应用程序要求定制您所需的存储性能和相应成本。有关性能的信息，包括每个卷的 IOPS 和每个卷的吞吐量，请参阅《Amazon Elastic Block Store 用户指南》中的 [Amazon EBS volume types](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-volume-types.html)**。

# 排查 Amazon ECS 任务挂载 Amazon EBS 卷的问题
<a name="troubleshoot-ebs-volumes"></a>

您可能需要对 Amazon EBS 卷与 Amazon ECS 任务的连接进行问题排查或验证。

## 检查卷附加状态
<a name="troubleshoot-ebs-volumes-location"></a>

您可以使用 Amazon Web Services 管理控制台 来查看 Amazon EBS 卷附加到 Amazon ECS 任务的状态。如果任务开始但附加失败，则您还会看到一个状态原因，可以用它来进行故障排除。创建的卷将被删除，且任务将停止。有关状态原因的更多信息，请参阅 [Amazon EBS 卷附加到 Amazon ECS 任务的状态原因](troubleshoot-ebs-volumes-scenarios.md)。

**要使用控制台查看卷的附加状态和状态原因**

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

1. 在**集群**页面上，选择您的任务在其中运行的集群。此时会显示集群的详细信息页面。

1. 在集群的详细信息页面上，选择**任务**选项卡。

1. 选择要查看其卷挂载状态的任务。如果要检查的任务已停止，则可能需要使用**筛选所需状态**并选择**已停止**。

1. 在任务的详细信息页面上，选择**卷**选项卡。您将能够在**附加状态**下看到 Amazon EBS 卷的附加状态。如果卷无法附加到任务，则可以在**附加状态**下选择状态以显示失败原因。

您还可以使用 [DescribeTasks](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_DescribeTasks.html) API 查看任务的卷附加状态和关联的状态原因。

## 服务和任务失败
<a name="service-task-failures"></a>

您可能会遇到非特定于 Amazon EBS 卷的服务或任务故障，这些故障可能会影响卷附加。有关更多信息，请参阅 
+ [服务事件消息](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/service-event-messages.html)
+ [已停止的任务错误代码](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/stopped-task-error-codes.html)
+ [API 失败原因](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/api_failures_messages.html)

# 容器无法写入 Amazon EBS 卷
<a name="troubleshoot-non-root-container"></a>

没有适当权限的非根用户  
当您在容器定义中指定非根用户时，Amazon ECS 会自动为卷配置基于组的权限，以允许写入访问。但是，如果您仍然遇到权限问题：  
+ 使用格式 `uid:gid`（例如 `1001:1001`）验证容器定义中是否正确指定了 `user` 参数。
+ 确保在挂载卷后，您的容器映像不会覆盖用户权限。
+ 通过检查容器日志或使用 Amazon ECS Exec 检查正在运行的容器，检查您的应用程序是否以预期用户 ID 运行。

有权限问题的根用户  
如果在容器定义中没有指定用户，则容器将以根用户身份运行，并且应拥有对卷的完全访问权限。如果遇到问题：  
+ 通过检查容器内的挂载点，验证卷是否已正确挂载。
+ 确保未在挂载点配置中将该卷配置为只读。

具有不同用户的多容器任务  
在多个容器以不同用户身份运行的任务中，Amazon ECS 会自动管理组权限，以允许所有指定用户写入卷。如果容器无法写入：  
+ 验证所有需要写入权限的容器是否都正确配置了 `user` 参数。
+ 检查所有需要访问该卷的容器是否都已正确挂载该卷。

有关在容器定义中配置用户的更多信息，请参阅 [Fargate 的 Amazon ECS 任务定义参数](https://docs.amazonaws.cn/./task_definition_parameters.html)。

# Amazon EBS 卷附加到 Amazon ECS 任务的状态原因
<a name="troubleshoot-ebs-volumes-scenarios"></a>

使用以下参考来修复您在配置 Amazon EBS 卷以附加到 Amazon ECS 任务时，在 Amazon Web Services 管理控制台 中可能遇到的以状态原因形式出现的问题。有关在控制台中查找这些状态原因的更多信息，请参阅[检查卷附加状态](troubleshoot-ebs-volumes.md#troubleshoot-ebs-volumes-location)。

ECS 无法担任配置的 ECS 基础设施角色“arn:aws:iam::*111122223333*:role/*ecsInfrastructureRole*”。请确认传递的角色与 Amazon ECS 之间存在适当的信任关系  
此状态原因显示在以下场景中。  
+  您提供没有附加必要的信任策略的 IAM 角色。如果 Amazon ECS 基础设施 IAM 角色没有必要的信任策略，则 Amazon ECS 无法访问该角色。任务可能会卡在 `DEPROVISIONING` 状态。有关必要信任策略的更多信息，请参阅[Amazon ECS 基础设施 IAM 角色](infrastructure_IAM_role.md)。
+ 您的 IAM 用户无权将 Amazon ECS 基础设施角色传递给 Amazon ECS。任务可能会卡在 `DEPROVISIONING` 状态。为避免出现此问题，您可以将 `PassRole` 权限附加到您的用户。有关更多信息，请参阅 [Amazon ECS 基础设施 IAM 角色](infrastructure_IAM_role.md)。
+ 您的 IAM 角色没有附加 Amazon EBS 卷的必要权限。任务可能会卡在 `DEPROVISIONING` 状态。有关将 Amazon EBS 卷附加到任务所需的特定权限的更多信息，请参阅[Amazon ECS 基础设施 IAM 角色](infrastructure_IAM_role.md)。
您也可能会因角色传播延迟看到此错误消息。如果在等待几分钟后重试使用该角色仍无法解决问题，则可能错误地配置了角色的信任策略。

ECS 未能设置 EBS 卷。遇到 IdempotentParameterMismatch”；“您提供的客户端令牌与已删除的资源相关联。请使用其他客户端令牌。”  
以下 Amazon KMS 密钥场景可能会导致出现 `IdempotentParameterMismatch` 消息：  
+ 您指定的 KMS 密钥 ARN、ID 或别名无效。在这种情况下，任务可能看起来成功启动，但由于 Amazon 对 KMS 密钥进行了异步身份验证，因此任务最终会失败。有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EBS 加密](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-encryption.html)。
+ 您提供的客户托管密钥缺少允许 Amazon ECS 基础设施 IAM 角色使用该密钥进行加密的权限。为避免出现密钥策略权限问题，请参阅 [Amazon EBS 卷的数据加密](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-kms-encryption)中的 Amazon KMS 密钥策略示例。
您可以将 Amazon EventBridge 设置为向目标（例如 Amazon CloudWatch 组）发送 Amazon EBS 卷事件和 Amazon ECS 任务状态更改事件。然后，您可以使用这些事件来识别影响卷附加的特定客户托管密钥相关问题。有关更多信息，请参阅   
+  Amazon re:Post 上的[如何创建 CloudWatch 日志组以用作 EventBridge 规则的目标？](https://repost.aws/knowledge-center/cloudwatch-log-group-eventbridge)。
+ [任务状态更改事件](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ecs_cwe_events.html#ecs_task_events)。
+ 《Amazon EBS 用户指南》中的 [Amazon EventBridge events for Amazon EBS](https://docs.amazonaws.cn/ebs/latest/userguide/ebs-cloud-watch-events.html)**。

在配置 EBS 卷到任务的附加时，ECS 超时。  
以下文件系统格式场景将产生此消息。  
+ 您在配置期间指定的文件系统格式与[任务的操作系统](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_RuntimePlatform.html)不兼容。
+ 您将 Amazon EBS 卷配置为从快照中创建，但快照的文件系统格式与任务的操作系统不兼容。对于从快照创建的卷，必须指定创建快照时卷使用的相同文件系统类型。
您可以利用 Amazon ECS 容器代理日志对 EC2 任务的此消息进行问题排查。有关更多信息，请参阅 [Amazon ECS 日志文件位置](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/logs.html)和 [Amazon ECS 日志收集器](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/ecs-logs-collector.html)。