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

Avi*_*Avi 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)
Run Code Online (Sandbox Code Playgroud)

在运行脚本时,我遇到了这个异常:

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

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

小智 62

就我而言,问题是,我有凭据.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
Run Code Online (Sandbox Code Playgroud)

现在您将只有一组访问密钥,.aws/configure即我能够成功建立连接。

aws configure
aws sts get-caller-identity
Run Code Online (Sandbox Code Playgroud)

如果您使用的配置文件不是默认配置文件,请--profile在上述命令中使用标志。


Alo*_*lon 17

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

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

由于您没有使用DurationSeconds关键字参数,因此返回的凭据在默认 1 小时内有效。您必须确保获得新凭据才能在 1 小时后提出请求。请参阅Temporary Security Credentials 官方文档中的以下内容

当(或什至在此之前)临时安全凭证到期时,用户可以请求新凭证,只要请求它们的用户仍然具有这样做的权限。


Tec*_*era 7

我也面临这个错误,甚至我检查了我的.aws/credential文件。它包含凭据,但我仍然建议执行以下步骤:

在做任何事情之前,你必须做的第一件事是运行以下命令

aws sts get-caller-identity
Run Code Online (Sandbox Code Playgroud)

如果您在 aws credential 中有多个配置文件,请使用此配置文件

您可以在以下文件中检查您的个人资料.aws/credential。如果你只有[default]那么就不需要提及简介

aws --profile NAME_OF_YOUR_PROFILE  sts get-caller-identity
Run Code Online (Sandbox Code Playgroud)

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

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

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.

所以至少我发现我使用了错误的凭据。我只需更换凭据即可解决我的问题。