[DOCKER]

Übersicht In Cloud Build - Verwenden von Docker in Schritten - Wenn Sie auch Application Default Credential von Docker verwenden möchten, übergeben Sie "--network = cloudbuild".

Annahme

Verwenden Sie beispielsweise berglas. Wenn Sie in der Umgebungsvariablen einen Verweis auf vertrauliche Informationen in einem bestimmten Format einfügen, ruft berglas den Wert ab. Wenn Sie beispielsweise "FOO = sm: // $ PROJECT_ID / $ SECRET_NAME berglas exec --bar" ausführen, wird der vom Secret Manager abgerufene Wert in die Umgebungsvariable "FOO" eingefügt und "bar" ausgeführt.

Vorbereitung

Geben Sie im Secret Manager zunächst einen Wert in das Geheimnis "TEST" ein.

$  echo -n "supersecret" | gcloud beta secrets create TEST --replication-policy automatic --data-file=-

Fügen Sie außerdem die Rolle des geheimen Zugriffs zum Cloud Build-Ausführungsdienstkonto hinzu.

$ gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:$(gcloud projects describe $PROJECT_ID --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com" \
  --role roles/secretmanager.secretAccessor

Experiment

Die Umgebungsvariable wird von "env" ausgegeben, um das Experiment zu vereinfachen. Sie wird jedoch im Protokoll aufgezeichnet. Verwenden Sie sie daher nicht so, wie sie ist, wenn Sie wirklich mit geheimen Informationen umgehen.

Ein Beispiel, das funktioniert, weil Docker im Schritt nicht verwendet wird

Lassen Sie uns zunächst das Bild von berglas direkt verwenden.

cloudbuild.yaml


steps:
  - name: 'asia-docker.pkg.dev/berglas/berglas/berglas:latest'
    args:
      - 'exec'
      - '--'
      - 'env'
    env:
      - 'TEST=sm://$PROJECT_ID/TEST'

Lass es uns jetzt laufen lassen.

$ gcloud builds submit --config cloudbuild.yaml --no-source
...
TEST=supersecret
...

Ich konnte den restaurierten TEST sehen.

Schlechtes Beispiel

Versuchen Sie als nächstes, berglas über "Docker Run" im Build-Schritt zu verwenden.

cloudbuild.yaml


steps:
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'run'
      - '-e'
      - 'TEST=sm://$PROJECT_ID/TEST'
      - 'asia-docker.pkg.dev/berglas/berglas/berglas:latest'
      - 'exec'
      - '--'
      - 'env'

Dann ...

$ gcloud builds submit --config cloudbuild.yaml --no-source
...
failed to access secret sm://$PROJECT_ID/TEST: failed to access secret: rpc error: code = Unauthenticated desc = transport: Get "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform": dial tcp 169.254.169.254:80: i/o timeout
...

Ich bekomme eine Fehlermeldung. Es scheint, dass Sie nicht anfordern können, Application Default Credential aus dem Docker-Container abzurufen.

Mal sehen, was für ein Netzwerk es gibt.

cloudbuild.yaml


steps:
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'network'
      - 'ls'
$ gcloud builds submit --config cloudbuild.yaml --no-source
...
NETWORK ID          NAME                DRIVER              SCOPE
ed09d11c5bd1        bridge              bridge              local
a01cfc17c577        cloudbuild          bridge              local
f3426b77657b        host                host                local
9b756bf55527        none                null                local
...

Wenn Sie den Anwendungsstandard-Berechtigungsnachweis verwenden möchten, müssen Sie das Cloudbuild-Netzwerk übergeben. (Host ist nicht gut.) Dies ist auch dokumentiert.

Beispiele, die funktionieren

cloudbuild.yaml


steps:
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'run'
      - '--network=cloudbuild' #hinzufügen
      - '-e'
      - 'TEST=sm://$PROJECT_ID/TEST'
      - 'asia-docker.pkg.dev/berglas/berglas/berglas:latest'
      - 'exec'
      - '--'
      - 'env'
$ gcloud builds submit --config cloudbuild.yaml --no-source
...
TEST=supersecret
...

Ich konnte es sicher sehen.

Fazit

Wenn Sie den Docker-Container im Schritt "Cloud-Erstellung" verwenden und auch den Anwendungsstandard-Berechtigungsnachweis aus dem Container verwenden möchten, übergeben Sie "--network = cloudbuild".

Referenz

Recommended Posts