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)
    • 用于弹性负载均衡器
1 Antwort
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
EXPERTE
beantwortet vor 6 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen