繁体   English   中英

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

[英]The security token included in the request is expired

我有一个脚本可以从 Cloudwatch 中提取大量指标用于我们自己的内部报告。

该脚本迭代特定区域中的所有 EC2 实例,并询问过去 2 周的 5 个 cloudwatch 指标(所有可用的统计数据)(每次 5 天以 5 分钟为间隔返回,正好是 1440 配额)。 我正在使用假设的 session:

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。

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

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

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

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

实例时间同步问题也可能导致阻止 IAM 令牌刷新,我尝试了所有解决方案但没有任何效果,最后发现它与实例和 AWS 服务的时间差。 安装 chrony 有助于自动时间同步。

我发现AWS Premium Support对这个问题的回答非常简洁且相关

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

就我而言,问题是,我的.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在上述命令中使用--profile标志。

我也面临这个错误,甚至我检查了我的.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.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM