Besides IAM users, some AWS services can also assume roles. Here is the example of granting assume role permission to a EC2 instance.
The scenario is that I have two accounts:
- In account A, I created a role (e.g RoleForB) to trust account B, and add a IAM policy to allow it to perform some read operations in account A. e.g ReadOnlyAccess
- In account B, I created a role (e.g AssumeRoleInA) and add the policy to allow it to assume the role that is created in account A.
- Associate a EC2 instance to the IAM role (AssumeRoleInA)
Let’s have a look at the configurations:
In account A, it builds the trust to account B by creating the role named RoleForB and attaching ReadOnlyAccess permission.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::Account_B_ID:root"}, "Action": "sts:AssumeRole" } }
In account B, create a role named AssumeRoleInA then add a policy to allow it to assume the role named RoleForB in account A.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::Account_A_ID:role/RoleForB" ] } ] }
Create a new EC2 instance, and associate it with the IAM role named AssumeRoleInA.
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "ec2.amazonaws.com"}, "Action": "sts:AssumeRole" } }
Now login into this instance to assume the role in Account A. The following command will return the the access key, secret key and security token.
aws sts assume-role --role-arn "arn:aws:iam::Account_A_ID:role/RoleForB" --role-session-name "EC2FromB"
Thank you for sharing your elegant solution. Worked for me as a charm to update production route53 and load balancer from build server in dev account.
You did great man! Absolutely perfect.