请求中包含的安全令牌已过期。

53

我有一个脚本,从Cloudwatch中获取了很多指标,用于我们内部报告。

该脚本遍历特定区域中的所有EC2实例,并请求过去2周内每个实例的5个Cloudwatch指标(所有可用的统计信息),每次以5分钟间隔回溯5天(正好是1440配额)。我正在使用一个假定的会话:

session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name=regionName)
sts = session.client('sts')
response = sts.assume_role(
    RoleArn=arn, # External role arn
    RoleSessionName='role-name',
    ExternalId='<some-id-here>',
)
tempAccessKeyId = response['Credentials']['AccessKeyId']
tempSecretAccessKey = response['Credentials']['SecretAccessKey']
tempSessionToken = response['Credentials']['SessionToken']
assumedSession = Session(
    aws_access_key_id=tempAccessKeyId,
    aws_secret_access_key=tempSecretAccessKey,
    aws_session_token=tempSessionToken,
    region_name=regionName)
在运行脚本时,我遇到了这个异常:

botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the GetMetricStatistics operation: The security token included in the request is expired

在运行脚本时是否有办法确保令牌不会过期?我正在使用boto3。

8个回答

55
在我的情况下,问题在于我在.aws/configure中有凭证并尝试从那里进行配置,但我没有意识到我还有一组凭据AWS_SESSION_TOKEN AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY设置在环境变量中。您可以这样做(这将从环境中删除凭证)。
unset AWS_SESSION_TOKEN AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY

现在您只需要一个访问密钥集,即在.aws/configure中,我已成功建立连接。

aws configure
aws sts get-caller-identity
如果您使用的是除默认配置文件之外的配置文件,请在上述命令中使用--profile标志。

对我来说,是一个override.tf文件被创建了,里面明确设置了错误的配置文件,类似的问题。 - RaisinBranCrunch

29
您正在使用的assume_role方法返回临时安全凭据。以下内容摘自官方文档
  

当调用AssumeRole时,临时安全凭证的有效期与您指定的持续时间相同,该时间可以从900秒(15分钟)到3600秒(1小时)。默认值为1小时。

由于您没有使用DurationSeconds关键字参数,因此返回的凭据默认有效期为1小时。您必须确保获取新的凭据以在1小时后进行请求。请参阅临时安全凭证官方文档中的以下内容:
  

临时安全凭证过期时(甚至在之前),用户可以请求新的凭证,只要请求它们的用户仍具有执行此操作的权限。


6
我也遇到了这个错误,即使我检查了我的.aws/credential文件。它包含凭证,但我仍然建议按照以下步骤进行操作:
在任何操作之前,第一件事情就是运行以下命令:
aws sts get-caller-identity

如果您在AWS凭证中有多个配置文件,请使用此配置文件。

您可以在以下文件中检查您的配置文件 .aws/credential。 如果您只有[default],则无需提及配置文件。

aws --profile NAME_OF_YOUR_PROFILE  sts get-caller-identity

现在的问题是,上述命令是否可以解决问题?

并不会,但至少它会让你知道你的凭证是否正确。我遇到了同样的错误,当我运行上述命令时,它给了我以下错误:

调用 GetCallerIdentity 操作时发生错误 (SignatureDoesNotMatch):我们计算的请求签名与您提供的签名不匹配,请检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

所以至少我发现我使用的凭证是错误的。我只需替换凭证即可解决问题。


2

实例时间同步问题也可能会导致IAM令牌刷新被阻止,我尝试了所有的解决方案,但都没有起作用,最终发现是实例和AWS服务之间的时间差异。安装chrony可以帮助自动进行时间同步。


1
我发现 AWS Premium Support答案对这个问题非常简洁和相关。
另外要注意的是,当服务器时间偏离正确时间时(10-15分钟会导致错误),有时会出现错误。

0

对于那些使用Azure AD登录AWS的用户,只需重新运行aws-azure-login命令即可刷新令牌。


0
在尝试使用以下命令刷新令牌时,我遇到了错误: aws sts get-session-token 我认为这个错误的原因是因为上面的答案中分享的原因,但为了简单地解决它,我从AWS IAM安全凭证选项卡请求了一个新的访问密钥。当我使用这个新密钥并从配置文件中删除session_token后,我终于能够运行get-sessions-token命令了。

0
基本上,您需要通过终端重新登录到您的AWS账户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接