[英]How can I resolve the error "The security token included in the request is invalid" when running aws iam upload-server-certificate?
[英]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.