Django - 是否可以直接在设置文件中从云服务加载机密/密码/动态值

use*_*ser 7 django amazon-ec2 amazon-web-services google-cloud-platform

我想在应用程序启动时从云动态加载我的 Django 设置文件中的一些值,即:

  1. 数据库密码
  2. 数据库IP地址

将 python 代码添加到设置文件以从云中检索这些值是否是一个好习惯?

我相信这些只会在应用程序启动时加载一次,即它们不会对我的应用程序的性能产生不利影响。

例如 :

# ~ settings.py ~

# retrieve data from the cloud, directly in the settings file
db_password   = get_my_secrets()
db_ip_address = discover_db_ip()

# configure the database with these dynamic values
DATABASES = {
    'default': {
        'PASSWORD': db_password,
        'HOST'    : db_ip_address,
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一篇相关文章(@Adiii 分享):云中的 Django 设置

Adi*_*iii 5

您可以有多个选项来加载这些配置而无需更改代码。

秘密经理

AWS Secrets Manager 可帮助您保护访问应用程序、服务和 IT 资源所需的秘密。该服务使您能够在整个生命周期中轻松轮换、管理和检索数据库凭据、API 密钥和其他机密

使用 AWS 密钥管理器,您可以更改/更新数据库主机或您的密钥,而无需更改代码。例如

    secret_name = "db_password"
    region_name = "us-west-2"
    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )
    get_secret_value_response = client.get_secret_value(SecretId=secret_name)
    db_password   = get_secret_value_response
Run Code Online (Sandbox Code Playgroud)

秘密经理

带有 s3 的点 ENV

Dot ENV是从其中读取键值对.env file并将它们添加到环境变量中。它非常适合使用 12 因素原则在开发和生产期间管理应用程序设置。

在启动应用程序之前,使用所有机密创建 Dot ENV 文件并将文件放在 s3 上,然后从 s3 中提取文件并启动应用程序。

import os
SECRET_KEY = os.getenv("EMAIL")
db_password = os.getenv("db_password")
Run Code Online (Sandbox Code Playgroud)

Python 点 ENv

另一种选择是仅使用系统环境变量。

db_password=os.getenv('db_password', default_pass)
Run Code Online (Sandbox Code Playgroud)