我试图从云函数(Node. js)运行基于经典模板的数据流作业,并得到这个错误-当前用户不能充当服务号(xxx@yyy.iam.gserviceaccount.com)
var opts = {
projectId: "project-id",
location: "asia-south1",
gcsPath: "gs://dataflow-templates/latest/Cloud_Bigtable_to_GCS_Avro",
resource: {
"jobName": "bt-backup-to-gcs-avro" + Date.now(),
"environment": {
"bypassTempDirValidation": false,
"serviceAccountEmail": "xxx@yyy.iam.gserviceaccount.com",
"machineType": "n1-standard-8",
"tempLocation": "gs://some-bucket/some-dir",
"subnetwork": "subnetwork-val",
"network": "network-val",
"ipConfiguration": "WORKER_IP_UNSPECIFIED",
"additionalExperiments": []
},
"parameters": {
"bigtableProjectId": "project-id",
"bigtableInstanceId": "instance-id",
"bigtableTableId": "table-id",
"outputDirectory": "gs://some-bucket/some-dir",
"filenamePrefix": "table-backup-"
}
}
};
dataflow.projects.locations.templates.launch(opts, (err, result) => {
if (err) {
throw err;
}
console.log(result.data);
});
为了使用您自己的服务号运行任何Google Cloud Platform进程,启动进程的用户需要是该服务号的服务帐户用户。
对于您的特定需求,您的Cloud Function使用的服务号将需要服务帐户用户访问权限。
将服务帐户用户角色授予Cloud Function服务号可以通过以下方式完成:
更多信息可以在Google Cloud Platform留档中找到:
您可以在项目级别或服务号级别为项目中的所有服务帐户授予服务帐户用户角色。
>
将服务帐户用户角色授予项目的用户可让用户访问项目中的所有服务帐户,包括将来可能创建的服务帐户。
将服务帐户用户角色授予特定服务号的用户时,用户只能访问该服务号。
您需要将该权限授予运行Cloud Function的服务号。以下是如何执行此操作的留档:https://cloud.google.com/functions/docs/securing/function-identity