

# Cómo coloca Amazon ECS las tareas en las instancias de contenedor
<a name="task-placement"></a>

Puede usar la ubicación de tareas para configurar Amazon ECS de manera que coloque sus tareas en instancias de contenedor que cumplan ciertos requisitos, por ejemplo, una zona de disponibilidad o un tipo de instancia.

Los siguientes son componentes de ubicación de tareas:
+ Estrategia de ubicación de tareas: el algoritmo para seleccionar instancias de contenedor para ubicación de tareas o tareas para terminación. Por ejemplo, Amazon ECS puede seleccionar las instancias de contenedor de manera aleatoria o de modo que las tareas se distribuyan de forma uniforme entre un grupo de instancias.
+ Grupo de tareas: grupo de tareas relacionadas, por ejemplo, tareas de bases de datos.
+ Restricción de ubicación de tareas: se trata de reglas que se deben cumplir para colocar una tarea en una instancia de contenedor. Si no se cumple la restricción, la tarea no se desplegará y permanecerá en el estado `PENDING`. Por ejemplo, puede utilizar una restricción para colocar tareas únicamente en un tipo de instancia concreto. 

Amazon ECS tiene diferentes algoritmos para las distintas opciones de capacidad. 

## Instancias administradas de Amazon ECS
<a name="managed-instances-launch-type"></a>

En el caso de las tareas que se pongan en marcha en instancias administradas de Amazon ECS, Amazon ECS debe determinar dónde se colocará la tarea y, al reducir verticalmente el recuento de tareas, qué tareas se finalizarán. Amazon ECS toma esta decisión en función de los requisitos de instancia especificados en la plantilla de inicialización del proveedor de capacidad, los requisitos especificados en la definición de la tarea, como la CPU y la memoria, y las restricciones de ubicación de tareas.

**nota**  
Instancias administradas de Amazon ECS no es compatible con las estrategias de ubicación de tareas. Amazon ECS hará todo lo posible para distribuir las tareas entre las zonas de disponibilidad accesibles.

Cuando Amazon ECS ubica las tareas, utiliza este proceso para seleccionar instancias de contenedor:

1. Identificar las instancias de contenedor que satisfacen los requisitos de CPU, GPU, memoria y puerto en la definición de tareas.

1. Identificar las instancias de contenedor que satisfacen las restricciones de ubicación de tareas.

1. Identificar las instancias de contenedor que satisfacen los requisitos de instancia especificados en la plantilla de inicialización del proveedor de capacidad.

1. Seleccionar las instancias de contenedor para ubicación de tareas.

## EC2
<a name="ec2-launch-type"></a>

Para las tareas que utilizan el tipo de lanzamiento de EC2, Amazon ECS debe determinar dónde se colocará la tarea en función de los requisitos especificados en la definición de la tarea, como la CPU y la memoria. Del mismo modo, cuando se reduce la escala del número de tareas, Amazon ECS debe determinar qué tareas debe terminar. Puede aplicar estrategias y restricciones de ubicación de tareas para personalizar la manera en la que Amazon ECS ubica y termina las tareas. 

Las estrategias de ubicación de tareas por defecto dependen de si ejecuta las tareas manualmente (tareas independientes) o dentro de un servicio. Para las tareas que se ejecutan como parte de un servicio de Amazon ECS, la estrategia de ubicación de tareas es `spread` mediante `attribute:ecs.availability-zone`. No existe una restricción de ubicación de tareas predeterminada para las tareas que no están en los servicios. Para obtener más información, consulte [Programación de los contenedores en Amazon ECS](scheduling_tasks.md).

**nota**  
Las estrategias de ubicación de tareas se realizan en la medida de lo posible. Amazon ECS sigue intentando ubicar tareas, incluso cuando la opción de ubicación más adecuada no está disponible. Sin embargo, las restricciones de ubicación de tareas son vinculantes, y pueden impedir la ubicación de tareas. 

Puede utilizar juntas estrategias y restricciones de ubicación de tareas. Por ejemplo, puede utilizar una estrategia de ubicación de tareas y una delimitación de ubicación de tareas para distribuir tareas entre las zonas de disponibilidad y agruparlas en bin packing en función de la memoria de cada zona de disponibilidad, pero únicamente si se trata de instancias G2.

Cuando Amazon ECS ubica las tareas, utiliza este proceso para seleccionar instancias de contenedor:

1. Identificar las instancias de contenedor que satisfacen los requisitos de CPU, GPU, memoria y puerto en la definición de tareas.

1. Identificar las instancias de contenedor que satisfacen las restricciones de ubicación de tareas.

1. Identificar las instancias de contenedor que satisfacen las estrategias de ubicación de tareas.

1. Seleccionar las instancias de contenedor para ubicación de tareas.

## Fargate
<a name="fargate-launch-type"></a>

No se admiten las estrategias ni las restricciones de ubicación de tareas para tareas que utilizan Fargate. Fargate hará todo lo posible para distribuir las tareas entre las zonas de disponibilidad accesibles. Si el proveedor de capacidad incluye Fargate y Fargate Spot, el comportamiento de distribución es independiente para cada proveedor de capacidad. 

# Escalado automático y ubicación de tareas de instancias administradas de Amazon ECS
<a name="managed-instance-auto-scaling"></a>

Instancias administradas de Amazon ECS utiliza algoritmos inteligentes para escalar automáticamente la capacidad del clúster y colocar las tareas de manera eficiente en toda la infraestructura. Entender cómo funcionan estos algoritmos lo ayuda a optimizar las configuraciones de los servicios y a solucionar problemas de comportamiento de ubicación.

## Algoritmo de ubicación de tareas
<a name="managed-instance-task-placement-algorithm"></a>

Instancias administradas de Amazon ECS utiliza un algoritmo de ubicación sofisticado que equilibra la disponibilidad, la utilización de los recursos y los requisitos de la red al programar tareas.

### Distribución por zonas de disponibilidad
<a name="managed-instance-az-spread-behavior"></a>

De forma predeterminada, instancias administradas de Amazon ECS prioriza la disponibilidad al distribuir las tareas entre varias zonas de disponibilidad:
+ En el caso de los servicios con varias tareas, instancias administradas de Amazon ECS garantiza la distribución en al menos tres instancias en diferentes zonas de disponibilidad siempre que sea posible
+ Este comportamiento proporciona tolerancia a errores, pero puede provocar una menor utilización de los recursos por instancia
+ La distribución por zonas de disponibilidad tiene prioridad sobre la optimización del empaquetado de contenedores

### Comportamiento del empaquetado de contenedores
<a name="managed-instance-bin-packing"></a>

Si bien instancias administradas de Amazon ECS puede empaquetar en contenedores para maximizar el uso de los recursos, este comportamiento depende de la configuración de la red:
+ Para realizar el empaquetado de contenedores, configure el servicio para que utilice una única subred
+ Las configuraciones de varias subredes priorizan la distribución de las zonas de disponibilidad por encima de la densidad de los recursos
+ Es más probable que se empaqueten contenedores durante la inicialización inicial del servicio que durante los eventos de escalado

### Consideraciones sobre la densidad de ENI
<a name="managed-instance-eni-density"></a>

En el caso de los servicios que utilizan el modo de red `awsvpc`, instancias administradas de Amazon ECS tiene en cuenta la densidad de la interfaz de red elástica (ENI) al tomar decisiones sobre la ubicación:
+ Cada tarea del modo `awsvpc` requiere una ENI específica
+ Los tipos de instancias tienen diferentes límites de ENI que afectan a la densidad de tareas
+ Instancias administradas de Amazon ECS tiene en cuenta la disponibilidad de ENI al seleccionar las instancias de destino

**nota**  
Continuamente se realizan mejoras en los cálculos de densidad de ENI para optimizar las decisiones de ubicación.

## Lógica de decisiones del proveedor de capacidad
<a name="managed-instance-capacity-provider-decisions"></a>

Los proveedores de capacidad de instancias administradas de Amazon ECS toman decisiones sobre el escalado y la ubicación en función de varios factores:

Requisitos de recursos  
Requisitos de CPU, memoria y red de las tareas pendientes

Disponibilidad de instancias  
Capacidad y utilización actuales en las instancias existentes

Restricciones de red  
Configuración de subred y disponibilidad de ENI

Distribución de zonas de disponibilidad  
Mantenimiento de la tolerancia a errores en varias zonas de disponibilidad

## Opciones de configuración
<a name="managed-instance-configuration-options"></a>

### Estrategia de selección de subredes
<a name="managed-instance-subnet-strategy"></a>

La configuración de subred afecta significativamente al comportamiento de ubicación de tareas:

Varias subredes (predeterminado)  
Prioriza la distribución por zonas de disponibilidad para lograr una alta disponibilidad  
Puede resultar en una menor utilización de los recursos por instancia  
Se recomienda para las cargas de trabajo de producción que necesitan tolerancia a errores

Subred única  
Permite el empaquetado de contenedores para una mayor utilización de los recursos  
Reduce la tolerancia a errores al concentrar las tareas en una zona de disponibilidad  
Adecuado para las cargas de trabajo de desarrollo o con optimización de costos

### Consideraciones sobre el modo de red
<a name="managed-instance-network-mode-considerations"></a>

El modo de red que elija afecta a las decisiones de ubicación:
+ Modo `awsvpc`: cada tarea requiere una ENI específica, lo que limita la densidad de tareas por instancia
+ Modo `host`: las tareas utilizan la red del host directamente, y su ubicación depende principalmente de la disponibilidad de los recursos

### Consideraciones sobre la arquitectura de CPU
<a name="managed-instance-cpu-architecture-considerations"></a>

El valor de `cpuArchitecture` que especifique en la definición de la tarea se utiliza para colocar las tareas en una arquitectura específica. Si no especifica un valor para `cpuArchitecture`, Amazon ECS intentará colocar las tareas en cualquier arquitectura de CPU disponible en función de la configuración del proveedor de capacidad. Puede especificar `X86_64` o `ARM64`.

## Resolución de problemas relacionados con la ubicación de tareas
<a name="managed-instance-troubleshooting-placement"></a>

### Patrones de ubicación comunes
<a name="managed-instance-common-placement-patterns"></a>

Comprender los patrones de ubicación esperados ayuda a distinguir el comportamiento normal de los posibles problemas:

Distribución repartida  
Tareas distribuidas en varias instancias con un uso parcial  
Comportamiento normal cuando se utilizan varias subredes  
Indica que se prioriza la disponibilidad por encima de la eficiencia de los recursos

Ubicación concentrada  
Varias tareas asignadas a un menor número de instancias con una mayor utilización  
Se espera cuando se utiliza una configuración de subred única  
Puede producirse durante el lanzamiento inicial del servicio

Distribución desigual  
Algunas instancias se utilizan mucho, mientras que otras permanecen infrautilizadas  
Puede indicar límites de ENI o restricciones de recursos  
Considere la posibilidad de revisar los tipos de instancias y la configuración de la red

### Optimización del comportamiento de ubicación
<a name="managed-instance-placement-optimization"></a>

Para optimizar la ubicación de las tareas en función de los requisitos específicos:

1. Evalúe los requisitos de disponibilidad según las necesidades de optimización de costos

1. Elija la configuración de subred adecuada según sus prioridades

1. Seleccione los tipos de instancias con la capacidad de ENI adecuada para su modo de red

1. Supervise los patrones de ubicación y ajuste la configuración según sea necesario

## Prácticas recomendadas
<a name="managed-instance-best-practices"></a>
+ **Para las cargas de trabajo de producción**: utilice varias subredes en diferentes zonas de disponibilidad para garantizar una alta disponibilidad y acepte la compensación en la utilización de los recursos
+ **Para el desarrollo o las pruebas**: considere la posibilidad de configurar una sola subred para maximizar la utilización de los recursos y reducir los costos
+ **Para el modo `awsvpc`**: elija tipos de instancias que tengan suficiente capacidad de ENI para evitar restricciones de ubicación
+ **Para la optimización de costos**: supervise los patrones de utilización y ajuste la configuración del servicio para equilibrar la disponibilidad y la eficiencia
+ **Para la solución de problemas**: revise la configuración de la subred y el modo de red cuando investigue patrones de ubicación inesperados

# Uso de estrategias para definir la ubicación de las tareas de Amazon ECS
<a name="task-placement-strategies"></a>

Para las tareas que utilizan el tipo de lanzamiento de EC2, Amazon ECS debe determinar dónde se colocará la tarea en función de los requisitos especificados en la definición de la tarea, como la CPU y la memoria. Del mismo modo, cuando se reduce la escala del número de tareas, Amazon ECS debe determinar qué tareas debe terminar. Puede aplicar estrategias y restricciones de ubicación de tareas para personalizar la manera en la que Amazon ECS ubica y termina las tareas. 

Las estrategias de ubicación de tareas por defecto dependen de si ejecuta las tareas manualmente (tareas independientes) o dentro de un servicio. Para las tareas que se ejecutan como parte de un servicio de Amazon ECS, la estrategia de ubicación de tareas es `spread` mediante `attribute:ecs.availability-zone`. No existe una restricción de ubicación de tareas predeterminada para las tareas que no están en los servicios. Para obtener más información, consulte [Programación de los contenedores en Amazon ECS](scheduling_tasks.md).

**nota**  
Las estrategias de ubicación de tareas se realizan en la medida de lo posible. Amazon ECS sigue intentando ubicar tareas, incluso cuando la opción de ubicación más adecuada no está disponible. Sin embargo, las restricciones de ubicación de tareas son vinculantes, y pueden impedir la ubicación de tareas. 

Puede utilizar juntas estrategias y restricciones de ubicación de tareas. Por ejemplo, puede utilizar una estrategia de ubicación de tareas y una delimitación de ubicación de tareas para distribuir tareas entre las zonas de disponibilidad y agruparlas en bin packing en función de la memoria de cada zona de disponibilidad, pero únicamente si se trata de instancias G2.

Cuando Amazon ECS ubica las tareas, utiliza este proceso para seleccionar instancias de contenedor:

1. Identificar las instancias de contenedor que satisfacen los requisitos de CPU, GPU, memoria y puerto en la definición de tareas.

1. Identificar las instancias de contenedor que satisfacen las restricciones de ubicación de tareas.

1. Identificar las instancias de contenedor que satisfacen las estrategias de ubicación de tareas.

1. Seleccionar las instancias de contenedor para ubicación de tareas.

Las estrategias de ubicación de tareas se especifican en la definición del servicio o en la definición de la tarea mediante el parámetro `placementStrategy`.

```
"placementStrategy": [
    {
        "field": "The field to apply the placement strategy against",
        "type": "The placement strategy to use"
    }
]
```

Puede especificar las estrategias al ejecutar una tarea ([RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)), crear un nuevo servicio ([CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html)) o actualizar un servicio existente ([UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)).

En la tabla siguiente, se describen los tipos y campos disponibles.


| tipo | Valores de campo válidos | 
| --- | --- | 
| binpack Las tareas se colocan en instancias de contenedor para dejar la menor cantidad de CPU o memoria sin usar. Esta estrategia minimiza el número de instancias de contenedor en uso. Cuando se utiliza esta estrategia y se realiza una acción de reducción horizontal, Amazon ECS termina las tareas. Lo hace en función de la cantidad de recursos que quedan en la instancia del contenedor una vez terminada la tarea. La instancia de contenedor que tenga la mayor cantidad de recursos disponibles después de la terminación de la tarea hace que esa tarea termine. |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 
| random Las tareas se colocan aleatoriamente. | No se utiliza | 
| spreadLas tareas se colocan uniformemente en función del valor especificado. Las tareas de servicio se distribuyen en función de las tareas de dicho servicio. Las tareas independientes se distribuyen en función de las tareas del mismo grupo de tareas. Para obtener más información acerca de los grupos de tareas, consulte [Agrupación de tareas relacionadas con Amazon ECS](task-groups.md). Cuando se utiliza la estrategia `spread` y se realiza una acción de reducción horizontal, Amazon ECS selecciona las tareas que mantienen un balance entre las zonas de disponibilidad para terminarlas. Dentro de una zona de disponibilidad, las tareas se seleccionan de manera aleatoria. |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 

Las estrategias de colocación de tareas también se pueden actualizar para los servicios existentes. Para obtener más información, consulte [Cómo coloca Amazon ECS las tareas en las instancias de contenedor](task-placement.md).

Puede crear una estrategia de ubicación de tareas que utilice varias estrategias mediante la creación de conjuntos de estrategias en el orden en que desee que se realicen. Por ejemplo, si desea distribuir las tareas entre las zonas de disponibilidad y, a continuación, agrupar las tareas en función de la memoria de cada zona de disponibilidad, especifique la estrategia de la zona de disponibilidad seguida de la estrategia de memoria. Para ver ejemplos de estrategias, consulte [Ejemplo de estrategias de ubicación de tareas de Amazon ECS](strategy-examples.md).

# Ejemplo de estrategias de ubicación de tareas de Amazon ECS
<a name="strategy-examples"></a>

Puede especificar estrategias de ubicación de tarea con las acciones siguientes: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html) y [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html).

**Topics**
+ [Distribuir las tareas de manera uniforme entre zonas de disponibilidad](#even-az)
+ [Distribuir las tareas de manera uniforme en todas las instancias](#even-instance)
+ [Agrupar tareas en bin packing en función de la memoria](#binpack)
+ [Ubicar las tareas de forma aleatoria](#random)
+ [Distribuir las tareas de forma uniforme en las zonas de disponibilidad y, a continuación, distribuir las tareas de forma uniforme entre las instancias dentro de cada zona de disponibilidad](#az-instance)
+ [Distribuir las tareas de forma uniforme en las zonas de disponibilidad y, a continuación, agrupar en bin packing las tareas en función de la memoria dentro de cada zona de disponibilidad](#az-memory)
+ [Distribuir las tareas de manera uniforme entre las instancias y, a continuación, agrupar las tareas en bin packing según la memoria](#instance-memory)

## Distribuir las tareas de manera uniforme entre zonas de disponibilidad
<a name="even-az"></a>

La estrategia siguiente distribuye las tareas de forma uniforme entre las zonas de disponibilidad.

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]
```

## Distribuir las tareas de manera uniforme en todas las instancias
<a name="even-instance"></a>

La estrategia siguiente distribuye las tareas de forma uniforme entre todas las instancias.

```
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```

## Agrupar tareas en bin packing en función de la memoria
<a name="binpack"></a>

La estrategia siguiente agrupa las tareas en bin packing en función de la memoria.

```
"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## Ubicar las tareas de forma aleatoria
<a name="random"></a>

La siguiente estrategia ubica las tareas aleatoriamente.

```
"placementStrategy": [
    {
        "type": "random"
    }
]
```

## Distribuir las tareas de forma uniforme en las zonas de disponibilidad y, a continuación, distribuir las tareas de forma uniforme entre las instancias dentro de cada zona de disponibilidad
<a name="az-instance"></a>

La siguiente estrategia distribuye las tareas de forma uniforme en las zonas de disponibilidad y, a continuación, distribuye las tareas de forma uniforme entre las instancias dentro de cada zona de disponibilidad.

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```

## Distribuir las tareas de forma uniforme en las zonas de disponibilidad y, a continuación, agrupar en bin packing las tareas en función de la memoria dentro de cada zona de disponibilidad
<a name="az-memory"></a>

La siguiente estrategia distribuye las tareas de forma uniforme en las zonas de disponibilidad y, a continuación, agrupa en bin packing las tareas en función de la memoria dentro de cada zona de disponibilidad.

```
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

## Distribuir las tareas de manera uniforme entre las instancias y, a continuación, agrupar las tareas en bin packing según la memoria
<a name="instance-memory"></a>

La siguiente estrategia distribuye las tareas de manera uniforme en todas las instancias y, a continuación, agrupa las tareas en bin packing en función de la memoria de cada instancia. 

```
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]
```

# Agrupación de tareas relacionadas con Amazon ECS
<a name="task-groups"></a>

Puede identificar un conjunto de tareas relacionadas y colocarlas en un grupo de tareas. Todas las tareas con el mismo nombre de grupo de tareas se consideran un conjunto cuando se utiliza la estrategia de ubicación de tareas `spread`. Por ejemplo, suponga que está ejecutando distintas aplicaciones en un clúster, tales como bases de datos y servidores web. Para asegurarse de que las bases de datos estén balanceadas en las zonas de disponibilidad, agréguelas a un grupo de tareas con el nombre `databases` y, a continuación, utilice la estrategia de ubicación de tareas `spread`. Para obtener más información, consulte [Uso de estrategias para definir la ubicación de las tareas de Amazon ECS](task-placement-strategies.md).

Los grupos de tareas también se pueden utilizar como restricción de ubicación de tareas. Al especificar un grupo de tareas en la restricción `memberOf`, las tareas solo se envían a instancias de contenedores que se encuentran en el grupo de tareas especificado. Para ver un ejemplo, consulta [Ejemplos de restricciones para ubicación de tareas de Amazon ECS](constraint-examples.md).

De forma predeterminada, las tareas independientes utilizan el nombre de familia de definición de tareas (por ejemplo, `family:my-task-definition`) como nombre del grupo de tareas si no se especifica un nombre de grupo de tareas personalizado. Las tareas lanzadas como parte de un servicio utilizan el nombre del servicio como nombre del grupo de tareas y no se pueden cambiar.

Se aplican los siguientes requisitos para el grupo de tareas.
+ Un nombre de grupo de tareas debe tener 255 caracteres o menos.
+ Cada tarea puede estar exactamente en un grupo.
+ Después de lanzar una tarea, no puede modificar su grupo de tarea.

# Definición de las instancias de contenedor que utiliza Amazon ECS para las tareas
<a name="task-placement-constraints"></a>

Una restricción de ubicación de tareas es una regla sobre una instancia de contenedor que Amazon ECS utiliza para determinar si la tarea puede ejecutarse en la instancia. Al menos una instancia de contenedor debe cumplir con la restricción. Si no hay instancias que coincidan con la restricción, la tarea permanece en un estado `PENDING`. Cuando crea un servicio nuevo o actualiza uno existente, puede especificar las restricciones de ubicación de tareas para las tareas del servicio. 

Puede especificar las restricciones de ubicación de tareas en la definición del servicio, la definición de la tarea o la tarea mediante el parámetro `placementConstraint`.

```
"placementConstraints": [
    {
        "expression": "The expression that defines the task placement constraints",
        "type": "The placement constraint type to use"
    }
]
```

En la tabla siguiente, se describe cómo usar los parámetros.


| Constraint type (Tipo de restricción) | Se puede especificar cuándo | 
| --- | --- | 
| distinctInstanceColoque cada tarea activa en una instancia de contenedor distinta.Amazon ECS analiza el estado deseado de las tareas para su colocación. Por ejemplo, si el estado deseado de la tarea existente es `STOPPED` (pero el último estado no lo es), se puede colocar una nueva tarea entrante en la misma instancia a pesar de la restricción de ubicación de `distinctInstance`. Por lo tanto, es posible que vea 2 tareas con el último estado de `RUNNING` en la misma instancia. Recomendamos que los clientes que buscan un aislamiento sólido para sus tareas utilicen Fargate. Fargate ejecuta cada tarea en un entorno de virtualización de hardware. Esto garantiza que estas cargas de trabajo en contenedores no compartan interfaces de red, almacenamiento efímero de Fargate, CPU o memoria con otras tareas. Para obtener más información, consulte [Security Overview of AWS Fargate](https://d1.awsstatic.com/whitepapers/AWS_Fargate_Security_Overview_Whitepaper.pdf). |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/task-placement-constraints.html)  | 
| memberOfColocar tareas en instancias de contenedor que satisfacen una expresión.  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AmazonECS/latest/developerguide/task-placement-constraints.html) | 

Cuando utiliza el tipo de restricción `memberOf`, puede crear una expresión mediante el lenguaje de consulta de clústeres que define las instancias de contenedor en las que Amazon ECS puede colocar tareas. La expresión es una forma de agrupar las instancias de contenedor por atributos. La expresión se incluye en el `expression `parámetro de `placementConstraint`.

## Atributos de instancias de contenedor de Amazon ECS
<a name="attributes"></a>

Puede añadir metadatos personalizados a sus instancias de contenedor, conocidas como *atributos*. Cada atributo tiene un nombre y un valor de cadena opcional. Puede utilizar los atributos integrados que ofrece Amazon ECS o definir atributos personalizados.

Las secciones siguientes contienen ejemplos de atributos integrados, opcionales y personalizados.

### Atributos integrados
<a name="ecs-automatic-attributes"></a>

Amazon ECS aplica automáticamente los siguientes atributos a las instancias de contenedor.

`ecs.ami-id`  
El ID de la AMI utilizada para iniciar la instancia. Un valor de ejemplo para este atributo es `ami-1234abcd`.

`ecs.availability-zone`  
La zona de disponibilidad de la instancia. Un valor de ejemplo para este atributo es `us-east-1a`.

`ecs.instance-type`  
El tipo de instancia de la instancia. Un valor de ejemplo para este atributo es `g2.2xlarge`.

`ecs.os-type`  
El sistema operativo de la instancia. Los valores posibles para este atributo son `linux` y `windows`.

`ecs.os-family`  
La versión del sistema operativo de la instancia.  
Para las instancias de Linux, el valor válido es `LINUX`. Para las instancias de Windows, ECS establece el valor en el formato `WINDOWS_SERVER_<OS_Release>_<FULL or CORE>`. Los valores válidos son `WINDOWS_SERVER_2022_FULL`, `WINDOWS_SERVER_2022_CORE`, `WINDOWS_SERVER_20H2_CORE`, `WINDOWS_SERVER_2019_FULL`, `WINDOWS_SERVER_2019_CORE` y `WINDOWS_SERVER_2016_FULL`.  
Esto es importante para los contenedores de Windows y Windows containers on AWS Fargate porque la versión del sistema operativo de cada contenedor de Windows debe coincidir con la del host. Si la versión de Windows de la imagen del contenedor es diferente a la del host, el contenedor no se inicia. Para obtener más información, consulte [Compatibilidad de versiones de contenedores Windows](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility?tabs=windows-server-2022%2Cwindows-11) en el sitio web de documentación de Microsoft.  
Si el clúster ejecuta varias versiones de Windows, puede asegurarse de que la tarea se coloque en una instancia de EC2 que se ejecute en la misma versión mediante la restricción de ubicación: `memberOf(attribute:ecs.os-family == WINDOWS_SERVER_<OS_Release>_<FULL or CORE>)`. Para obtener más información, consulte [Recuperación de metadatos de las AMI de Windows optimizadas para Amazon ECS](retrieve-ecs-optimized_windows_AMI.md).

`ecs.cpu-architecture`  
La arquitectura de CPU de la instancia. Los valores de ejemplo para este atributo son `x86_64` y `arm64`.

`ecs.vpc-id`  
La VPC en la que se lanzó la instancia. Un valor de ejemplo para este atributo es `vpc-1234abcd`.

`ecs.subnet-id`  
La subred que está utilizando la instancia. Un valor de ejemplo para este atributo es `subnet-1234abcd`.

**nota**  
Instancias administradas de Amazon ECS admite el siguiente subconjunto de atributos:  
`ecs.subnet-id`
`ecs.availability-zone`
`ecs.instance-type`
`ecs.cpu-architecture`

### Atributos opcionales
<a name="ecs-optional-attributes"></a>

Amazon ECS puede agregar los siguientes atributos a las instancias de contenedor.

`ecs.awsvpc-trunk-id`  
Si este atributo existe, la instancia tiene una interfaz de red troncal. Para obtener más información, consulte [Aumento de las interfaces de red de instancias de contenedor de Linux de Amazon ECS](container-instance-eni.md).

`ecs.outpost-arn`  
Si este atributo existe, contiene el nombre de recurso de Amazon (ARN) del Outpost. Para obtener más información, consulte [Amazon Elastic Container Service en AWS Outposts](using-outposts.md).

`ecs.capability.external`  
Si este atributo existe, la instancia se identifica como instancia externa. Para obtener más información, consulte [Clústeres de Amazon ECS para instancias externas](ecs-anywhere.md).

### Custom attributes (Atributos personalizados)
<a name="ecs-custom-attributes"></a>

Puede aplicar atributos personalizados a sus instancias de contenedor. Por ejemplo, puede definir un atributo con el nombre "stack" y un valor "prod".

Al especificar atributos personalizados, se deben tener en cuenta los siguientes aspectos.
+ El `name` debe contener entre 1 y 128 caracteres, que pueden ser letras (mayúsculas y minúsculas), números, guiones, guiones bajos, barras diagonales, barras invertidas o puntos.
+ El `value` debe contener entre 1 y 128 caracteres, que pueden ser letras (mayúsculas y minúsculas), números, guiones, guiones bajos, puntos, signos de arroba (@), barras diagonales, barras invertidas, dos puntos o espacios. El valor no puede contener ningún espacio en blanco inicial ni final.

# Creación de expresiones para definir instancias de contenedor para las tareas de Amazon ECS
<a name="cluster-query-language"></a>

Las consultas de clúster son expresiones que permiten agrupar objetos. Por ejemplo, puede agrupar instancias de contenedor por atributos tales como zona de disponibilidad, tipo de instancia o metadatos personalizados. Para obtener más información, consulte [Atributos de instancias de contenedor de Amazon ECS](task-placement-constraints.md#attributes).

Después de haber definido un grupo de instancias de contenedor, puede personalizar Amazon ECS para que ubique tareas en instancias de contenedor basadas en grupo. Para obtener más información, consulte [Ejecución de una aplicación como tarea de Amazon ECS](standalone-task-create.md) y [Creación de una implementación de actualización continua de Amazon ECS](create-service-console-v2.md). También puede aplicar un filtro de grupo al mostrar una lista de instancias de contenedor.

## Sintaxis de expresiones
<a name="expression-syntax"></a>

Las expresiones tienen la siguiente sintaxis:

```
subject operator [argument]
```

**Asunto**  
El atributo o campo que se va a evaluar.

`agentConnected`  
Seleccione instancias de contenedor por el estado de conexión del agente de contenedor de Amazon ECS. Puede utilizar este filtro para buscar las instancias cuyos agentes de contenedor están desconectados.  
Los operadores válidos son: equals (==), not\$1equals (\$1=), in, not\$1in (\$1in), matches (=\$1), not\$1matches (\$1\$1)

`agentVersion`  
Seleccione instancias de contenedor según la versión del agente de contenedor de Amazon ECS. Puede utilizar este filtro para buscar las instancias que ejecutan versiones obsoletas del agente de contenedor de Amazon ECS.  
Los operadores válidos son: equals (==), not\$1equals (\$1=), greater\$1than (>), greater\$1than\$1equal (>=), less\$1than (<), less\$1than\$1equal (<=)

`attribute:attribute-name`  
Selecciona instancias de contenedor según el atributo. Para obtener más información, consulte [Atributos de instancias de contenedor de Amazon ECS](task-placement-constraints.md#attributes).

`ec2InstanceId`  
Seleccione instancias de contenedor por el ID de las instancias de Amazon EC2.  
Los operadores válidos son: equals (==), not\$1equals (\$1=), in, not\$1in (\$1in), matches (=\$1), not\$1matches (\$1\$1)

`registeredAt`  
Selecciona instancias de contenedor por la fecha de registro de la instancia de contenedor. Puede utilizar este filtro para encontrar las instancias que se acaban de registrar o las instancias que son muy antiguas.  
Los operadores válidos son: equals (==), not\$1equals (\$1=), greater\$1than (>), greater\$1than\$1equal (>=), less\$1than (<), less\$1than\$1equal (<=)  
Los formatos de fecha válidos son: 2018-06-18T22:28:28\$100:00, 2018-06-18T22:28:28Z, 2018-06-18T22:28:28, 2018-06-18

`runningTasksCount`  
Selecciona instancias de contenedor según el número de tareas en ejecución. Puede utilizar este filtro para encontrar las instancias que estén vacías o casi vacías (con pocas tareas en ejecución).  
Los operadores válidos son: equals (==), not\$1equals (\$1=), greater\$1than (>), greater\$1than\$1equal (>=), less\$1than (<), less\$1than\$1equal (<=)

`task:group`  
Selecciona instancias de contenedor según el grupo de tareas. Para obtener más información, consulte [Agrupación de tareas relacionadas con Amazon ECS](task-groups.md).

**Operador**  
El operador de comparación. Se admiten los siguientes operadores.


|  Operador  |  Descripción  | 
| --- | --- | 
|  ==, equals  |  Igualdad de cadena  | 
|  \$1=, not\$1equals  |  Desigualdad de cadena  | 
|  >, greater\$1than  |  Mayor que  | 
|  >=, greater\$1than\$1equal  |  Mayor o igual que  | 
|  <, less\$1than  |  Menor que  | 
|  <=, less\$1than\$1equal  |  Menor o igual que  | 
|  exists  |  El asunto existe  | 
|  \$1exists, not\$1exists  |  El asunto no existe  | 
|  in  |  El valor está en la lista de argumentos  | 
|  \$1in, not\$1in  |  El valor no está en la lista de argumentos  | 
|  =\$1, matches  |  Coincidencia de patrón  | 
|  \$1\$1, not\$1matches  |  No hay coincidencia de patrón  | 

**nota**  
Una expresión única no puede contener paréntesis. Sin embargo, se pueden utilizar paréntesis para especificar la prioridad en las expresiones compuestas.

**Argumento**  
Para muchos operadores, el argumento es un valor literal.

Los operadores `in` y `not_in` esperan una lista de argumentos como argumento. Una lista de argumentos se especifica del siguiente modo:

```
[argument1, argument2, ..., argumentN]
```

Los operadores matches y not\$1matches esperan un argumento que se ajuste a la sintaxis de la expresión regular Java. Para obtener más información, consulte [java.util.regex.Pattern](http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html).

**Expresiones compuestas**

Puede combinar expresiones utilizando los siguientes operadores booleanos:
+ &&, y
+ \$1\$1, o bien
+ \$1, not

Puede especificar prioridad utilizando paréntesis:

```
(expression1 or expression2) and expression3
```

## Expresiones de ejemplo
<a name="expression-examples"></a>

A continuación se incluyen expresiones de ejemplo.

**Ejemplo: igualdad de cadena**  
La expresión siguiente selecciona las instancias con el tipo de instancia especificado.

```
attribute:ecs.instance-type == t2.small
```

**Ejemplo: lista de argumentos**  
La expresión siguiente selecciona las instancias en la zona de disponibilidad us-east-1a o us-east-1b.

```
attribute:ecs.availability-zone in [us-east-1a, us-east-1b]
```

**Ejemplo: expresiones compuestas**  
La siguiente expresión selecciona las instancias G2 que no están en la zona de disponibilidad us-east-1d.

```
attribute:ecs.instance-type =~ g2.* and attribute:ecs.availability-zone != us-east-1d
```

**Ejemplo: afinidad de tareas**  
La expresión siguiente selecciona las instancias que alojan tareas en el grupo `service:production`.

```
task:group == service:production
```

**Ejemplo: antiafinidad de tareas**  
La siguiente expresión selecciona las instancias que no alojan tareas en el grupo de base de datos.

```
not(task:group == database)
```

**Ejemplo: Recuento de tareas en ejecución**  
La expresión siguiente selecciona las instancias que solo están ejecutando una tarea.

```
runningTasksCount == 1
```

**Ejemplo: versión del agente de contenedor de Amazon ECS**  
La expresión siguiente selecciona las instancias que están ejecutando una versión del agente de contenedor anterior a la 1.14.5.

```
agentVersion < 1.14.5
```

**Ejemplo: Hora de registro de las instancias**  
La expresión siguiente selecciona las instancias que se han registrado antes del 13 de febrero de 2018.

```
registeredAt < 2018-02-13
```

**Ejemplo: ID de instancias de Amazon EC2**  
Esta expresión selecciona las instancias con los siguientes ID de instancias de Amazon EC2.

```
ec2InstanceId in ['i-abcd1234', 'i-wxyx7890']
```

# Ejemplos de restricciones para ubicación de tareas de Amazon ECS
<a name="constraint-examples"></a>

A continuación, se muestran ejemplos de restricción de ubicación de tareas.

En este ejemplo, se utiliza la restricción `memberOf` para colocar tareas en instancias t2. Se puede especificar con las acciones siguientes: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html), [RegisterTaskDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html) y [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html).

```
"placementConstraints": [
    {
        "expression": "attribute:ecs.instance-type =~ t2.*",
        "type": "memberOf"
    }
]
```

En el ejemplo, se utiliza la restricción `memberOf` para ubicar tareas de réplica en instancias con otras tareas en el grupo de tareas `daemon-service` del servicio de daemon, respetando las estrategias de ubicación de tareas que también se especifican. Esta restricción garantiza que las tareas del servicio de daemon se coloquen en la instancia de EC2 antes que las tareas del servicio de réplica.

Sustituya `daemon-service` por el nombre del servicio de daemon.

```
"placementConstraints": [
    {
        "expression": "task:group == service:daemon-service",
        "type": "memberOf"
    }
]
```

En el ejemplo, se utiliza la restricción `memberOf` para ubicar tareas en instancias con otras tareas en el grupo de tareas `databases`, respetando las estrategias de ubicación de tareas que también se especifiquen. Para obtener más información acerca de los grupos de tareas, consulte [Agrupación de tareas relacionadas con Amazon ECS](task-groups.md). Se puede especificar con las acciones siguientes: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html), [RegisterTaskDefinition](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterTaskDefinition.html) y [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html).

```
"placementConstraints": [
    {
        "expression": "task:group == databases",
        "type": "memberOf"
    }
]
```

La restricción `distinctInstance` ubica cada tarea del grupo en una instancia diferente. Se puede especificar mediante las siguientes acciones: [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html), [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html) y [RunTask](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html)

Amazon ECS analiza el estado deseado de las tareas para su colocación. Por ejemplo, si el estado deseado de la tarea existente es `STOPPED` (pero el último estado no lo es), se puede colocar una nueva tarea entrante en la misma instancia a pesar de la restricción de ubicación de `distinctInstance`. Por lo tanto, es posible que vea 2 tareas con el último estado de `RUNNING` en la misma instancia.

```
"placementConstraints": [
    {
        "type": "distinctInstance"
    }
]
```