web-dev-qa-db-ja.com

エラー:(gcloud.beta.functions.deploy)...メッセージ= [呼び出し元に権限がありません]

私はこのリポジトリからコードをデプロイしようとしています:

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

google Cloud Build。私のcloudbuild.yamlファイルの内容は次のとおりです。

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

Cloud Build Serviceアカウント(****@cloudbuild.gserviceaccount.com)に次の役割を付与しました:

  • Cloud Buildサービスアカウント
  • Cloud Functions開発者

それでも、私のCloud Buildログに次のエラーが表示されます。

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

何が欠けていますか?

13
anishkny

Cloud Buildドキュメント によると、Cloud Functionsの場合は、サービスアカウントに「プロジェクト編集者」の役割を付与する必要があります。

ただし、 Cloud Functionsのドキュメント には、プロジェクト編集者の役割を使用する代わりに、「Cloud Functionsの開発者の役割を使用することもできますが、サービスアカウントユーザーの役割が付与されていることを確認してください」と記載されています。サービスアカウントに関しては、「プロジェクトでCloudFunctions.ServiceAgentの役割」を持ち、「Pub/Subや関数をトリガーするCloud Storageバケットなどのトリガーソースに対する権限を持っている」ことを示しています。

これらの考慮事項により、私の理解では、サービスアカウントに必要なすべての役割を指定するためのドキュメントは省略され、プロジェクト編集者の役割を付与するよう直接指示されました。

2
Neri

Cloud Functionsが(おそらく)GAになったときに、権限が変更されたようです。別の顧客が本日この問題を提起し、私はあなたの質問を思い出しました。

Cloud Buildロボット(${NUM}@cloudbuild.gserviceaccount.com)は、さらに${PROJECT-ID}@appspot.gserviceaccount.comアカウントのserviceAccountUserである必要があります。

[〜#〜] nb [〜#〜] Cloud Buildロボットのローカルパーツはプロジェクト番号(${NUM})ですが、appspotロボットのローカルパーツはプロジェクトID(${PROJECT}

してみてください:

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}

お知らせ下さい!

3
DazWilkin

かなりのドキュメントを読んだ後、私もこれに苦労しました。上記の回答の組み合わせにより、私は正しい軌道に乗った。基本的に、次のようなものが必要です。

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'  

また、IAMコンソールを使用して@ cloudbuild.gserviceaccount.comアカウントに「Cloud Functions Developer」ロールを追加しました。

1
Mithrill