问题与标题相同,我想知道一个角色是否可以扮演另一个角色。
例如: 角色A:由外部账户信任的角色,具有可以扮演任何角色的策略。 角色B:由A扮演,也具有可以扮演角色C的策略。 角色C:具有访问S3存储桶的策略。
问题与标题相同,我想知道一个角色是否可以扮演另一个角色。
例如: 角色A:由外部账户信任的角色,具有可以扮演任何角色的策略。 角色B:由A扮演,也具有可以扮演角色C的策略。 角色C:具有访问S3存储桶的策略。
是的,您可以创建扮演其他角色的角色。此过程称为角色链接:
当您使用 AWS CLI 或 API 通过一个角色来扮演第二个角色时,就会发生角色链接。
需要记住的关键一点是,一旦 A 扮演 B 的角色,A 的所有权限都会暂时丧失,角色 B 的有效权限将生效。因此,角色 A、B 和 C 的权限不会相加。
s3
,iam
。-注意:AWS默认在child_organization_accounts上创建了一个名为AWSControlTowerExecution
的角色,请参阅AWS文档。
如何使用AWS Boto3 API进行角色链接:
def get_role_client_credentials(session,
session_name,
role_arn,
external_id=""):
client = session.client('sts')
if external_id:
assumed_role = client.assume_role(RoleArn=role_arn,
RoleSessionName=session_name,
ExternalId=external_id)
else:
assumed_role = client.assume_role(RoleArn=role_arn,
RoleSessionName=session_name)
return assumed_role['Credentials']
def get_assumed_client(session,
client_name,
role_arn,
session_name,
region,
external_id=""):
credentials = get_role_client_credentials(session=session,
session_name=session_name,
role_arn=role_arn,
external_id=external_id)
return session.client(client_name,
region_name=region,
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'])
#### Role Chaining ######
def get_role_session_credentials(session,
session_name,
role_arn,
external_id=""):
client = session.client('sts')
if external_id:
assumed_role = client.assume_role(RoleArn=role_arn,
RoleSessionName=session_name,
ExternalId=external_id)
else:
assumed_role = client.assume_role(RoleArn=role_arn,
RoleSessionName=session_name)
return assumed_role['Credentials']
def get_assumed_role_session(session,
role_arn,
session_name,
region,
external_id=""):
credentials = get_role_session_credentials(session,
session_name=session_name,
role_arn=role_arn,
external_id=external_id)
return boto3.session.Session(
region_name=region,
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken']
)
- 使用上述辅助函数的方法:
role_A_arn = f"arn:aws:iam::{second_target_account_id}:role/RoleA"
assumed_Role_A_session = get_assumed_role_session(session, role_A_arn,
default_session_name, region, external_id="")
role_B_arn = f"arn:aws:iam::{third_target_account_id}:role/RoleB"
assumed_Role_B_client = get_assumed_client(assumed_Role_A_session, 's3', role_B_arn, different_session_name, region, external_id="")
assumed_Role_B_client.create_bucket(Bucket='testing-bucket',
CreateBucketConfiguration={
'LocationConstraint': f'{region}'
})