Amazon ECS task IAM role
Your Amazon ECS tasks can have an IAM role associated with them. The permissions granted in the IAM role are assumed by the containers running in the task. This role allows your application code (on the container) to use other AWS services. The task role is required when your application accesses other AWS services, such as Amazon S3. For the IAM permissions that Amazon ECS needs to pull container images and run the task, see Amazon ECS task execution IAM role.
The following are the benefits of using task roles:
-
Credential Isolation: A container can only retrieve credentials for the IAM role that is defined in the task definition to which it belongs; a container never has access to credentials that are intended for another container that belongs to another task.
-
Authorization: Unauthorized containers cannot access IAM role credentials defined for other tasks.
-
Auditing: Access and event logging is available through CloudTrail to ensure retrospective auditing. Task credentials have a context of
taskArn
that is attached to the session, so CloudTrail logs show which task is using which role.
Note
When you specify an IAM role for a task, the AWS CLI or other SDKs in the containers for that task use the AWS credentials provided by the task role exclusively and they no longer inherit any IAM permissions from the Amazon EC2 or external instance they are running on.
Creating the task IAM role
When creating an IAM policy for your tasks to use, the policy must include the permissions that you want the containers in your tasks to assume. You can use an existing AWS managed policy, or you can create a custom policy from scratch that meets your specific needs. For more information, see Creating IAM policies in the IAM User Guide.
Important
For Amazon ECS tasks (for all launch types), we recommend that you use the IAM policy
and role for your tasks. These credentials allow your task to make AWS API
requests without calling sts:AssumeRole
to assume the same role that is
already associated with the task. If your task requires that a role assumes itself,
you must create a trust policy that explicitly allows that role to assume itself.
For more information, see Updating a role trust policy in the IAM User Guide.
After the IAM policy is created, you can create an IAM role which includes that policy which you reference in your Amazon ECS task definition. You can create the role using the Elastic Container Service Task use case in the IAM console. Then, you can attach your specific IAM policy to the role that gives the containers in your task the permissions you desire. The procedures below describe how to do this.
If you have multiple task definitions or services that require IAM permissions, you should consider creating a role for each specific task definition or service with the minimum required permissions for the tasks to operate so that you can minimize the access that you provide for each task.
For information about the service endpoint for your Region, see Service endpoints in the Amazon Web Services General Reference Guide.
The IAM task role must have a trust policy that specifies the
ecs-tasks.amazonaws.com
service. The sts:AssumeRole
permission allows your tasks to assume an IAM role that's different from the one that
the Amazon EC2 instance uses. This way, your task doesn't inherit the role associated with
the Amazon EC2 instance. The following is an example trust policy. Replace the Region
identifier and specify the AWS account number that you use when launching
tasks.
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:
us-west-2
:111122223333
:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333
" } } } ] }
Important
When creating your task IAM role, it is recommended that you use the
aws:SourceAccount
or aws:SourceArn
condition keys in
either the trust relationship or the IAM policy associated with the role to scope
the permissions further to prevent the confused deputy security issue. Using the
aws:SourceArn
condition key to specify a specific cluster is not
currently supported, you should use the wildcard to specify all clusters. To learn
more about the confused deputy problem and how to protect your AWS account, see
The
confused deputy problem in the
IAM User Guide.
The following procedures describe how to create a policy to retrieve objects from Amazon S3
with an example policy. Replace all user input
with your own
values.
The following procedures describe how to create a task IAM role by attaching an IAM policy that you create.
After you create the role, add additional permissions to the role for the following features.
Feature | Additional permissions |
---|---|
Use ECS Exec |
|
Use EC2 instances (Windows and Linux) | |
Use external instances | |
Use Windows EC2 instances |
ECS Exec permissions
The ECS Exec feature requires a task IAM role to grant containers the
permissions needed for communication between the managed SSM agent
(execute-command
agent) and the SSM service. You should add the
following permissions to a task IAM role and include the task IAM role in your task
definition. For more information, see Adding and
Removing IAM Policies in the IAM User Guide.
Use the following policy for your task IAM role to add the required SSM permissions.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
Amazon EC2 instances additional configuration
We recommend that you limit the permissions in your container instance role to the
minimal list of permissions used in the AmazonEC2ContainerServiceforEC2Role
managed IAM policy.
Your Amazon EC2 instances require at least version 1.11.0
of the container
agent to use task role; however, we recommend using the latest container agent version.
For information about checking your agent version and updating to the latest version,
see Updating the Amazon ECS container agent. If you use an
Amazon ECS-optimized AMI, your instance needs at least 1.11.0-1
of the
ecs-init
package. If your instances are using the latest
Amazon ECS-optimized AMI, then they contain the required versions of the container agent and
ecs-init
. For more information, see Amazon ECS-optimized Linux AMIs.
If you are not using the Amazon ECS-optimized AMI for your container instances, add the
--net=host
option to your docker run command that
starts the agent and the following agent configuration variables for your desired
configuration (for more information, see Amazon ECS container agent configuration):
ECS_ENABLE_TASK_IAM_ROLE=true
-
Uses IAM roles for tasks for containers with the
bridge
anddefault
network modes. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
Uses IAM roles for tasks for containers with the
host
network mode. This variable is only supported on agent versions 1.12.0 and later.
For an example run command, see Manually updating the Amazon ECS container agent (for non-Amazon ECS-Optimized AMIs). You will also need to set the following networking commands on your container instance so that the containers in your tasks can retrieve their AWS credentials:
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
You must save these iptables rules on your container instance for them to survive a reboot. You can use the iptables-save and iptables-restore commands to save your iptables rules and restore them at boot. For more information, consult your specific operating system documentation.
To prevent containers run by tasks that use the awsvpc
network mode from
accessing the credential information supplied to the Amazon EC2 instance profile, while still
allowing the permissions that are provided by the task role, set the
ECS_AWSVPC_BLOCK_IMDS
agent configuration variable to true
in the agent configuration file and restart the agent. For more information, see Amazon ECS container agent configuration.
To prevent containers run by tasks that use the bridge
network mode from
accessing the credential information supplied to the Amazon EC2 instance profile, while still
allowing the permissions that are provided by the task role, by running the following
iptables command on your Amazon EC2 instances. This command doesn't
affect containers in tasks that use the host
or awsvpc
network
modes. For more information, see Network mode.
-
sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP
You must save this iptables rule on your Amazon EC2 instance for it to survive a reboot. When using the Amazon ECS-optimized AMI, you can use the following command. For other operating systems, consult the documentation for that operating system.
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
External instance additional configuration
Your external instances require at least version 1.11.0
of the container
agent to use task IAM roles; however, we recommend using the latest container agent
version. For information about checking your agent version and updating to the latest
version, see Updating the Amazon ECS container agent. If you
are using an Amazon ECS-optimized AMI, your instance needs at least 1.11.0-1
of
the ecs-init
package. If your instances are using the latest
Amazon ECS-optimized AMI, then they contain the required versions of the container agent and
ecs-init
. For more information, see Amazon ECS-optimized Linux AMIs.
If you are not using the Amazon ECS-optimized AMI for your container instances, add the
--net=host
option to your docker run command that
starts the agent and the following agent configuration variables for your desired
configuration (for more information, see Amazon ECS container agent configuration):
ECS_ENABLE_TASK_IAM_ROLE=true
-
Uses IAM roles for tasks for containers with the
bridge
anddefault
network modes. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
Uses IAM roles for tasks for containers with the
host
network mode. This variable is only supported on agent versions 1.12.0 and later.
For an example run command, see Manually updating the Amazon ECS container agent (for non-Amazon ECS-Optimized AMIs). You will also need to set the following networking commands on your container instance so that the containers in your tasks can retrieve their AWS credentials:
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
You must save these iptables rules on your container instance for them to survive a reboot. You can use the iptables-save and iptables-restore commands to save your iptables rules and restore them at boot. For more information, consult your specific operating system documentation.
Amazon EC2 Windows instance additional configuration
Important
This applies only to Windows containers on EC2 that use task roles.
The task role with Windows features requires additional configuration on EC2.
-
When you launch your container instances, you must set the
-EnableTaskIAMRole
option in the container instances user data script. TheEnableTaskIAMRole
turns on the Task IAM roles feature for the tasks. For example:<powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster '
windows
' -EnableTaskIAMRole </powershell> -
You must bootstrap your container with the networking commands that are provided in Amazon ECS container bootstrap script.
-
You must create an IAM role and policy for your tasks. For more information, see Creating the task IAM role.
-
The IAM roles for the task credential provider use port 80 on the container instance. Therefore, if you configure IAM roles for tasks on your container instance, your containers can't use port 80 for the host port in any port mappings. To expose your containers on port 80, we recommend configuring a service for them that uses load balancing. You can use port 80 on the load balancer. By doing so, traffic can be routed to another host port on your container instances. For more information, see Use load balancing to distribute Amazon ECS service traffic.
-
If your Windows instance is restarted, you must delete the proxy interface and initialize the Amazon ECS container agent again to bring the credential proxy back up.
Amazon ECS container bootstrap script
Before containers can access the credential proxy on the container instance to get credentials, the container must be bootstrapped with the required networking commands. The following code example script should be run on your containers when they start.
Note
You do not need to run this script when you use awsvpc
network mode
on Windows.
If you run Windows containers which include Powershell, then use the following script:
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. $gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop $ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API
If you run Windows containers that only have the Command shell, then use the following script:
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. for /f "tokens=1" %i in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i for /f "tokens=3" %i in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API