2017-08-05 2 views
1

Qu'est-ce que je fais mal ici? Je suis en mesure d'assumer les rôles via aws cli ainsi que Boto si j'utilise:Boto3 STS AssumeRole dans un autre compte Exemple de travail

boto3.setup_default_session(profile_name="ROLE_TO_ASSUME") 

Ce que je suis en train de faire: j'ai un certain nombre de comptes AWS a besoin de mon script à exécuter dans I ». Je suis fatigué de taper mon fichier mfa chaque fois que j'ai besoin d'exécuter le script sur un autre profil/rôle.

Je reçois ce message d'erreur avec le code ci-dessous:

User: arn:aws:iam::<management account>:user/Ops/<my user> is not authorized to perform: sts:AssumeRole on resource 

Notre AWS est la configuration comme ceci: Je suis un utilisateur, une partie d'un groupe sur un compte de gestion. Le groupe a une relation d'approbation définie avec le rôle ROLE_TO_ASSUME sur chaque compte.

Voici mon python:

import boto3 

def main(): 
    boto3.setup_default_session(profile_name="default") 
    ec2 = boto3.client('ec2') 
    get_assumerole_credentials('arn:aws:iam::<REPLACE WITH ACCOUNTID>:role/ROLE_TO_ASSUME') 

def get_assumerole_credentials(arn): 
    sts_client = boto3.client('sts') 
    # Use client object and pass the role ARN 
    assumedRoleObject = sts_client.assume_role(RoleArn=arn, 

RoleSessionName="AssumeRoleCredstashSession1") 
    credentials = assumedRoleObject['Credentials'] 
    return dict(aws_access_key_id=credentials['AccessKeyId'], 
      aws_secret_access_key=credentials['SecretAccessKey'], 
      aws_session_token=credentials['SessionToken']) 

if __name__ == "__main__": 
    main() 

Voici mon ~/.AWS/config

[profile default] 
region = us-west-2 
output = json 
aws_access_key_id=<censored> 
aws_secret_access_key=<censored> 

[profile ROLE_TO_ASSUME] 
region = us-west-2 
source_profile = default 
role_arn = arn:aws:iam::<accountid>:role/ROLE_TO_ASSUME 
mfa_serial = arn:aws:iam::<accountid>:mfa/<my_user> 

EDIT basé sur la première réponse:
Pour être clair, je suis en mesure de jouer un rôle si Je spécifie l'argument 'profile' comme dans l'exemple suivant:

boto3.setup_default_session(profile_name='ROLE_TO_ASSUME') 
ec2 = boto3.resource('ec2', region_name='us-west-1') 

Mais j'ai besoin d'assumer un rôle et dans le script en utilisant STS de Boto3 pour obtenir des informations d'identification temporaires.
J'ai remarqué qu'il n'y a pas d'invite MFA lorsque j'utilise la méthode de connexion boto3 STS assumée.

+0

Il est pas aussi simple. AssumeRoles ne fonctionne pas uniquement au niveau du compte d'utilisateur, vous devez également attribuer des rôles à tous les services AWS que vous souhaitez accorder. – mootmoot

+0

ok mais je pensais que je l'ai fait parce que je peux assumer le rôle en utilisant aws config "profils". Juste boto mts ne fonctionne pas. Je ne comprends pas ce que vous essayez de dire. – buildmaestro

+0

C'est assez difficile, je vais juste vous donner la référence. Vous devez tester ces contraintes. http://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html – mootmoot

Répondre

0

Je suppose que le ci-dessous fonctionne très bien pour vous

boto3.setup_default_session(profile_name='ROLE_TO_ASSUME') 
ec2 = boto3.resource('ec2', region_name='us-west-1') 

Donc, pour obtenir les informations d'identification temp STS, procédez comme ci-dessous

boto3.setup_default_session(profile_name='ROLE_TO_ASSUME') 
session = boto3.session.Session() 
temp_credentials = session.get_credentials().get_frozen_credentials() 

Note: Cela n'a rien à voir avec MFA si le premier l'hypothèse fonctionne bien.

Si vous recherchez assumer le rôle avec MFA, reportez-vous à assumer le rôle de l'AMF http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role