ECS中的Django应用无法连接政府云中的S3。

0

【以下的问题经过翻译处理】 我在ECS上的EC2实例中运行了一个容器。该容器托管了一个基于Django的应用程序,该应用程序利用S3和RDS进行文件存储和数据库需求。我已经适当地配置了我的VPC、子网、VPC终端、Internet网关、角色、安全组和其他参数,以便我能够托管站点、连接到RDS实例,甚至可以访问站点。

但是连接到S3出现了问题。当我尝试运行命令python manage.py collectstatic --no-input时,该命令应该将任何新的/修改的文件作为应用程序设置的一部分上传/更新到S3中,但程序会挂起并且不会继续运行。没有任何文件被传输到已设置的S3存储桶中。

设置详细信息:

以下所有内容均托管在AWS Gov Cloud上

VPC和子网

  • 在Gov Cloud East中有一个VPC,具有2个可用区(AZ)和每个AZ一个私有子网和公共子网(共4个子网)
  • 3个默认的路由表(每个私有子网一个,两个公共子网一起一个)
  • 启用了DNS主机名和DNS分辨率

VPC终端

所有终端都附加了“vpce-sg”安全组,并与上述VPC相关联

  • S3网关端点(设置为使用两个私有子网的路由表)
  • ecr-api接口端点
  • ecr-dkr接口端点
  • ecs-agetn接口端点
  • ecs接口端点
  • ecs-telemetry接口端点
  • 日志接口端点
  • rds接口端点

安全组

  • 弹性负载均衡器安全组(elb-sg)
    • 用于弹性负载均衡器
profile picture
专家
已提问 5 个月前10 查看次数
1 回答
0

【以下的回答经过翻译处理】 问题出在boto3如何处理不同的aws区域上。这可能是在AWS GovCloud上使用时才会出现的问题。最初,我没有为S3配置区域,但根据文档 ,可以设置一个名为AWS_S3_REGION_NAME的可选环境变量。

AWS_S3_REGION_NAME(可选,默认为None) 要使用的AWS S3区域的名称(例如eu-west-1)

我通过使用stackoverflow答案尝试通过boto3手动连接到s3来得出这个结论。我注意到他们在创建会话时包含了“region_name”参数,这提示我要确保在我的 app.settings 和环境变量中适当地设置了区域。

如果有人知道为什么需要设置这个来实现GovCloud功能,但显然商业功能不需要这个,请告诉我一声。

我还必须在app.settings中指定AWS_S3_SIGNATURE_VERSION,以便boto3知道使用签名版本4。根据文档

从boto3版本1.13.21起,用于生成预签名URL的默认签名版本仍然是v2。为了能够通过预签名URL访问所有区域的s3对象,请明确将此设置为s3v4。将其设置为使用其他版本,例如s3。请注意,只有某些区域支持旧版s3(也称为v2)版本。

这个stackoverflow响应中的一些额外信息详细说明了自2014年1月之后部署的新S3区域仅支持签名版本4。[AWS文档公告](https://

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则