Я согласен с Джоном в использовании ролей iam для управления доступом. Вы можете расширить это, используя только роли вместо пользователей, если вы запускаете свой сценарий из lambda.
Чтобы продолжить, вам понадобятся два типа ролей iam: целевые роли и исходная роль.
Целевая роль
Целевые роли будут жить в каждой учетной записи. Эта роль должна иметь разрешения, которые будут приняты исходной ролью.
Роль источника
Роль источника будет находиться в учетной записи, к которой вы хотите иметь доступ ко всем другим учетным записям. Эта роль должна иметь разрешение на принятие других ролей. Соответствующее действие iam: sts:AssumeRole
.
Код
Ниже я привел код, который использовал в прошлом. Обычно я помещаю этот код в лямбду, которая находится в учетной записи, которая может управлять другими учетными записями, такими как SharedServices или DevOps. Возможно, вы захотите обратиться к boto3 документации для предположения роли.
import boto3
def role_arn_to_session(**args):
client = boto3.client('sts')
response = client.assume_role(**args)
return boto3.Session(
aws_access_key_id=response['Credentials']['AccessKeyId'],
aws_secret_access_key=response['Credentials']['SecretAccessKey'],
aws_session_token=response['Credentials']['SessionToken'])
# This decides what role to use, a name of the session you will start, and potentially an external id.
# The external id can be used as a passcode to protect your role.
def set_boto3_clients(accountId):
return role_arn_to_session(
RoleArn='arn:aws:iam::' + accountId + ':role/TargetRole',
RoleSessionName='AssumeTargetRole',
ExternalId=os.environ['ExternalId']
)
def handler(event, context):
for accountId in accountList:
boto3InDifferentAccount = setup_client(accountId)
# You can then use this boto3InDifferentAccount as if you are using boto in another account
# For example: s3 = boto3InDifferentAccount.client('s3')
runScriptInAccount(boto3InDifferentAccount)
Примечание: при использовании такого предположения роли вам нужно будет настроить, как долго вы можете предполагать роль. По умолчанию это 3600 секунд, но вы можете изменить это, изменив подтверждение целевой роли и параметры вызова предположения.