【问题标题】:How Can I pass secret manager secret using cloudbuild to app engine environment variable in app.yaml如何使用 cloudbuild 将秘密管理器秘密传递给 app.yaml 中的应用引擎环境变量
【发布时间】:2021-11-29 14:08:31
【问题描述】:

下面是我的 app.yaml

runtime: python39
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
  python_version: 3

env_variables:
     SEC: %sec%

manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

这是我的 cloudbuild.yaml 应用程序引擎试图将一个秘密值传递给 app.yaml 作为 env veriable

   steps:
    - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
      entrypoint: 'bash'
      args: ['-c', "export _VAL=$(echo $$SEC) 
              && echo $$SEC;echo $_VAL  && sed -i 's/%sec%/'$$SEC'/g' app.yaml
              && gcloud config set app/cloud_build_timeout 1600 && gcloud app deploy"
      ]
      secretEnv: ["SEC"]
    availableSecrets:
      secretManager:
      - versionName: projects/$PROJECT_ID/secrets/db_secret/versions/3
        env: 'SEC'
    
    timeout: '1600s'

【问题讨论】:

    标签: google-app-engine google-cloud-platform google-cloud-build google-app-engine-python cicd


    【解决方案1】:

    你的方法是对的,你犯了一个引用错误,因为你试图运行一个内联命令。

    首选| 结构,可读性更高,因此易于调试和编写。每一行都按顺序执行,类似于你的内联命令中的&&

    steps:
        - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
          entrypoint: 'bash'
          args: 
            - '-c'
            - |
               export _VAL=$(echo $$SEC)
               echo $$SEC
               echo $_VAL
               sed -i "s/%sec%/$$SEC/g" app.yaml
               gcloud config set app/cloud_build_timeout 1600 
               gcloud app deploy
          secretEnv: ["SEC"]
        availableSecrets:
          secretManager:
          - versionName: projects/$PROJECT_ID/secrets/db_secret/versions/3
            env: 'SEC'
        
        timeout: '1600s'
    

    编辑 1

    如果您的密码包含破坏 SED 表达式的特殊字符,则会出现错误。您可以使用替代解决方案来替换整行,例如

    steps:
        - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
          entrypoint: 'bash'
          args: 
            - '-c'
            - |
               export _VAL=$(echo $$SEC)
               echo $$SEC
               echo $_VAL
               cat app.yaml | awk "{ if (NR == $(grep -n '%sec%' app.yaml | cut -d : -f 1)) print \"    SEC: $$SEC\"; else print }" > app.yaml
               gcloud config set app/cloud_build_timeout 1600 
               gcloud app deploy
          secretEnv: ["SEC"]
        availableSecrets:
          secretManager:
          - versionName: projects/$PROJECT_ID/secrets/db_secret/versions/3
            env: 'SEC'
        
        timeout: '1600s'
    

    试一试

    【讨论】:

      【解决方案2】:

      我过去只是使用“>>”将环境变量附加到我的 app.yaml 的底部来完成此操作。使用这种方法,您的 app.yaml 的 env_variables 部分需要放在最后。

      虽然我不再使用这种方法,但秘密会显示在您的 cloudbuild 日志中。这些天我只是导入秘密管理器包以在应用程序中获取我的秘密。

      cloudbuild.yaml

      steps:
      - name: "gcr.io/cloud-builders/gcloud"
        secretEnv: ['SECRET_ONE','SECRET_TWO']
        entrypoint: 'bash'
        args: 
        - -c
        - |
          echo $'\n  SECRET_ONE: '$$SECRET_ONE >> app.yaml
          echo $'\n  SECRET_TWO: '$$SECRET_TWO >> app.yaml
          gcloud -q app deploy
      availableSecrets:
        secretManager:
        - versionName: projects/012345678901/secrets/SECRET_ONE
          env: 'SECRET_ONE'
        - versionName: projects/012345678901/secrets/SECRET_TWO
          env: 'SECRET_TWO'
      

      app.yaml

      runtime: go116
      main: cmd
      service: serviceone
      env_variables:
        PROJECT_ID: project-a0a00
        PORT: 8080
      

      【讨论】:

        猜你喜欢
        • 2019-10-27
        • 2020-09-29
        • 2021-12-06
        • 2021-10-04
        • 2022-11-02
        • 2021-06-10
        • 2021-10-18
        • 2021-10-29
        • 2021-12-05
        相关资源
        最近更新 更多