2017-10-17 203 views
0

我有一个使用另一个AWS账户的雅典娜数据的lambda。所以我有一个我的lambda假定具有跨账户访问权限的角色。我在我的lambda中使用了STS客户端。有时lambda运行得非常好,有时会打破并给我这个错误。Aws lambda跨账户访问

“的errorMessage”: “发生错误(ExpiredTokenException)调用StartQueryExecution操作时:包括在请求安全令牌过期”, “ERRORTYPE”: “ClientError”,

STS客户端我在代码中使用的是:

def assume_role_to_session(role_arn, session_name): 
client = boto3.client('sts') 
response = client.assume_role(RoleArn=role_arn, RoleSessionName=session_name, DurationSeconds=900) 
return boto3.Session(
    aws_access_key_id=response['Credentials']['AccessKeyId'], 
    aws_secret_access_key=response['Credentials']['SecretAccessKey'], 
    aws_session_token=response['Credentials']['SessionToken'], 
    region_name='us-east-1') 
assume_role_athena_session = assume_role_to_session(role_arn='arn:aws:iam::XXXXXXXXXXX:role/role-name', 
            session_name='AthenaLambdaSession') 

这是如何工作的?我希望我的lambda可以随时运行,而不仅仅是有时。可能是什么问题呢?

回答

0

看​​

RoleSessionName(字符串) - [REQUIRED]

为假定角色会话的标识符。

使用角色会话名称唯一标识会话当不同主体或由于不同原因采用相同的 角色时。在 跨帐户方案中,角色会话名称对于拥有该角色的帐户是可见的,并且可以由该帐户拥有角色会话名称 。角色会话名称 也用于假定的角色主体的ARN中。这意味着使用临时安全 凭据的后续跨帐户API请求将在其CloudTrail日志中将角色会话名称公开给外部帐户 。

所以尽量用独特RoleSessionName更换AthenaLambdaSession。或者,如果您想重新使用现有会话,请尝试检查会话超时以确保有足够的时间执行您的lambda任务(最多5分钟)。如果< 5分钟,重新它。