17 votes

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

J'essaie de déployer du code à partir 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 du service Cloud Build
  • Développeur de fonctions en nuage

Pourtant, dans mon journal de construction du Cloud, je vois l'erreur suivante :

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 ?

16voto

DazWilkin Points 825

Il semblerait que les permissions aient changé lorsque (peut-être) Cloud Functions est devenu GA. Un autre client a soulevé ce problème aujourd'hui et je me suis souvenu de votre question.

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

NB Alors 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} )

Essayez, s'il vous plaît :

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-moi savoir !

13voto

Mithrill Points 18

J'ai également eu du mal à résoudre ce problème après avoir lu un certain nombre de documents. 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 "Cloud Functions Developer" à mon compte @cloudbuild.gserviceaccount.com via la console IAM.

11voto

Héctor Neri Points 935

Selon Documentation sur Cloud Build Pour les fonctions cloud, vous devez accorder le rôle "Project Editor" à votre compte de service.

Mais, Documentation sur les fonctions en nuage indique qu'au lieu d'utiliser le rôle d'éditeur de projet, vous pouvez utiliser "le rôle de développeur de fonctions en nuage [mais vous devez] vous assurer que vous avez accordé le rôle d'utilisateur de compte de service". En ce qui concerne les comptes de service, il est indiqué de disposer "du rôle CloudFunctions.ServiceAgent sur votre projet" et de "disposer des autorisations pour les sources de déclenchement, telles que Pub/Sub ou le seau de stockage en nuage déclenchant votre fonction".

En raison de ces considérations, je crois comprendre que la documentation a omis de spécifier tous les rôles dont votre compte de service aurait besoin et a directement indiqué d'accorder le rôle d'éditeur de projet.

1voto

Artem Kashin Points 41

Vous devez mettre à jour les autorisations du compte de service sur la page des paramètres de Cloud Build. Voici les instructions https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-cloud-run#fully-managed

Il vous suffit de définir le statut du rôle d'administrateur Cloud Run sur ENABLED sur cette page :

enter image description here

0voto

M-sAnNan Points 21

Commencez votre construction cloud avec auth

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['auth', 'activate-service-account', 'xoxox@xoxo-dev.iam.gserviceaccount.com', '--key-file=account.json', '--project=rabbito-dev']

et ensuite simplement le déploiement de votre code sur la fonction cloud

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X