N'oubliez pas le réseau cloudbuild si vous utilisez Docker dans les étapes Cloud Build

Aperçu

Avec Cloud Build

--Utilisation de Docker par étapes --Je souhaite également utiliser les informations d'identification par défaut de l'application de Docker

Ensuite, c'est une histoire à passer --network = cloudbuild.

supposition

Par exemple, utilisez berglas. Si vous mettez une référence à des informations confidentielles dans un format spécifique dans la variable d'environnement, berglas récupérera la valeur. Par exemple, si vous exécutez FOO = sm: // $ PROJECT_ID / $ SECRET_NAME berglas exec --bar, la valeur extraite de Secret Manager sera placée dans la variable d'environnement FOO et bar sera exécutée.

Préparation

Tout d'abord, dans Secret Manager, entrez une valeur dans le secret appelé «TEST».

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

Ajoutez également le rôle Secret Accesor au compte de service d'exécution Cloud Build.

$ 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

Expérience

La variable d'environnement est sortie par env pour simplifier l'expérience, mais elle sera enregistrée dans le journal, donc veillez à ne pas l'utiliser telle quelle si vous gérez vraiment des informations secrètes.

Un exemple qui fonctionne car Docker n'est pas utilisé à l'intérieur de l'étape

Tout d'abord, utilisons directement l'image de berglas.

cloudbuild.yaml


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

Lançons-le maintenant.

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

J'ai pu voir le TEST restauré.

Mauvais exemple

Ensuite, essayez d'utiliser berglas via docker run dans l'étape de construction.

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'

Ensuite ...

$ 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
...

J'obtiens une erreur. Il semble que vous ne puissiez pas demander à obtenir les informations d'identification par défaut de l'application à partir du conteneur Docker.

Voyons quel type de réseau existe.

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
...

Si vous souhaitez utiliser les informations d'identification par défaut de l'application, vous devez passer le réseau cloudbuild. ("Host" n'est pas bon.) Ceci est également documenté.

Des exemples qui fonctionnent

cloudbuild.yaml


steps:
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'run'
      - '--network=cloudbuild' #ajouter à
      - '-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
...

J'ai pu le voir en toute sécurité.

Conclusion

Si vous souhaitez utiliser le conteneur Docker dans l'étape Cloud Build et également utiliser les informations d'identification par défaut de l'application du conteneur, transmettez --network = cloudbuild.

référence

Recommended Posts

N'oubliez pas le réseau cloudbuild si vous utilisez Docker dans les étapes Cloud Build
Que faire si la commande rails devient inutilisable
Jusqu'à ce que l'environnement docker soit créé et que le conteneur Ubuntu soit démarré et arrêté