首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS: Boto3: AssumeRole示例,包括角色使用

AWS: Boto3: AssumeRole示例,包括角色使用
EN

Stack Overflow用户
提问于 2017-05-25 03:34:14
回答 10查看 116.3K关注 0票数 48

我试图以这样一种方式使用AssumeRole,即遍历多个帐户并检索这些帐户的资产。我已经说到这一点了:

代码语言:javascript
运行
复制
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")

太好了,我有assumedRoleObject。但是现在我想用它来列出诸如ELB之类的东西,或者不是内置的低级别资源。

怎样才能做到这一点?如果我可以问-请列出一个完整的例子,这样每个人都可以受益。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2017-08-23 08:45:21

若要获得具有假定角色的会话:

代码语言:javascript
运行
复制
import botocore
import boto3
import datetime
from dateutil.tz import tzlocal

assume_role_cache: dict = {}
def assumed_role_session(role_arn: str, base_session: botocore.session.Session = None):
    base_session = base_session or boto3.session.Session()._session
    fetcher = botocore.credentials.AssumeRoleCredentialFetcher(
        client_creator = base_session.create_client,
        source_credentials = base_session.get_credentials(),
        role_arn = role_arn,
        extra_args = {
        #    'RoleSessionName': None # set this if you want something non-default
        }
    )
    creds = botocore.credentials.DeferredRefreshableCredentials(
        method = 'assume-role',
        refresh_using = fetcher.fetch_credentials,
        time_fetcher = lambda: datetime.datetime.now(tzlocal())
    )
    botocore_session = botocore.session.Session()
    botocore_session._credentials = creds
    return boto3.Session(botocore_session = botocore_session)

# usage:
session = assumed_role_session('arn:aws:iam::ACCOUNTID:role/ROLE_NAME')
ec2 = session.client('ec2') # ... etc.

结果会话的凭据将在需要时自动刷新,这是相当不错的。

注:我以前的答案是完全错误的,但我不能删除它,所以我已经用一个更好和有效的答案取代了它。

票数 26
EN

Stack Overflow用户

发布于 2019-07-15 07:56:30

下面是来自正式AWS文件的代码片段,其中创建了一个s3资源,用于列出所有s3桶。boto3资源或其他服务的客户端也可以以类似的方式构建。

代码语言:javascript
运行
复制
# create an STS client object that represents a live connection to the 
# STS service
sts_client = boto3.client('sts')

# Call the assume_role method of the STSConnection object and pass the role
# ARN and a role session name.
assumed_role_object=sts_client.assume_role(
    RoleArn="arn:aws:iam::account-of-role-to-assume:role/name-of-role",
    RoleSessionName="AssumeRoleSession1"
)

# From the response that contains the assumed role, get the temporary 
# credentials that can be used to make subsequent API calls
credentials=assumed_role_object['Credentials']

# Use the temporary credentials that AssumeRole returns to make a 
# connection to Amazon S3  
s3_resource=boto3.resource(
    's3',
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'],
)

# Use the Amazon S3 resource object that is now configured with the 
# credentials to access your S3 buckets. 
for bucket in s3_resource.buckets.all():
    print(bucket.name)
票数 60
EN

Stack Overflow用户

发布于 2017-05-26 06:17:50

您可以使用STS令牌承担角色,如:

代码语言:javascript
运行
复制
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,可以使用以下代码:

代码语言:javascript
运行
复制
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
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44171849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档