我在做 Google Cloud 部署错了吗?

Chr*_*isJ 6 google-app-engine google-cloud-sql google-cloud-platform

我以前使用过 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 后,我真的开始认为我一定在我的设置中做了一些根本性的错误。我有没有?

小智 3

我没有专门尝试按照您所描述的方式配置应用程序,但我知道这些并不是 Google 想要的结果。为了解决一些具体问题:

  1. Connecting to 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.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根据本文,Google App Engine 不支持 app.yaml 中的环境变量(Google App Engine 类似问题的评论)。我对类似问题的修复是以下代码:

    # 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.
    
    Run Code Online (Sandbox Code Playgroud)

    注意:该脚本也可以使用 subprocess 库用 python 编写。这就是我自动构建 GKE 项目的方法。

    接下来,获取应用程序 app.yaml 文件并添加 bash 变量字符串替换,如示例 app-tpl.flexible.yaml 所示:

    #!/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
    
    Run Code Online (Sandbox Code Playgroud)

    制作包含必要变量的文件(在源代码管理中忽略)

    # 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}"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这应该通过答案#2 来解决。在要执行的脚本上添加标志/选项以交换 SQL 实例或更改环境变量名称。

  4. 看起来您需要配置两个 CloudSQL 连接实例,然后自动 CloudSQL 代理将能够连接到 2 个数据库。请参阅cloud.google.com/sql/docs/mysql/connect-app-engine-flexible和这个答案,因为他们让它使用不同的端口号。

祝你好运!