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

时间:2016-02-28 17:23:16

标签: amazon-web-services boto3

我有一个脚本可以从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。

4 个答案:

答案 0 :(得分:2)

您使用的assume_role方法返回临时安全凭据。以下摘自official documentation

  

临时安全凭证在您调用AssumeRole时指定的持续时间内有效,可以是900秒(15分钟)到3600秒(1小时)。默认值为1小时。

由于您未使用DurationSeconds关键字参数,因此返回的凭据在默认的1小时内有效。您必须确保获取新凭据才能在1小时后发出请求。请参阅Temporary Security Credentials official documentation

中的以下内容
  

临时安全凭证何时(或甚至之前)到期,用户可以请求新凭据,只要请求它们的用户仍有权这样做。

答案 1 :(得分:1)

就我而言,问题是,我的 .aws/configure 中有凭据并试图从中进行配置,但我没有意识到我还有另一对凭据 AWS_SESSION_TOKEN {{1 }} 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 标志。

答案 2 :(得分:0)

我发现AWS Premium Support answer的问题非常简洁和相关

还要注意,当服务器时间偏离正确时间时有时会出现错误(10-15分钟会导致错误)

答案 3 :(得分:-1)

我也遇到此错误,甚至我都检查了.aws/credential文件。它包含凭据,但我仍然建议您执行以下步骤:

在执行任何操作之前,必须先执行以下命令

aws sts get-caller-identity

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

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

aws --profile NAME_OF_YOUR_PROFILE  sts get-caller-identity

现在的问题是上面的命令可以解决问题吗?

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

An error occurred (SignatureDoesNotMatch) when calling the GetCallerIdentity operation: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

所以至少我发现我使用了错误的凭证。我只是替换了凭证,问题就解决了。