0

我有一个 lambda,我通过承担角色访问一个交叉账户

sts = boto3.client('sts')
sts.assume_role(RoleArn='A', RoleSessionName='aaa')

现在我在访问后做了一些操作

就像我得到一些实例信息一样。

  ec2 = boto3.client('ec2')
  desc = ec2.describe_instaces() #this all are  working fine

现在我想支持我的 lambda 角色(B)并存储这些数据。

 sts2 = boto3.client('sts')
 sts2.assume_role(RoleArn='B', RoleSessionName='bbb')

并希望将desc这些实例数据存储到我当前 lambda 帐户的一个 s3 存储桶中。

我尝试了这些,但它无法存储数据...有什么方法可以强制使承担角色过期并让我当前的访问角色来存储数据

4

1 回答 1

1

将 IAM 角色分配给 AWS Lambda 函数时,将自动向该函数提供一组临时凭证。然后,函数中的代码可以通过调用 AWS 服务来使用这些凭证,例如:

ec2_client = boto3.client('ec2')

当您担任角色时,会返回一组新的凭据。

response = sts.assume_role(RoleArn='A', RoleSessionName='aaa')

然后response将包含:

{
    'Credentials': {
        'AccessKeyId': 'string',
        'SecretAccessKey': 'string',
        'SessionToken': 'string',
        'Expiration': datetime(2015, 1, 1)
    },
    'AssumedRoleUser': {
        'AssumedRoleId': 'string',
        'Arn': 'string'
    },
    'PackedPolicySize': 123
}

如果您希望在随后的 AWS 调用中使用这些假定凭证,您将需要创建一个Session对象,然后使用它Session来创建一个新的Client

session = Session(aws_access_key_id=response['Credentials']['AccessKeyId'],
                  aws_secret_access_key=response['Credentials']['SecretAccessKey'],
                  aws_session_token=response['Credentials']['SessionToken'])

assumed_client = session.client('ec2')
instances_response = assumed_client.describe_instances()    

底线:调用assume-role实际上并不会更改您的凭据。相反,您需要使用返回的凭据来创建新的客户端对象。因此,没有任何凭证“过期”的概念。

于 2019-06-22T04:32:15.150 回答