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

Python 如何使用boto3在Beanstalk上运行的应用程序中验证会话,python,amazon-web-services,amazon-s3,amazon-elastic-beanstalk,boto3,Python,Amazon Web Services,Amazon S3,Amazon Elastic Beanstalk,Boto3,我的应用程序是通过Elastic Beanstalk部署的。它需要访问S3。我可以用自己的访问密钥在本地完成,但我不想在部署时将其存储在任何地方。鉴于实例位于Beanstalk上,必须有一种更简单的身份验证方法,可能是使用角色 我已经为Beanstalk实例上使用的角色授予了完全的S3权限,但我不知道如何设置会话 如何替换此项?: session = boto3.session.Session( aws_access_key_id=os.environ.get('AWS_ACCE

我的应用程序是通过Elastic Beanstalk部署的。它需要访问S3。我可以用自己的访问密钥在本地完成,但我不想在部署时将其存储在任何地方。鉴于实例位于Beanstalk上,必须有一种更简单的身份验证方法,可能是使用角色

我已经为Beanstalk实例上使用的角色授予了完全的S3权限,但我不知道如何设置
会话

如何替换此项?:

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

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

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

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

{
    "Action": "sts:AssumeRole",
    "Effect": "Allow",
    "Principal": {
        "Service": "ec2.amazonaws.com"
    }
}
访问策略 另一方面,访问策略将IAM角色的访问权授予特定的AWS资源。例如,完全访问S3服务的策略如下

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:*"],
            "Resource": ["*"]
        }
    ]
}
一旦创建了一个角色并将其附加到特定实例,就可以使用SDK,而无需向其提供任何凭据或区域,并在代码中使用它,如

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

最干净的方法是使用IAM角色

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

  • A“服务角色”
    aws elasticbeanstalk服务角色
  • “IAM实例配置文件”
    aws-elasticbeanstalk-ec2-role
基本上,后者授予实例权限

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

  • 创建(或查找)具有所需特定权限的IAM策略(在IAM控制台中)(例如
    AmazonS3FullAccess
  • 为EC2创建一个IAM角色,该角色将替换默认的aws-elasticbeanstalk-EC2角色。在控制台中,您可以创建新的EC2角色,并将标准
    aws-elasticbeanstalk-EC2-role
    中包含的策略和您的附加权限附加到该角色
  • 在应用程序的elastic beanstalk控制台中,转至配置>安全>编辑,然后选择新角色来代替默认的
    aws-elasticbeanstalk-ec2-role

  • 应用更改(通常会使实例重新启动)

很好,确保脚本没有任何其他身份验证方法(如配置文件等),以确保boto3使用实例IAM配置文件。
然后可以调用s3,比如
s3=boto3.resource('s3')

如果将IAM角色附加到EC2实例,则可以取出前两行并替换为:
client=boto3.client('s3')
。boto3将从附加的IAM角色检索凭据。或者,如果需要使用会话对象,请将第一行替换为:
session=boto3.session.session(region\u name='')
。区域名称将是S3存储桶的区域。