Google-Cloud-Platform

我做Google云部署錯了嗎?

  • August 17, 2021

我以前使用過 Heroku 和 AWS,現在正在使用 App Engine 和 Cloud SQL (Postgres) 在 Google Cloud 平台上設置服務。

我們嘗試使用 12 要素原則來建構應用程序。

事實證明,設置是如此乏味,以至於我開始懷疑我是否從根本上錯過了一些東西。

以下是讓我感到困惑的事情:

  1. 鼓勵將密碼寫入以原始碼控制 (app.yaml) 結尾的文件。
  2. 需要破解載入環境變數的解決方法(如果我不希望它們送出到原始碼控制)。
  3. 找到它以連接到雲 sql 實例我需要一行引用 app.yaml 中的特定實例 - 所以現在我需要 app.staging.yaml 和 app.production.yaml ?
  4. 發現那條線似乎只支持 1 個數據庫實例,如果我們希望應用程序連接到 2 個數據庫,則不清楚是否支持。

我是否錯過了伺服器管理方面的一些重大發展,這些發展已成為最佳實踐?剛剛發現 #3 和 #4,我真的開始認為我一定在我的設置中做了一些根本性的錯誤。我有沒有?

我沒有專門嘗試按照您描述的方式配置應用程序,但我知道這些不是 Google 想要的。為了解決一些細節:

  1. 連接到 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.
  1. 根據這篇文章,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"
  1. 這應該通過答案#2來解決。在腳本上添加一個標誌/選項以執行交換 SQL 實例或更改環境變數名稱。
  2. 看起來您需要配置兩個 CloudSQL 連接實例,然後自動 CloudSQL 代理將能夠連接到 2 個數據庫。請參閱cloud.google.com/sql/docs/mysql/connect-app-engine-flexible和這個答案,因為他們可以使用不同的埠號。

祝你好運!

引用自:https://serverfault.com/questions/905620