1

Cloud Build を使用しているときに、Google Secrets Manager (GSM) から Cloud Function にシークレットを渡すにはどうすればよいですか? 以下のcloudbuild.yamlには 3 つのステップがあります。さらに、volumesビルドステップの間に永続的なストレージを作成するために使用しています。Cloud Build で GSM の取得が確認できました。ただし、yaml 形式でシークレットを渡そうとする--env-vars-fileと、次のエラーが発生します...

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

クラウドビルド.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 であるため、不要になりました。

解決策:

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'
    ]
4

2 に答える 2

1

2 回目の読み取りで、2 番目のステップで秘密の値がファイルに入れられていることに気付きました。改行が足りないと思います。

NB私はこれを自分で試したことはありません!

secrets ファイルの最後に改行があることを確認してください。

参照: 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も参照してください。これはより洗練されたメカニズムです。この機能は、(KMS に加えて) シークレット マネージャーをサポートするために、おそらく Google によって拡張される必要があります。

于 2020-02-10T22:40:02.483 に答える