Vla*_*rov 15 amazon-web-services aws-sts aws-credentials
先决条件
我有一个可与 AWS 配合使用的脚本,但不会显式处理凭证。它只是调用 AWS API,期望根据默认凭证提供者链提供凭证。事实上,调用此脚本的包装器会获取临时凭证并将其传递到环境变量(AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN)中。
问题
包装器通常会重用现有的凭据,并且仅在它们即将过期时明确要求重新进行身份验证。因此,它可能会传递剩余几分钟的凭据,这可能还不够,因为脚本执行通常需要很长时间。不幸的是,我无法控制包装器,因此我想让脚本检查在决定是否提前启动或中止之前还剩下多少时间,以防止在飞行途中失败。
AWS似乎没有提供标准方法来查询“当前会话到期之前我还有多少时间?” 如果我可以控制包装器,我也会让它在环境变量中传递到期日期。我希望这AWS_SESSION_TOKEN是一种 JWT 令牌,但不幸的是它不是,并且似乎不包含任何时间戳。
任何人都可以提出解决给定问题的其他方法吗?
IMPORTANT Update: now $AWS_CREDENTIAL_EXPIRATION replaces $AWS_SESSION_EXPIRATION
TODO:根据上面的重要更新修改下面的答案!
您可能需要检查的值$AWS_SESSION_EXPIRATION
echo $AWS_SESSION_EXPIRATION
Run Code Online (Sandbox Code Playgroud)
它应该使用祖鲁时间(协调世界时)为您提供到期时间,如下所示
2022-05-17T20:20:40Z
Run Code Online (Sandbox Code Playgroud)
然后需要将系统上的日期与它进行比较。
以下说明适用于 macOS,对于 Linux,您可能需要修改
date函数参数
让我们检查当前系统时间(祖鲁时间):
date -u +'%Y-%m-%dT%H:%M:%SZ'
Run Code Online (Sandbox Code Playgroud)
这应该给出类似示例的内容:
2022-05-17T20:21:14Z
Run Code Online (Sandbox Code Playgroud)
要自动化操作,您可以创建一个 bash 函数来添加到您~/.bashrc或最喜欢的终端主题
aws_session_time_left() {
zulu_time_now=$1
aws_session_expiration_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $AWS_SESSION_EXPIRATION '+%s'`"
zulu_time_now_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $zulu_time_now '+%s'`"
if [[ $zulu_time_now < $AWS_SESSION_EXPIRATION ]]; then
secs="`expr $aws_session_expiration_epoch - $zulu_time_now_epoch`"
echo "+`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
else
secs="`expr $zulu_time_now_epoch - $aws_session_expiration_epoch`"
echo "-`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
fi
}
Run Code Online (Sandbox Code Playgroud)
要查看函数的结果,您可以运行:
aws_session_time_left "`date -u +'%Y-%m-%dT%H:%M:%SZ'`"
Run Code Online (Sandbox Code Playgroud)
当您的会话仍处于活动状态时,可能会给您类似的信息:
+0h:56m:35s
Run Code Online (Sandbox Code Playgroud)
或者(当会话过期时)可以告诉您自过期以来的时间:
-28h:13m:42s
Run Code Online (Sandbox Code Playgroud)
注意时间可以超过 24 小时
奖励:简化的独立脚本版本,不带以下参数
例如,您还可以将其作为独立文件get-aws-session-time-left.sh
#!/bin/bash
# Use to find out IF "aws session expiration" exist AND compare the current system time to IT
# These are the expected result types we want to have:
# - "no aws session found" (NOTE: this does not mean there is no aws session open in another terminal)
# - how long until the session expires (for example +0h:59m:45s)
# - how long since the session expired (for example -49h:41m:12s)
# NOTE: the hours do not reset at every 24 hours, we do not require to display the days
# IMPORTANT: the date function arguments work on macOS, for other OS types may need adapting
if [[ $AWS_SESSION_EXPIRATION != '' ]]; then
zulu_time_now="`date -u +'%Y-%m-%dT%H:%M:%SZ'`" # TODO: see important note above
aws_session_expiration_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $AWS_SESSION_EXPIRATION '+%s'`" # TODO: see important note above
zulu_time_now_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $zulu_time_now '+%s'`" # TODO: see important note above
if [[ $zulu_time_now < $AWS_SESSION_EXPIRATION ]]; then
secs="`expr $aws_session_expiration_epoch - $zulu_time_now_epoch`"
echo "+`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
else
secs="`expr $zulu_time_now_epoch - $aws_session_expiration_epoch`"
echo "-`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
fi
else
echo "no aws session found"
fi
Run Code Online (Sandbox Code Playgroud)
然后要查询 AWS 会话过期时间,您可以运行:
bash get-aws-session-time-left.sh
Run Code Online (Sandbox Code Playgroud)
---编辑---
重要提示:有关 AWS_SESSION_EXPIRATION 起源的一些信息可以在此处找到
注意:aws sso 登录似乎没有设置此环境变量,如果有人可以澄清 AWS_SESSION_EXPIRATION 是否仅在使用 aws-vault 时存在,我会很好奇
| 归档时间: |
|
| 查看次数: |
10881 次 |
| 最近记录: |