如何在预定义的模板中禁用公共IP以启动数据流作业

时间:2019-01-24 06:39:39

标签: google-cloud-dataflow

我正在尝试使用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进行部署。

4 个答案:

答案 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的打印屏幕。

Template with usePublicIps=false

Template without usePublicIps=false

答案 1 :(得分:0)

通过阅读有关Dataflow上Specifying your Network and Subnetwork的文档,我看到python使用了use_public_ips=false,插入了Java使用的usePublicIps=false。尝试更改该参数。

还请记住:

  

当您关闭公共IP地址时,Cloud Dataflow管道可以   仅在以下位置访问资源:

     
      
  • 同一VPC网络中的另一个实例

  •   
  • 共享的VPC网络

  •   
  • 启用了VPC网络对等的网络

  •   

答案 2 :(得分:0)

我找到了一种使之起作用的方法

  1. 克隆Google Defined Templates

  2. 使用自定义参数运行模板

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

中记录的枚举