亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

環境屬性不會傳遞到 Elastic Beanstalk 中的應用程序

環境屬性不會傳遞到 Elastic Beanstalk 中的應用程序

DIEA 2023-12-29 16:01:06
部署我的 Django 項目時,未配置數據庫設置,因為'RDS_HOSTNAME' in os.environ返回false. 事實上,部署時沒有可用的環境屬性。所有這些屬性在部署后都可用。運行/opt/elasticbeanstalk/bin/get-config environment返回如下:{"DJANGO_SETTINGS_MODULE":"myApp.settings","PYTHONPATH":"/var/app/venv/staging-LQM1lest/bin:$PYTHONPATH","RDS_DB_NAME":"ebdb","RDS_HOSTNAME":"xxxx.amazonaws.com","RDS_PASSWORD":"xxxx","RDS_PORT":"xxxx","RDS_USERNAME":"xxxx"}所有 RDS 前綴屬性均已設置,但仍os.environ無法讀取。setting.py文件:# [...]if 'RDS_HOSTNAME' in os.environ:    DATABASES = {        'default': {            'ENGINE': 'django.db.backends.mysql',            'NAME': os.environ['RDS_DB_NAME'],            'USER': os.environ['RDS_USERNAME'],            'PASSWORD': os.environ['RDS_PASSWORD'],            'HOST': os.environ['RDS_HOSTNAME'],            'PORT': os.environ['RDS_PORT'],        }    }# [...]我是否需要進行任何更改才能使這些屬性在部署時可用?
查看完整描述

3 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

看起來這是一個嚴重的錯誤,AWS 并不關心它。我想出了幾種方法來完成這項工作,但所有這些方法都需要登錄到 EB 環境并執行一些手動工作。

解決方案1

  1. 創建 AWS 秘密管理器

  2. 檢查IAM instance profileEB的環境Configuration->Security->Edit。

  3. 然后轉到 IAM 用戶控制臺并轉到Roles.?從那里,您可以將策略附加到秘密管理器的實例配置文件。

  4. 完成后,部署項目

  5. 然后登錄環境(eb ssh environment_name)。

  6. 轉到/var/app/current/目錄并運行以下命令:source /var/app/venv/*/bin/activate。

  7. 終于跑了python3 manage.py migrate。

解決方案2

  1. 編輯.bash_profile并在文件末尾添加導出這些變量:

    ?export?RDS_DB_NAME=your_dbname
    ?export?RDS_USERNAME=user
    ?export?RDS_PASSWORD=pass
    ?export?RDS_HOSTNAME=host_endpoint
    ?export?RDS_PORT=3306
  2. 跑步source ~/.bash_profile

  3. 現在您可以部署您的項目了。

解決方案3

  1. 在 EB 環境配置中設置所有環境屬性。(轉到Configuration->Software->Edit->Environment properties并添加鍵和值)。

https://img1.sycdn.imooc.com/658e7d1d00014e0006190116.jpg

2. 在開頭添加此代碼片段settings.py


? ? from pathlib import Path

? ? import os

? ? import subprocess

? ? import ast



? ? def get_environ_vars():

? ? ? ? completed_process = subprocess.run(

? ? ? ? ? ? ['/opt/elasticbeanstalk/bin/get-config', 'environment'],

? ? ? ? ? ? stdout=subprocess.PIPE,

? ? ? ? ? ? text=True,

? ? ? ? ? ? check=True

? ? ? ? )


? ? ? ? return ast.literal_eval(completed_process.stdout)

轉到數據庫部分并將其替換為此代碼片段


?if 'RDS_HOSTNAME' in os.environ:

? ? ?DATABASES = {

? ? ? ? ?'default': {

? ? ? ? ?'? ? ENGINE': 'django.db.backends.mysql',

? ? ? ? ? ? ? 'NAME': os.environ['RDS_DB_NAME'],

? ? ? ? ? ? ? 'USER': os.environ['RDS_USERNAME'],

? ? ? ? ? ? ? 'PASSWORD': os.environ['RDS_PASSWORD'],

? ? ? ? ? ? ? 'HOST': os.environ['RDS_HOSTNAME'],

? ? ? ? ? ? ? 'PORT': os.environ['RDS_PORT'],

? ? ?}

?}

?else:

? ? ?env_vars = get_environ_vars()

? ? ?DATABASES = {

? ? ? ? ?'default': {

? ? ? ? ?'ENGINE': 'django.db.backends.mysql',

? ? ? ? ?'NAME': env_vars['RDS_DB_NAME'],

? ? ? ? ?'USER': env_vars['RDS_USERNAME'],

? ? ? ? ?'PASSWORD': env_vars['RDS_PASSWORD'],

? ? ? ? ?'HOST': env_vars['RDS_HOSTNAME'],

? ? ? ? ?'PORT': env_vars['RDS_PORT'],

? ? ?}

?}

  1. 部署項目。

  2. 登錄環境 (?eb ssh environment_name)。

  3. 轉到/var/app/current/目錄并運行以下命令:source /var/app/venv/*/bin/activate。

  4. 終于跑了python3 manage.py migrate。

結論:

解決方案 1不太復雜,而且秘密管理器不是免費的(僅限 30 天試用)。
解決方案 2最簡單的一種,但我不建議在 EB 上手動調整任何文件。
解決方案 3是一個干凈的解決方案,我將使用它。該解決方案還可以在將來修復此錯誤。


查看完整回答
反對 回復 2023-12-29
?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

在系統中使用環境屬性,例如。運行 Symfony 命令(使用 envs)你可以簡單地運行這個:

/opt/elasticbeanstalk/bin/get-config environment | jq -r "to_entries|map(\"export \(.key)='\(.value|tostring)'\")|.[]" >> /home/ec2-user/.bash_profile

它將在 .bash_profile 中添加您的所有道具,因此當您通過 SSH 登錄時,它們將全部設置完畢。當然,最好將其添加到 .ebextensions/*.config 的 Commands: 部分下。


查看完整回答
反對 回復 2023-12-29
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

AWS 官方提供的從 EC2 級別提供環境變量的解決方案也解決了這個問題:

https://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-shell/


查看完整回答
反對 回復 2023-12-29
  • 3 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號