diff --git a/knowledge base/cloud computing/aws/ecs.md b/knowledge base/cloud computing/aws/ecs.md index 830e986..24034b7 100644 --- a/knowledge base/cloud computing/aws/ecs.md +++ b/knowledge base/cloud computing/aws/ecs.md @@ -1,11 +1,32 @@ # Elastic Container Service 1. [TL;DR](#tldr) +1. [Resource constraints](#resource-constraints) +1. [Volumes](#volumes) + 1. [EBS](#ebs) +1. [Troubleshooting](#troubleshooting) + 1. [Invalid 'cpu' setting for task](#invalid-cpu-setting-for-task) 1. [Further readings](#further-readings) 1. [Sources](#sources) ## TL;DR +The basic unit of a deployment is a _task_.
+Tasks are a logical construct that model and run one or more containers. Containers **cannot** run by themselves on ECS. + +ECS runs tasks as two different launch types: + +- On EC2 instances that one owns, manages, and pays for. +- Using Fargate, technically a serverless environment for containers. + +Unless otherwise restricted and capped, containers get access to all the CPU and memory capacity available on the host +running it. + +Unless otherwise protected and guaranteed, all containers running on a given host share CPU, memory, and other resources +in the same way other processes running on that host share those resources. + +By default, containers behave like other Linux processes with respect to access to resources like CPU and memory. +
Usage @@ -87,6 +108,105 @@ while [[ $(aws ecs list-tasks --query 'taskArns' --output 'text' --cluster 'test
+## Resource constraints + +ECS uses the CPU period and the CPU quota to control the task's CPU **hard** limits **as a whole**.
+When specifying CPU values in task definitions, ECS translates that value to the CPU period and CPU quota settings that +apply to the cgroup running **all** the containers in the task. + +The CPU quota controls the amount of CPU time granted to a cgroup during a given CPU period. Both settings are expressed +in terms of microseconds.
+When the CPU quota equals the CPU period, a cgroup can execute up to 100% on one vCPU (or any other fraction that totals +to 100% for multiple vCPUs). The CPU quota has a maximum of 1000000us, and the CPU period has a minimum of 1ms. +Use these values to set the limits for the tasks' CPU count. + +When changing the CPU period with**out** changing the CPU quota, the task will have different effective limits than what +is specified in the task definition. + +The 100ms period allows for vCPUs ranging from 0.125 to 10. + +Task-level CPU and memory parameters are ignored for Windows containers. + +The `cpu` value must be expressed in _CPU units_ or _vCPUs_.
+_vCPUs_ are converted to _CPU units_ when task definitions are registered. + +The `memory` value can be expressed in _MiB_ or _GB_.
+_GB_s are converted to _MiB_ when tasks definitions are registered. + +These fields are optional for tasks hosted on EC2.
+Such tasks support CPU values between 0.25 and 10 vCPUs. these fields are optional + +Task definitions specifying `FARGATE` as value for the `requiresCompatibilities` attribute, **even if they also specify +the `EC2` value**, **are required** to set both settings **and** to set them to one of the couples specified in the +table.
+Fargate task definitions support **only** those specific values for tasks' CPU and memory. + +| CPU units | vCPUs | Memory values | Supported OSes | Notes | +| --------- | ----- | ------------------------------------------- | -------------- | -------------------------------- | +| 256 | .25 | 512 MiB, 1 GB, or 2 GB | Linux | | +| 512 | .5 | Between 1 GB and 4 GB in 1 GB increments | Linux | | +| 1024 | 1 | Between 2 GB and 8 GB in 1 GB increments | Linux, Windows | | +| 2048 | 2 | Between 4 GB and 16 GB in 1 GB increments | Linux, Windows | | +| 4096 | 4 | Between 8 GB and 30 GB in 1 GB increments | Linux, Windows | | +| 8192 | 8 | Between 16 GB and 60 GB in 4 GB increments | Linux | Requires Linux platform >= 1.4.0 | +| 16384 | 16 | Between 32 GB and 120 GB in 8 GB increments | Linux | Requires Linux platform >= 1.4.0 | + +The task's settings are **separate** from the CPU and memory values that can be defined at the container definition +level.
+Should both a container-level `memory` and `memoryReservation` value be set, the `memory` value **must be higher** than +the `memoryReservation` value.
+If specifying `memoryReservation`, that value is guaranteed to the container and subtracted from the available memory +resources for the container instance that the container is placed on. Otherwise, the value of `memory` is used. + +## Volumes + +### EBS + +Refer [Use Amazon EBS volumes with Amazon ECS]. + +One can attach **at most one** EBS volume to each ECS task, and it **must be a new volume**.
+One **cannot** attach existing EBS volume to tasks. However, one _can_ configure a new EBS volume at deployment to use +the snapshot of an existing volume as starting point. + +Provisioning volumes from snapshots of EBS volumes that contains partitions is **not** supported. + +EBS volumes can be configured at deployment **only** for services that use the _rolling update_ deployment type **and** +the _Replica_ scheduling strategy. + +Containers in a task will be able to write to the mounted EBS volume **only** if the container runs as the `root` user. + +ECS automatically adds the `AmazonECSCreated` and `AmazonECSManaged` reserved tags to attached volumes.
+Should one remove these tags from the volumes, ECS won't be able to manage it anymore. + +Volumes attached to tasks which are managed by a service are **not** preserved, and are **always** deleted upon task's +termination. + +One **cannot** configure EBS volumes for attachment to ECS tasks running on AWS Outposts. + +## Troubleshooting + +### Invalid 'cpu' setting for task + +
+ Cause + +One specified an invalid `cpu` or `memory` value for the task when registering a task definition using ECS's API or the +AWS CLI. + +Should the task definition specify `FARGATE` as value for the `requiresCompatibilities` attribute, the resource values +must be one of the specific pairs supported by Fargate. + +
+ +
+ Solution + +Specify a supported value for the task CPU and memory in your task definition. + +
+ +Refer [Troubleshoot Amazon ECS task definition invalid CPU or memory errors] and [Resource constraints]. + ## Further readings - [Amazon Web Services] @@ -99,12 +219,20 @@ while [[ $(aws ecs list-tasks --query 'taskArns' --output 'text' --cluster 'test - [Identity and Access Management for Amazon Elastic Container Service] - [Amazon ECS task role] - [How Amazon Elastic Container Service works with IAM] +- [Troubleshoot Amazon ECS task definition invalid CPU or memory errors] +- [Use Amazon EBS volumes with Amazon ECS] +- [Attach EBS volume to AWS ECS Fargate] +- [Guide to Using Amazon EBS with Amazon ECS and AWS Fargate] +- [How Amazon ECS manages CPU and memory resources] + +[resource constraints]: #resource-constraints + [amazon web services]: README.md [cli]: cli.md @@ -112,6 +240,13 @@ while [[ $(aws ecs list-tasks --query 'taskArns' --output 'text' --cluster 'test [amazon ecs task lifecycle]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle-explanation.html [amazon ecs task role]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html +[how amazon ecs manages cpu and memory resources]: https://aws.amazon.com/blogs/containers/how-amazon-ecs-manages-cpu-and-memory-resources/ [how amazon elastic container service works with iam]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security_iam_service-with-iam.html [identity and access management for amazon elastic container service]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam.html [troubleshoot amazon ecs deployment issues]: https://docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting-ecs.html +[troubleshoot amazon ecs task definition invalid cpu or memory errors]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-cpu-memory-error.html +[use amazon ebs volumes with amazon ecs]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html + + +[attach ebs volume to aws ecs fargate]: https://medium.com/@shujaatsscripts/attach-ebs-volume-to-aws-ecs-fargate-e23fea7bb1a7 +[guide to using amazon ebs with amazon ecs and aws fargate]: https://stackpioneers.com/2024/01/12/guide-to-using-amazon-ebs-with-amazon-ecs-and-aws-fargate/