如何使用 boto3 在 Beanstalk 上运行的应用程序中验证会话

Posted

技术标签:

【中文标题】如何使用 boto3 在 Beanstalk 上运行的应用程序中验证会话【英文标题】:How to authenticate session in application running on Beanstalk with boto3 【发布时间】:2018-09-05 18:05:02 【问题描述】:

我的应用程序是通过 Elastic Beanstalk 部署的。它需要访问 S3。我可以使用自己的访问密钥在本地执行此操作,但我不想在部署时将其存储在任何地方。鉴于实例在 Beanstalk 上,必须有一种更简单的 auth 方法,也许使用 roles?

我已为 Beanstalk 实例上使用的角色授予完整的 S3 权限,但我不知道如何设置 Session

如何替换它?:

session = boto3.session.Session(
        aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
        aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY'))
client = session.client('s3')
s3 = session.resource('s3')
bucket = s3.Bucket(os.environ.get('S3_BUCKET'))
# do stuff

【问题讨论】:

如果 IAM 角色附加到您的 EC2 实例,您可以取出前 2 行并将其替换为:client = boto3.client('s3')。 boto3 将从附加的 IAM 角色中检索凭证。或者如果您需要使用会话对象,请将第一行替换为:session = boto3.session.Session(region_name='')。区域名称将是您的 S3 存储桶的区域。 【参考方案1】:

管理用于签署对其他 AWS 服务的 API 请求的凭证的推荐方法是使用 IAM 角色。当 IAM 角色附加到实例时,它会从实例元数据中检索临时凭证。这些凭证在有限的时间内有效,但是 SDK 透明地管理它们。因此,您可以使用 IAM 角色委派权限,而不是创建 AWS 凭证并将其分配给实例。

在创建 IAM 角色时,除了访问策略之外,您还必须附加信任策略(例如,什么服务可以担任此角色)。

担任角色政策

代入角色策略(也称为信任策略)是一种授予对 AWS 服务的访问权限以使用(代入)该特定角色的策略。因此,如果您使用的是 EC2 实例,信任策略可能如下所示:


    "Action": "sts:AssumeRole",
    "Effect": "Allow",
    "Principal": 
        "Service": "ec2.amazonaws.com"
    

访问政策

另一方面,访问策略授予对特定 AWS 资源的 IAM 角色的访问权限。因此,例如,完全访问 S3 服务的策略如下所示


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": ["s3:*"],
            "Resource": ["*"]
        
    ]

创建角色并将其附加到特定实例后,您可以在不向其提供任何凭据或区域的情况下使用 SDK,并在您的代码中使用它,例如

s3 = boto3.resource('s3')
bucket = s3.Bucket(os.environ.get('S3_BUCKET'))

【讨论】:

【参考方案2】:

最简洁的方法是使用 IAM 角色

默认情况下,弹性 beanstalk 实例附加了两种类型的 IAM 角色:

一个“服务角色”aws-elasticbeanstalk-service-role “IAM 实例配置文件”aws-elasticbeanstalk-ec2-role

基本上是后者授予您的实例权限。

有几种方法可以修改实例的访问权限以使用您的 AWS 资源。 如果您想要特定于应用程序的访问权限(即仅授予给定弹性 beanstalk 应用程序的权限,而不是所有应用程序),您可以执行以下操作:

创建(或查找)一个 IAM 策略(在 IAM 控制台中),它具有您想要的特定权限(例如 AmazonS3FullAccess) 为 EC2 创建一个 IAM 角色,它将替换默认的 aws-elasticbeanstalk-ec2-role。在控制台中,您可以创建一个新的 EC2 角色,并为其附加标准 aws-elasticbeanstalk-ec2-role 中包含的策略和您的其他权利。

在应用程序的弹性 beanstalk 控制台中,转到 configuration > Security > Edit 并选择您的新角色来代替默认的 aws-elasticbeanstalk-ec2-role

应用更改(通常会重新生成您的实例)。

一切顺利,确保您的脚本没有任何其他身份验证方法(如配置文件等),以确保 boto3 使用实例 IAM 配置文件。 然后你可以像s3 = boto3.resource('s3')一样调用s3

【讨论】:

以上是关于如何使用 boto3 在 Beanstalk 上运行的应用程序中验证会话的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS Python SDK Boto 3 等待 Elastic Beanstalk 事件

如何以编程方式更改 Elastic Beanstalk 环境中的 EC2 实例类型?

将 ssh 密钥添加到 Elastic Beanstalk

如何使用 boto3 在 EMR Studio 中创建笔记本?

如何在 Python 中使用 boto3 模块检查 Redshift 的集群状态?

如何在 boto3 中设置 executionRoleArn 的值?