boto3会话和aws_session_token管理

Geo*_* R. 3 amazon-sqs amazon-web-services

我正在开发处理AWS SQS队列的python软件。它boto3主要使用boto3.session.Session

我在这里看到可以将an传递aws_session_tokenSession构造函数。

在Amazon外部运行代码时,我需要定期刷新此代码,aws_session_token因为它仅有效一个小时。因此,我需要自己重新建立实例boto3.Session

我只是想知道事情在AWS内部如何工作。我是否需要aws_session_token通过环境中的新操作来手动刷新会话?还是我的会话“永远”有效/是否在内部处理,因此我不必刷新我的AWS会话?

该文档对我来说似乎不清楚。

Him*_*mal 5

简短答案:

AWS生成的令牌不会永远持续下去,使用生成的令牌创建的任何boto3会话也是如此。但是,只要您不是由帐户root用户生成令牌的,就可以在令牌上设置一个较长的TTL(最长36小时)。这使您有很多时间来执行需要处理的Python脚本。

AWS有几种处理临时和永久访问您帐户的方法。通常,您将需要依赖临时凭据,因为它们更安全地使用并且更符合最佳做法。Boto3具有优先级列表,用于查找此处描述的凭据

长而漫不经心的答案:

我为数十个AWS账户编写了很多自动化代码,因此我已经处理了很多东西。

假设您正在Linux中进行开发。Windows非常相似,但有一些区别。

至少有三种方法来处理对您的AWS账户的远程访问:

  1. 在〜/ .aws / credentials文件中维护一个配置文件,其中包含您的AWS IAM用户访问密钥,然后使用该配置文件运行Python脚本。

    • 您的Python脚本所需要做的就是创建一个没有参数的boto3.session.Session对象。当您不为会话实例提供令牌或配置文件名称时,boto3会通过扫描上面链接中描述的凭据优先级列表自动查找凭据。

    • 我完全不推荐这样做,但是它可以工作,并且让您了解如何使用AWS配置文件。这是使用您的IAM用户的API密钥进行的永久访问,并且永不过期。虽然您可以将这些密钥用于已授予IAM用户权限的任何操作,但除了承担专门的角色来执行所有其他工作之外,您不应将它们用于其他任何用途。

  2. 从命令行使用AWS CLI承担角色,将令牌加载到环境变量中,然后运行Python脚本。

    • 好处:
      • 轻松自动化。
      • 可以轻松设置令牌TTL。
      • 令牌可以加载到环境变量中,并立即可用于您的Python脚本。
    • 缺点:
      • 仅当您的Python脚本与一个AWS账户交互时才适用。
      • 如果您的Python脚本运行的时间超过令牌TTL(不太可能,但并非不可能),那么您的脚本将遇到AccessDenied错误并停止。
  3. 运行Python脚本,并使其处理角色假设和令牌变戏法。

    • 好处:
      • 允许您在一个地方杂耍访问多个帐户。
      • 可以轻松设置令牌TTL。
      • 如果令牌过期,则可以捕获AccessDened异常,刷新令牌,然后继续进行。
    • 缺点:
      • 涉及维护获取访问令牌并与其创建boto会话的Python代码。当然,它不是那么多代码,而是它的静态代码,这意味着维护和混乱。

我通常更喜欢方法2,强烈不建议使用方法1。方法3是视情况而定。

方法1:
在命令行中,将您的AWS_PROFILE变量设置为您的配置文件名称,然后运行脚本。脚本中完成的所有操作均使用您的AWS配置文件(IAM用户访问密钥)。

AWS_PROFILE=<YOUR_CREDENTIALS_PROFILE_NAME> python <PATH_TO_SCRIPT>
Run Code Online (Sandbox Code Playgroud)

方法2:
在命令行中,使用您的AWS配置文件在帐户中担任角色,然后将生成的令牌存储在环境变量中。现在,当您执行脚本时,它将自动使用这些标记:

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

注意:由于令牌已加载到环境变量中,因此在运行脚本时不应设置AWS_PROFILE。所有AWS开发工具包都会在这些环境变量中自动查找凭证令牌。您可以在此处阅读有关它们的更多信息。

方法3:
在您的Python代码中,生成访问令牌,然后使用这些令牌创建会话。

AWS_PROFILE=<YOUR_CREDENTIALS_PROFILE_NAME> python <PATH_TO_SCRIPT>
Run Code Online (Sandbox Code Playgroud)

与方法1相同地运行脚本,除了这次使用AWS_PROFILE承担角色,并且由于使用假定角色创建了会话,因此通过该角色执行了所有后续工作。

AWS_PROFILE=<YOUR_CREDENTIALS_PROFILE_NAME> python <PATH_TO_SCRIPT>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 很棒的答案!非常感谢喜马尔。那么我将尝试依赖第二种方法。 (2认同)