web-dev-qa-db-fra.com

ERREUR: (gcloud.beta.functions.deploy) ... message = [L'appelant n'a pas la permission]

J'essaie de déployer le code de ce dépôt:

https://github.com/anishkny/puppeteer-on-cloud-functions

dans Google Cloud Build. Le contenu de mon fichier cloudbuild.yaml est le suivant:

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['beta', 'functions', 'deploy', 'screenshot', '--trigger-http', '--runtime', 'nodejs8', '--memory', '1024MB']

J'ai attribué les rôles suivants à mon compte Cloud Build Service (****@cloudbuild.gserviceaccount.com):

  • Compte de service Cloud Build
  • Développeur de fonctions cloud

Pourtant, dans mon journal Cloud Build, l'erreur suivante apparaît:

starting build "1f04522c-fe60-4a25-a4a8-d70e496e2821"

FETCHSOURCE
Fetching storage object: gs://628906418368.cloudbuild-source.googleusercontent.com/94762cc396ed1bb46e8c5dbfa3fa42550140c2eb-b3cfa476-cb21-45ba-849c-c28423982a0f.tar.gz#1534532794239047
Copying gs://628906418368.cloudbuild-source.googleusercontent.com/94762cc396ed1bb46e8c5dbfa3fa42550140c2eb-b3cfa476-cb21-45ba-849c-c28423982a0f.tar.gz#1534532794239047...
/ [0 files][    0.0 B/  835.0 B]                                                
/ [1 files][  835.0 B/  835.0 B]                                                
Operation completed over 1 objects/835.0 B.                                      
tar: Substituting `.' for empty member name
BUILD
Already have image (with digest): gcr.io/cloud-builders/gcloud
ERROR: (gcloud.beta.functions.deploy) ResponseError: status=[403], code=[Forbidden], message=[The caller does not have permission]
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/gcloud" failed: exit status 1

Qu'est-ce que je rate?

4
anishkny

Selon la documentation Cloud Build , pour les fonctions de cloud, vous devez attribuer le rôle "Editeur de projet" à votre compte de service. 

Cependant, la documentation relative aux fonctions de cloud indique que vous pouvez également utiliser "le rôle de développeur de fonctions de cloud [mais vous devez] vérifier que vous avez bien attribué le rôle d'utilisateur du compte de service". En ce qui concerne les comptes de service, cela signifie que vous devez avoir "le rôle CloudFunctions.ServiceAgent sur votre projet" et "disposer d'autorisations pour les sources de déclenchement, telles que le compartiment Pub/Sub ou Cloud Storage déclenchant votre fonction". 

En raison de ces considérations, j'ai cru comprendre que la documentation omettait de spécifier tous les rôles dont votre compte de service aurait besoin et allait directement à attribuer le rôle d'Éditeur de projet.

2
Neri

Il semblerait que les autorisations aient changé lorsque (peut-être) Cloud Functions est passé en GA. Un autre client a soulevé la question aujourd'hui et je me suis rappelé votre question.

Le robot Cloud Build (${NUM}@cloudbuild.gserviceaccount.com) doit en outre être un serviceAccountUser du compte ${PROJECT-ID}@appspot.gserviceaccount.com:

NBAlors que la partie locale du robot Cloud Build est le numéro de projet (${NUM}), la partie locale du robot appspot est l'ID du projet (${PROJECT}).

S'il vous plaît essayez:

PROJECT=[[YOUR-PROJECT-ID]]

NUM=$(gcloud projects describe $PROJECT --format='value(projectNumber)')

gcloud iam service-accounts add-iam-policy-binding \
${PROJECT}@appspot.gserviceaccount.com \
--member=serviceAccount:${NUM}@cloudbuild.gserviceaccount.com \
--role=roles/iam.serviceAccountUser \
--project=${PROJECT}

Faites le moi savoir!

3
DazWilkin

J'ai eu du mal avec cela aussi après avoir lu pas mal de documentation. Une combinaison des réponses ci-dessus m'a mis sur la bonne voie. Fondamentalement, quelque chose comme ce qui suit est nécessaire:

PROJECT=[PROJECT-NAME]

NUM=$(gcloud projects describe $PROJECT --format='value(projectNumber)')

gcloud iam service-accounts add-iam-policy-binding \
${PROJECT}@appspot.gserviceaccount.com \
--member=serviceAccount:${NUM}@cloudbuild.gserviceaccount.com \
--role=roles/iam.serviceAccountUser \
--project=${PROJECT}

gcloud iam service-accounts add-iam-policy-binding \
    ${PROJECT}@[INSERT_YOUR_IAM_OWNER_SERVICE_ACCOUNT_NAME].iam.gserviceaccount.com \
    --member='serviceAccount:service-${NUM}@gcf-admin-robot.iam.gserviceaccount.com' \
    --role='roles/iam.serviceAccountUser'  

De plus, j'ai ajouté le rôle "Développeur de fonctions de cloud" à mon compte @ cloudbuild.gserviceaccount.com via la console IAM.

1
Mithrill