我正在开发处理 AWS SQS 队列的 python 软件。它使用 boto3
,主要是 boto3.session.Session
.
我见过here我们可以通过 aws_session_token
到 Session
构造函数。
在亚马逊之外运行我的代码时,我需要定期刷新此 aws_session_token
因为它的有效期只有一个小时。所以我需要重新实例化一个 boto3.Session
靠我自己。
我只是想知道 AWS 内部是如何工作的。我是否需要通过获取新的 aws_session_token
来手动刷新我的 session ?通过环境?或者我的 session 是否“永远”有效/是否在内部处理,因此我不必刷新我的 AWS session ?
文档对我来说似乎不清楚。
最佳答案
简短的回答:
AWS 生成的 token 不会永远持续下去,使用生成的 token 创建的任何 boto3 session 也是如此。但是,只要您的 token 不是使用帐户 root 用户生成的,您就可以在 token 上设置很长的 TTL(最多 36 hours)。这为您提供了大量时间来执行需要对 Python 脚本执行的操作。
AWS 有多种方式来处理对您账户的临时和永久访问。通常,您会希望依赖临时凭证,因为它们使用起来更安全并且更符合最佳实践。 Boto3 使用优先列表,列出扫描凭证的位置 here
冗长而杂乱的答案:
我为数十个 AWS 账户编写了大量自动化代码,因此我处理了很多这些东西。
这假设您在 Linux 中进行开发。 Windows 非常相似,但也有一些不同。
有(至少)三种方法来处理对您的 AWS 账户的远程访问:
可用于您的 Python 脚本。
我通常更喜欢方法 2 和 强烈反对方法 1 .方法 3 视情况而定。
方法一:
从命令行,将您的 AWS_PROFILE 变量设置为您的配置文件名称并运行脚本。脚本中使用您的 AWS 配置文件(IAM 用户访问 key )完成的所有操作。
AWS_PROFILE=<YOUR_CREDENTIALS_PROFILE_NAME> python <PATH_TO_SCRIPT>
方法二:
在命令行中,使用您的 AWS 配置文件代入账户中的角色,然后将生成的 token 存储在环境变量中。现在,当您执行脚本时,它将自动使用这些 token :
credentials=`AWS_PROFILE=<YOUR_AWS_PROFILE_NAME> aws sts assume-role --role-arn <YOUR_AWS_ROLE_NAME> --role-session-name <SOME_SESSION_NAME> --query 'Credentials.{AKI:AccessKeyId,SAK:SecretAccessKey,ST:SessionToken}' --output text`
export AWS_ACCESS_KEY_ID=`echo ${credentials} | awk '{print $1}'`
export AWS_SECRET_ACCESS_KEY=`echo ${credentials} | awk '{print $2}'`
export AWS_SECURITY_TOKEN=`echo ${credentials} | awk '{print $3}'`
export AWS_DEFAULT_REGION=<AWS_REGION>
python <path_to_your_python_script>
注意:由于您的 token 已加载到环境变量中,因此在运行脚本时不应设置 AWS_PROFILE。所有 AWS 开发工具包都会自动在这些环境变量中查找凭证 token 。您可以阅读有关它们的更多信息 here .
方法三:
在您的 Python 代码中,生成访问 token ,然后使用这些 token 创建 session 。
import boto3
role_info = {
'RoleArn': 'arn:aws:iam::<AWS_ACCOUNT_NUMBER>:role/<AWS_ROLE_NAME>',
'RoleSessionName': '<SOME_SESSION_NAME>'
}
client = boto3.client('sts')
credentials = client.assume_role(**role_info)
session = boto3.session.Session(
aws_access_key_id=credentials['Credentials']['AccessKeyId'],
aws_secret_access_key=credentials['Credentials']['SecretAccessKey'],
aws_session_token=credentials['Credentials']['SessionToken']
)
以与方法 1 相同的方式运行您的脚本,不同之处在于这次您的 AWS_PROFILE 用于代入该角色,并且任何后续工作都通过该角色执行,因为 session 是使用代入的角色创建的。
AWS_PROFILE=<YOUR_CREDENTIALS_PROFILE_NAME> python <PATH_TO_SCRIPT>
希望这可以帮助!
关于amazon-web-services - boto3 session 和 aws_session_token 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266120/