Google-Cloud-Platform
我做Google云部署錯了嗎?
我以前使用過 Heroku 和 AWS,現在正在使用 App Engine 和 Cloud SQL (Postgres) 在 Google Cloud 平台上設置服務。
我們嘗試使用 12 要素原則來建構應用程序。
事實證明,設置是如此乏味,以至於我開始懷疑我是否從根本上錯過了一些東西。
以下是讓我感到困惑的事情:
- 鼓勵將密碼寫入以原始碼控制 (app.yaml) 結尾的文件。
- 需要破解載入環境變數的解決方法(如果我不希望它們送出到原始碼控制)。
- 找到它以連接到雲 sql 實例我需要一行引用 app.yaml 中的特定實例 - 所以現在我需要 app.staging.yaml 和 app.production.yaml ?
- 發現那條線似乎只支持 1 個數據庫實例,如果我們希望應用程序連接到 2 個數據庫,則不清楚是否支持。
我是否錯過了伺服器管理方面的一些重大發展,這些發展已成為最佳實踐?剛剛發現 #3 和 #4,我真的開始認為我一定在我的設置中做了一些根本性的錯誤。我有沒有?
我沒有專門嘗試按照您描述的方式配置應用程序,但我知道這些不是 Google 想要的。為了解決一些細節:
- 連接到 Cloud SQL特別說明以下內容,建議儲存密碼不是他們想要的,並為機密提供單獨的解決方案。
# Remember - storing secrets in plaintext is potentially unsafe. Consider using # something like https://cloud.google.com/secret-manager/docs/overview to help keep # secrets secret.
- 根據這篇文章,Google App 引擎不支持 app.yaml 中的環境變數(評論 Google App Engine 類似問題)。我對類似問題的修復是以下程式碼:
#!/bin/bash # deploy-helper.sh prepare_yaml() { [ -z "$1" ] && echo "ERROR: template.yaml filename must be provided." && exit 1 template="${1}" # ARG #1 : filename of template yaml finalYAML=$(mktemp) # make temporary file generated_stdin_cmds="$(echo "cat <<EOF >\"$finalYAML\""; cat $template; echo EOF;)" source /dev/stdin <<< "$generated_stdin_cmds" echo "$finalYAML"; # return filepath of filled-in file return 0 } # Set environment variables TYPE="prod" # in script file source env/production.vars # read them in from a file DEPLOYMENT_FILE="app.flexible.yaml" tmpfile="$(prepare_yaml "app.tpl.yaml")" if [ $? -eq 0 ]; then mv "$tmpfile" "$PWD/$DEPLOYMENT_FILE" # gcloud wants specific filename gcloud app deploy "$DEPLOYMENT_FILE" rm "$DEPLOYMENT_FILE" # Cleanup temporary file fi
注意:這個腳本也可以通過使用 subprocess 庫在 python 中編寫。這就是我為我的 GKE 項目自動建構的方式。
接下來,獲取您的應用程序 app.yaml 文件並添加 bash 變數字元串替換,如以下範例 app-tpl.flexible.yaml:
# example app-tpl.flexible.yaml --- runtime: custom env: flex env_variables: MYSQL_SOCK: "/cloudsql/${project}:${region}:${instance}" MYSQL_DB: "${db_name}" MYSQL_USER: "${db_user}" MYSQL_PASSWORD: "${db_pw}"
製作包含必要變數的文件(在原始碼管理中忽略)
#!/bin/bash # FILE: env/production.vars project="project-name" region="europe-west1" instance="prod001" db_name="db001" db_user="root" db_pw="qwerty"
- 這應該通過答案#2來解決。在腳本上添加一個標誌/選項以執行交換 SQL 實例或更改環境變數名稱。
- 看起來您需要配置兩個 CloudSQL 連接實例,然後自動 CloudSQL 代理將能夠連接到 2 個數據庫。請參閱cloud.google.com/sql/docs/mysql/connect-app-engine-flexible和這個答案,因為他們可以使用不同的埠號。
祝你好運!