2017-05-25 16 views
1

我想以這種方式使用AssumeRole,我遍歷多個帳戶並檢索這些帳戶的資產。我已經做到了這一點:AWS:Boto3:AssumeRole示例,其中包括角色的使用

import boto3 
stsclient = boto3.client('sts') 

assumedRoleObject = sts_client.assume_role(
RoleArn="arn:aws:iam::account-of-role-to-assume:role/name-of-role", 
RoleSessionName="AssumeRoleSession1") 

好,我有assumeRoleObject。但是現在我想用它來列出ELB之類的東西或者不是內置低級資源的東西。

如何去做這件事?如果我可能會問 - 請編寫一個完整的示例,以便每個人都能受益。

回答

1

有建立這樣一個會話的更容易,因爲某些原因無證方式:

session = boto3.Session(
    role_arn = 'arn:aws:iam::${ACCOUNT}:role/${ROLE NAME}' 
) 

ec2 = session.client('ec2') # ... etc. 

編輯:這似乎並不奏效,我確信它已經做到了,但現在我再次嘗試,但事實並非如此。

0

可以使用STS令牌,如承擔的角色:

class Boto3STSService(object): 
def __init__(self, arn): 
    sess = Session(aws_access_key_id=ARN_ACCESS_KEY, 
        aws_secret_access_key=ARN_SECRET_KEY) 
    sts_connection = sess.client('sts') 
    assume_role_object = sts_connection.assume_role(RoleArn=arn, RoleSessionName=ARN_ROLE_SESSION_NAME,DurationSeconds=3600) 
    self.credentials = assume_role_object['Credentials'] 

這會給你暫時存取密鑰和祕密密鑰,與會話令牌。憑藉這些臨時憑證,您可以訪問任何服務。對於例如,如果您要訪問ELB,你可以使用下面的代碼:

self.tmp_credentials = Boto3STSService(arn).credentials 

def get_boto3_session(self): 
     tmp_access_key = self.tmp_credentials['AccessKeyId'] 
     tmp_secret_key = self.tmp_credentials['SecretAccessKey'] 
     security_token = self.tmp_credentials['SessionToken'] 

    boto3_session = Session(
     aws_access_key_id=tmp_access_key, 
     aws_secret_access_key=tmp_secret_key, aws_session_token=security_token 
    ) 
    return boto3_session 
def get_elb_boto3_connection(self, region): 
    sess = self.get_boto3_session() 
    elb_conn = sess.client(service_name='elb', region_name=region) 
    return elb_conn