使用boto3和Python如何创建可供其他角色使用的AWS MFA授权会话

时间:2018-02-03 19:13:23

标签: python amazon-web-services boto boto3

SCENARIO

我有两个AWS账户链接到第三个aws账户,即主账户。 例如,帐户名称为aws_acc_mainaws_acc_1aws_acc_2

aws_main用于维护其他两个帐户的用户,组和角色。但是,除了IAM之外,主帐户中没有使用其他服务。

使用boto3Python我希望获得帐户1和帐户2的ec2个实例

AWS配置如下:

.aws /凭证文件

[aws_acc_main]
aws_access_key_id=AKJFJHNUCTYUUAPW
aws_secret_access_key = 2uldfr94tuowjuHUKbnBIby8jhfdgjh

.aws /配置

[aws_acc_main]
output = json
region = eu-west-2

[profile aws_acc_1]
source_profile = aws_acc_main
output = json
region = eu-west-2
role_arn = arn:aws:iam::111111111111:role/ACC1_ROLE
mfa_serial = arn:aws:iam::111111111110:mfa/ABCD

[profile aws_acc_2]
source_profile = aws_acc_main
output = json
region = eu-west-2
role_arn = arn:aws:iam::111111111112:role/ACC2_ROLE
mfa_serial = arn:aws:iam::111111111110:mfa/ABCD

现在是python文件。

test1.py

sessions = ['aws_acc_1', 'aws_acc_2']
for session_name in sessions:
    session = boto3.Session(profile_name=session_name)

    ec2 = session.client('ec2', region_name='eu-west-2')
    resources = ec2.describe_instances()

test2.py

mfa_code = raw_input("Enter the MFA code: ")
client = boto3.client('sts')
response = client.get_session_token(
    DurationSeconds=3600, 
    SerialNumber='arn:aws:iam::111111111110:mfa/ABCD', 
    TokenCode=mfa_code
)
credentials = response['Credentials']

for session_name in sessions:
    session = boto3.Session(profile_name=session_name, 
        aws_access_key_id = credentials['AccessKeyId'],
        aws_secret_access_key = credentials['SecretAccessKey'],
        aws_session_token = credentials['SessionToken'],
    )
    ec2Client = session.client('ec2', region_name='eu-west-2')
    resources = ec2.describe_instances()

问题

第一个(test1.py)工作正常但我必须在每次迭代中为每个帐户提供MFA

第二个文件(test2.py)也没有出现任何错误,但它没有读取EC2aws_acc_1的{​​{1}}服务,而只是获取了ec2 aws_acc_2的服务,其中没有任何内容。它甚至没有任何错误。

渴望输出

我想在整个会话期间只给MFA一次。然后,我想切换角色而不是一次又一次地提供MFA。这意味着我想修复 aws_acc_main

问题

在AWS Web客户端中,一旦我使用我的用户ID,密码和MFA登录,我就可以在不再一次证明MFA的情况下切换角色。这就是我想要做的。

如果我使用boto3创建会话,如何在不提供MFA的情况下使用同一会话将角色切换到不同的帐户?

请注意......在这种情况下,重要的是test2.pyaws_acc_1aws_acc_2的一部分,而MFA只能通过{{1 }。

0 个答案:

没有答案