Как получить доступ к секретам GSM через Cloud Build и перейти к функции Cloud - PullRequest
1 голос
/ 10 февраля 2020

Как передать секрет из Google Secrets Manager (GSM) в облачную функцию при использовании Cloud Build? Ниже cloudbuild.yaml имеет три шага. Кроме того, я использую volumes для создания постоянного хранилища между этапами сборки. Я могу подтвердить получение GSM с помощью Cloud Build. Однако, когда я пытаюсь передать секрет в формате yaml, используя --env-vars-file, я сталкиваюсь со следующей ошибкой ...

Already have image (with digest): gcr.io/cloud-builders/gcloud
ERROR: gcloud crashed (AttributeError): 'str' object has no attribute 'items'

cloudbuild.yaml:

steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    volumes:
    - name: 'secrets'
      path: '/secrets'
    entrypoint: "bash"
    args:
      - "-c"
      - |
        echo -n 'gsm_secret:' > /secrets/my-secret-file.txt
  - name: 'gcr.io/cloud-builders/gcloud'
    volumes:
    - name: 'secrets'
      path: '/secrets'
    entrypoint: "bash"
    args:
      - "-c"
      - |
        gcloud components update
        gcloud beta secrets versions access --secret=MySecret latest >> /secrets/my-secret-file.txt
        cat /secrets/my-secret-file.txt
  - name: 'gcr.io/cloud-builders/gcloud'
    volumes:
      - name: 'secrets'
        path: '/secrets'
    args: [
      'functions', 'deploy', 'gsm-foobar',
      '--project=[...]',
      '--trigger-http',
      '--runtime=go111',
      '--region=us-central1',
      '--memory=256MB',
      '--timeout=540',
      '--entry-point=GSM',
      '--allow-unauthenticated',
      '--source=https://source.developers.google.com/[...]',
      '--service-account', '[...]@appspot.gserviceaccount.com',
      '--env-vars-file', '/secrets/my-secret-file.txt'
    ]

Обновление: Использование томов не требуется, поскольку /workspace - это постоянное хранилище между этапами в Cloud Build. Кроме того, gcloud components update больше не требуется, поскольку версия Cloud SDK по умолчанию на сегодняшний день составляет 279.0.0

A Решение:

steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: "bash"
    args:
      - "-c"
      - |
        echo "gsm_secret: $(gcloud beta secrets versions access --secret=MySecret latest)" > /workspace/my-secret-file.txt
        cat /workspace/my-secret-file.txt
  - name: 'gcr.io/cloud-builders/gcloud'
    args: [
      'functions', 'deploy', 'gsm-foobar',
      [...]
      '--entry-point=GSM',
      '--allow-unauthenticated',
      '--source=https://source.developers.google.com/[...]',
      '--service-account', '[...]@appspot.gserviceaccount.com',
      '--env-vars-file=/workspace/my-secret-file.txt'
    ]

1 Ответ

1 голос
/ 11 февраля 2020

При втором чтении я понимаю, что ваш второй шаг помещает секретное значение в файл. Я думаю, что вам не хватает новой строки.

NB Я не пробовал это для себя!

Убедитесь, что у вас есть новая строка в конце вашего файла секретов.

См .: https://cloud.google.com/functions/docs/env-var

Обновление: попытался; -)

Я думаю, что ваша проблема была последней строкой.

Использование следующего шага перед развертыванием работает:

echo "gsm_secret: $(gcloud beta secrets versions access --secret=MySecret latest)" > /secrets/my-secret-file.txt

Или, проще, возможно:

steps:
  - name: "gcr.io/cloud-builders/gcloud"
    entrypoint: /bin/bash
    args:
      - "-c"
      - |
        gcloud functions deploy ... \
        --set-env-vars=NAME=$(gcloud beta secrets versions access --secret=name latest)

Также см. secretEnv . Это более элегантный механизм. Возможно, Google должен расширить эту функциональность для поддержки секретного менеджера (в дополнение к KMS).

...