我一直试图从GCP调度程序中调用GCP函数(--runtime nodejs8 --trigger-http),两者都位于同一个项目中。只有通过将allUsers成员添加到函数权限并应用Cloud Functions-Invoker角色来授予未经身份验证的访问,我才能使其工作。但是,当我只使用调度程序的服务帐户作为Cloud Functions-Invoker时,我会得到一个拒绝权限的错误。
我创建了一个hello world示例,详细展示了我的设置是什么样子的。
gcloud iam service-accounts create scheduler --display-name="Task Schedule Runner"
svc_policy.json:
{
"bindings": [
{
"members": [
"serviceAccount:scheduler@mwsdata-1544225920485.iam.gserviceaccount.com"
],
"role": "roles/cloudscheduler.serviceAgent"
}
]
}
gcloud iam service-accounts set-iam-policy scheduler@mwsdata-1544225920485.iam.gserviceaccount.com svc_policy.json -qgcloud functions deploy helloworld --runtime nodejs8 --trigger-http --entry-point=helloWorld
gcloud functions add-iam-policy-binding helloworld --member serviceAccount:scheduler@mwsdata-1544225920485.iam.gserviceaccount.com --role roles/cloudfunctions.invoker
gcloud beta scheduler jobs create http test-job --schedule "5 * * * *" --http-method=GET --uri=https://us-central1-mwsdata-1544225920485.cloudfunctions.net/helloworld --oidc-service-account-email=scheduler@mwsdata-1544225920485.iam.gserviceaccount.com --oidc-token-audience=https://us-central1-mwsdata-1544225920485.cloudfunctions.net/helloworld
日志:权限被拒绝
{
httpRequest: {
}
insertId: "1ny5xuxf69w0ck"
jsonPayload: {
@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
jobName: "projects/mwsdata-1544225920485/locations/europe-west1/jobs/test-job"
status: "PERMISSION_DENIED"
targetType: "HTTP"
url: "https://us-central1-mwsdata-1544225920485.cloudfunctions.net/helloworld"
}
logName: "projects/mwsdata-1544225920485/logs/cloudscheduler.googleapis.com%2Fexecutions"
receiveTimestamp: "2020-02-04T22:05:05.248707989Z"
resource: {
labels: {
job_id: "test-job"
location: "europe-west1"
project_id: "mwsdata-1544225920485"
}
type: "cloud_scheduler_job"
}
severity: "ERROR"
timestamp: "2020-02-04T22:05:05.248707989Z"
}更新
以下是相应的设置。
调度程序服务帐户
gcloud iam service-accounts get-iam-policy scheduler@mwsdata-1544225920485.iam.gserviceaccount.com
bindings:
- members:
- serviceAccount:scheduler@mwsdata-1544225920485.iam.gserviceaccount.com
role: roles/cloudscheduler.serviceAgent
etag: BwWdxuiGNv4=
version: 1IAM职能政策:
gcloud functions get-iam-policy helloworld
bindings:
- members:
- serviceAccount:scheduler@mwsdata-1544225920485.iam.gserviceaccount.com
role: roles/cloudfunctions.invoker
etag: BwWdxyDGOAY=
version: 1功能描述
gcloud functions describe helloworld
availableMemoryMb: 256
entryPoint: helloWorld
httpsTrigger:
url: https://us-central1-mwsdata-1544225920485.cloudfunctions.net/helloworld
ingressSettings: ALLOW_ALL
labels:
deployment-tool: cli-gcloud
name: projects/mwsdata-1544225920485/locations/us-central1/functions/helloworld
runtime: nodejs8
serviceAccountEmail: mwsdata-1544225920485@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-671641e6-3f1b-41a1-9ac1-558224a1638a/b4a0e407-69b9-4f3d-a00d-7543ac33e013.zip?GoogleAccessId=service-617967399269@gcf-admin-robot.iam.gserviceaccount.com&Expires=1580854835&Signature=S605ODVtOpnU4LIoRT2MnU4OQN3PqhpR0u2CjgcpRcZZUXstQ5kC%2F1rT6Lv2SusvUpBrCcU34Og2hK1QZ3dOPluzhq9cXEvg5MX1MMDyC5Y%2F7KGTibnV4ztFwrVMlZNTj5N%2FzTQn8a65T%2FwPBNUJWK0KrIUue3GemOQZ4l4fCf9v4a9h6MMjetLPCTLQ1BkyFUHrVnO312YDjSC3Ck7Le8OiXb7a%2BwXjTDtbawR20NZWfgCCVvL6iM9mDZSaVAYDzZ6l07eXHXPZfrEGgkn7vXN2ovMF%2BNGvwHvTx7pmur1yQaLM4vRRprjsnErU%2F3p4JO3tlbbFEf%2B69Wd9dyIKVA%3D%3D
status: ACTIVE
timeout: 60s
updateTime: '2020-02-04T21:51:15Z'
versionId: '1'调度程序任务描述
gcloud scheduler jobs describe test-job
attemptDeadline: 180s
httpTarget:
headers:
User-Agent: Google-Cloud-Scheduler
httpMethod: GET
oidcToken:
audience: https://us-central1-mwsdata-1544225920485.cloudfunctions.net/helloworld
serviceAccountEmail: scheduler@mwsdata-1544225920485.iam.gserviceaccount.com
uri: https://us-central1-mwsdata-1544225920485.cloudfunctions.net/helloworld
lastAttemptTime: '2020-02-05T09:05:00.054111Z'
name: projects/mwsdata-1544225920485/locations/europe-west1/jobs/test-job
retryConfig:
maxBackoffDuration: 3600s
maxDoublings: 16
maxRetryDuration: 0s
minBackoffDuration: 5s
schedule: 5 * * * *
scheduleTime: '2020-02-05T10:05:00.085854Z'
state: ENABLED
status:
code: 7
timeZone: Etc/UTC
userUpdateTime: '2020-02-04T22:02:31Z'发布于 2020-02-07 12:17:36
下面是让Cloud触发HTTP触发云函数不允许未经身份验证的调用的步骤:
gcloud scheduler jobs create http [JOB-NAME] --schedule="* * * * *" --uri=[CLOUD-FUNCTIONS-URL] --oidc-service-account-email=[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com在您的特定情况下,您将保留云函数的默认App服务帐户。将其更改为按照前面步骤中指定的方式创建的服务帐户。
发布于 2020-04-23 18:54:26
@Marko I经历了同样的问题,它似乎重新启用(禁用/启用)调度程序API进行了修复。这就是为什么创建一个新项目是有意义的,因为这样做可能会获得调度程序服务帐户。因此,如果您的项目没有从google创建的调度程序服务帐户,那么执行此技巧将为您提供一个。虽然您不需要将这个特定的服务帐户分配给您的任何任务,但它必须是可用的。你可以在这里看到我的作品:如何通过认证从云调度程序调用云函数
发布于 2021-06-11 13:42:38
我也有过类似的问题。
在我们的例子中,我们很久以前就启用了。
根据医生们的说法,如果在2019年3月19日之前启用了Cloud Scheduler API ,则需要手动将Cloud Scheduler Service Agent角色添加到Cloud Scheduler服务帐户中。
因此,我们必须创建一个新的服务帐户,类似于这个service-[project-number]@gcp-sa-cloudscheduler.iam.gserviceaccount.com。
希望这能对其他人有所帮助。
https://stackoverflow.com/questions/60055422
复制相似问题