【问题标题】:How to set AWS credentials for user www-data for Django app using NGINX如何使用 NGINX 为 Django 应用程序的用户 www-data 设置 AWS 凭证
【发布时间】:2019-06-18 15:41:51
【问题描述】:

我有一个在 NGINX 下的 Linux 服务器上运行的 Django 应用程序。 Django 应用程序的“用户”是www-data。在这个应用程序中,我尝试连接到 AWS IOT,为此我相信 AWS boto3 程序包会尝试在此处找到 AWS 凭证:~/.aws/credentials。问题是用户www-data 没有这样的路径!当我登录到服务器(使用我的真实用户名)并尝试运行一个连接到 AWS 的脚本时,它连接得很好。假设我的用户名是“joe”。确实有一个文件/home/joe/.aws/credentials 包含正确的凭据。这就是为什么当我以用户“joe”运行时脚本运行良好的原因。但是django app运行的时候就不行了,因为没有登录用户www-data,即没有文件/home/www-data/.aws/credentials.

我了解 AWS boto3 让我们设置一个环境变量来指定凭证文件的非标准路径。这个环境变量是AWS_SHARED_CREDENTIALS_FILE,还有一个AWS_CONFIG_FILE。

但是,我不知道如何在 Django 中为用户 www-data 设置环境变量,以便 boto3 现在可以使用该环境变量来指定 AWS 凭证路径。

有人知道怎么做吗?请注意,这是一个生产环境,所以我不能使用任何本地服务器技巧/黑客。

【问题讨论】:

  • 你试过了吗? github.com/qnub/django-boto
  • 登录到您的服务器。切换到根su rootmkdir /root/.aws。从您的主目录cp .aws /root/.aws。现在凭据位于服务的正确位置。通常一个 Linux 服务以用户 root 运行。

标签: django environment-variables aws-sdk boto3 aws-iot


【解决方案1】:

我遇到了完全相同的问题,但在 docker 容器中使用 apache 而不是 NGINX。对于容器,我们可以这样做:

  • 编辑 /etc/apache2/envvars 的 apache 环境设置:

    echo "export AWS_SHARED_CREDENTIALS_FILE=/root/.aws/credentials" >> /etc/apache2/envvars

  • 更改 aws 凭证文件父目录的所有权:

    chown -R www-data:www-data /root

  • 重启 阿帕奇:

    service apache2 restart

请注意,此处根目录的所有权已更改。这是因为 aws 需要凭证文件的某些文件权限和所有权(这意味着从现在起只有 www-data 能够使用此登录名。)也许这是一个更好的做法(尤其是如果您在实际运行机器而不是容器)将凭证文件复制到新位置并按照相同的步骤操作:

mkdir -p /home/joe/workdir/.aws/
cp /home/joe/.aws/credentials /home/joe/foo/.aws/credentials
sudo chown -R www-data:www-data home/joe/foo/
sudo echo "export AWS_SHARED_CREDENTIALS_FILE=/home/joe/foo/.aws/credentials" >> /etc/apache2/envvars
sudo service apache2 restart

我不知道这是否适合 NGINX 配置,但希望这能有所帮助。

【讨论】:

  • 我认为更改/root 目录的所有权不是一个安全/好主意。您不能将凭据保存在另一个位置并将AWS_SHARED_CREDENTIALS_FILE 指向那里吗?
【解决方案2】:

如果您从 EC2 实例运行 Django 应用程序,最佳做法是将 IAM 角色关联到该实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 2018-06-03
    • 2017-12-09
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多