我正在尝试使用python api使用Google的预定义模板部署数据流作业
我不希望我的数据流计算实例具有公共ip,所以我使用类似这样的东西:
GCSPATH="gs://dataflow-templates/latest/Cloud_PubSub_to_GCS_Text"
BODY = {
"jobName": "{jobname}".format(jobname=JOBNAME),
"parameters": {
"inputTopic" : "projects/{project}/topics/{topic}".format(project=PROJECT, topic=TOPIC),
"outputDirectory": "gs://{bucket}/pubsub-backup-v2/{topic}/".format(bucket=BUCKET, topic=TOPIC),
"outputFilenamePrefix": "{topic}-".format(topic=TOPIC),
"outputFilenameSuffix": ".txt"
},
"environment": {
"machineType": "n1-standard-1",
"usePublicIps": False,
"subnetwork": SUBNETWORK,
}
}
request = service.projects().templates().launch(projectId=PROJECT, gcsPath=GCSPATH, body=BODY)
response = request.execute()
但我收到此错误:
raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://dataflow.googleapis.com/v1b3/projects/ABC/templates:launch?alt=json&gcsPath=gs%3A%2F%2Fdataflow-templates%2Flatest%2FCloud_PubSub_to_GCS_Text returned "Invalid JSON payload received. Unknown name "use_public_ips" at 'launch_parameters.environment': Cannot find field.">
如果删除usePublicIps,它会通过,但是我的计算实例将使用公共ip进行部署。
答案 0 :(得分:1)
在运行时不能覆盖参数 usePublicIps 。您需要将此值false的参数发送到Dataflow Template生成命令中。
mvn compile exec:java -Dexec.mainClass=class -Dexec.args="--project=$PROJECT \
--runner=DataflowRunner --stagingLocation=bucket --templateLocation=bucket \
--usePublicIps=false"
它将在模板的JSON上添加条目 ipConfiguration ,表明工作人员仅需要使用专用IP。
链接是带有和不带有ipConfiguration条目的模板JSON的打印屏幕。
答案 1 :(得分:0)
通过阅读有关Dataflow上Specifying your Network and Subnetwork的文档,我看到python使用了use_public_ips=false
,插入了Java使用的usePublicIps=false
。尝试更改该参数。
还请记住:
当您关闭公共IP地址时,Cloud Dataflow管道可以 仅在以下位置访问资源:
同一VPC网络中的另一个实例
共享的VPC网络
启用了VPC网络对等的网络
答案 2 :(得分:0)
我找到了一种使之起作用的方法
使用自定义参数运行模板
mvn compile exec:java \
-Dexec.mainClass=com.google.cloud.teleport.templates.PubsubToText \
-Dexec.cleanupDaemonThreads=false \
-Dexec.args=" \
--project=${PROJECT_ID} \
--stagingLocation=gs://${BUCKET}/dataflow/pipelines/${PIPELINE_FOLDER}/staging \
--tempLocation=gs://${BUCKET}/dataflow/pipelines/${PIPELINE_FOLDER}/temp \
--runner=DataflowRunner \
--windowDuration=2m \
--numShards=1 \
--inputTopic=projects/${PROJECT_ID}/topics/$TOPIC \
--outputDirectory=gs://${BUCKET}/temp/ \
--outputFilenamePrefix=windowed-file \
--outputFilenameSuffix=.txt \
--workerMachineType=n1-standard-1 \
--subnetwork=${SUBNET} \
--usePublicIps=false"
答案 3 :(得分:0)
似乎您正在使用projects.locations.templates.create中的json 环境块documented here需要遵循
"environment": {
"machineType": "n1-standard-1",
"ipConfiguration": "WORKER_IP_PRIVATE",
"subnetwork": SUBNETWORK // sample: regions/${REGION}/subnetworks/${SUBNET}
}
ipConfiguration的值是在Job.WorkerIPAddressConfiguration
中记录的枚举