AWS Elastic Beanstalk 权限的最佳实践

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 权限的最佳实践【英文标题】:Best Practice for AWS Elastic Beanstalk Permission 【发布时间】:2016-03-08 08:53:37 【问题描述】:

我是 AWS Elastic Beanstalk 的新手,并且仍在学习它。请分享您知道的最佳实践。

eb deploy”将 Django 应用程序上传到 AWS。但是,“./manage makemigrations”会出现 permission denied 像这样的错误

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/core/management/commands/makemigrations.py", line 143, in handle
    self.write_migration_files(changes)
  File "/opt/python/run/venv/local/lib/python3.4/site-packages/django/core/management/commands/makemigrations.py", line 172, in write_migration_files
    with open(writer.path, "wb") as fh:
PermissionError: [Errno 13] Permission denied: '/opt/python/bundle/3/app/myproj/myapp/migrations/0001_initial.py'

注意用户是 ec2-user,他只拥有对“/opt/python/bundle/3/app/myproj/myapp/migrations/”的读取权限。使用 root 用户可以成功执行迁移,但是存在安全问题。

另一个类似的问题是, ec2-user 没有对“/var/log/”的 WRITE 访问权限,日志文件应存储在哪里?存储在/home/ec2-user 中?如果环境终止,主目录将被清除,对吗?

【问题讨论】:

【参考方案1】:

您不应该在您的 EB 实例上调用 makemigrations。 makemigrations 是您在开发过程中调用的东西,然后将所有生成的文件(如“0001_initial.py”)置于版本控制之下,并作为eb deploy 的一部分进行部署。

在您的 .ebextensions 上,您只需要调用仅写入数据库的“迁移”(同时进行数据的实际迁移):

container_commands:
   01_migrate:
     command: "django-admin.py migrate --noinput"
     leader_only: true

那里的一些示例还建议在您的 .ebextensions 上调用 collectstatics,但我建议不要这样做。假设您正在使用 django-storages 之类的东西并将所有静态数据存储在 S3(或更好的 CloudFront)上,那么最好在您自己的本地机器上调用 collectstatics 作为开发的一部分。例如

python manage.py collecstatics
eb deploy

我对日志问题没有真正的疑问。我只是使用 eb 日志,所以我只需将我想看到的内容打印到控制台,EB 会处理这些日志。但我确实知道您有权写入 /tmp 以便它可以成为日志的位置。

【讨论】:

以上是关于AWS Elastic Beanstalk 权限的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 更改挂载目录的权限

如何将 chmod +x 权限添加到 AWS Elastic Beanstalk 平台挂钩?

AWS Elastic Beanstalk - .ebextensions

AWS Elastic Beanstalk - 多容器 Docker

Node JS - Elastic Beanstalk AWS - 允许写访问

AWS Elastic Beanstalk Drupal 8 安装错误:未能创建符号链接“站点/默认/文件”: