使用 Terraform 部署数据流

Posted

技术标签:

【中文标题】使用 Terraform 部署数据流【英文标题】:Deploy a Dataflow with Terraform 【发布时间】:2020-05-09 23:07:22 【问题描述】:

我正在尝试在 GCloud 中使用 Terraform 部署 Dataflow 模板。

有几个教程包含一些 terraform 代码。有 2 个选项:使用 module 像下面的 link 或使用 resource 像下面的 link

使用这两个选项我都有以下错误:

Error: googleapi: got HTTP response code 502 with body: <!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 502 (Server Error)!!1</title>
  <style>
    *margin:0;padding:0html,codefont:15px/22px arial,sans-serifhtmlbackground:#fff;color:#222;padding:15pxbodymargin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px* > bodybackground:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205pxpmargin:11px 0 22px;overflow:hiddeninscolor:#777;text-decoration:nonea imgborder:0@media screen and (max-width:772px)bodybackground:none;margin-top:0;max-width:none;padding-right:0#logobackground:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px@media only screen and (min-resolution:192dpi)#logobackground:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0@media only screen and (-webkit-min-device-pixel-ratio:2)#logobackground:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%#logodisplay:inline-block;height:54px;width:150px
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>502.</b> <ins>That’s an error.</ins>
  <p>The server encountered a temporary error and could not complete your request.<p>Please try again in 30 seconds.  <ins>That’s all we know.</ins>


  on .terraform\modules\dataflow-job\terraform-google-modules-terraform-google-dataflow-722fc1d\main.tf line 17, in resource "google_dataflow_job" "dataflow_job":
  17: resource "google_dataflow_job" "dataflow_job" 

我尝试从本地计算机以及 GCP 内的云 shell 运行。

问题应该出在数据流模块中,因为我还尝试创建其他资源,例如存储桶和计算引擎,并且它可以正常工作。

在我运行 terraform 脚本之前,数据流模板存储在存储桶中。

Terraform 版本:0.12.19

代码:

ma​​in.tf

variable "project_id" 
<...>


provider "google" 
  version = "~> 2.8.0"
  region  = var.region


resource "google_dataflow_job" "dataflow_job" 
  project               = var.project_id
  region                = var.region
  zone                  = "$var.region-a"
  name                  = var.project_name
  on_delete             = "cancel"
  max_workers           = var.max_workers
  template_gcs_path     = var.template_location
  temp_gcs_location     = "gs://$var.gcs_location/tmp_dir"
  service_account_email = var.controller_service_account_email
  parameters = 
    inputPubSub       = var.input_PubSub_subscription
    outputPubSub      = var.output_PubSub_subscription
  
  machine_type     = var.machine_type

terraform.tfvars

<...>
template_location = "gs://www/zzz/template"
gcs_location= "gs://www/yyy"
<...>

为了测试我的代码是否错误,我也直接从link的代码中尝试了同样的错误。

我是否缺少任何要添加到代码中的依赖项?

【问题讨论】:

【参考方案1】:

请注意,您已将temp_gcs_location 声明为"gs://$var.gcs_location/tmp_dir",但随后在terraform.tvars 中将gcs_location 设置为"gs://www/yyy"(因此gs:// 前缀出现两次)。在任何情况下,作业都应该启动,但创建失败。

我用以下版本做了一个最小的例子:

$ terraform --version
Terraform v0.12.20
+ provider.google v3.5.0

并使用 Google 提供的 word count 模板。我的main.tf 文件是:

variable "project_id" 
  type        = string
  description = "GCP Project ID."

variable "gcs_location" 
  type        = string
  description = "GCS bucket name (no gs:// prefix)."


provider "google" 
  project = var.project_id
  region  = "us-central1"
  zone    = "us-central1-c"


resource "google_dataflow_job" "wordcount" 
  name              = "wordcount"
  template_gcs_path = "gs://dataflow-templates/latest/Word_Count"
  temp_gcs_location = "gs://$var.gcs_location/temp"
  parameters = 
    inputFile = "gs://dataflow-samples/shakespeare/kinglear.txt"
    output = "gs://$var.gcs_location/wordcount/output"
  

df.tfvars(使用适当的值进行更改):

project_id = "PROJECT_ID"
gcs_location = "BUCKET_NAME"

我运行它:

terraform apply -var-file="df.tvars"

作业创建成功:

google_dataflow_job.wordcount: Creating...
google_dataflow_job.wordcount: Creation complete after 3s [id=2020-01-27_...]

如果这有帮助,请告诉我。

【讨论】:

谢谢吉勒姆。我会试试你所做的。您提到的temp_gcs_location 是由于复制/粘贴最后一个示例而导致的错误,因为在我之前的示例中我做得正确,但结果也失败了。可能是由于服务帐户?你是从电脑上跑的吗? 要验证这是否是由于服务帐户造成的,您可以将角色 Dataflow Admin[1] 添加到此服务帐户;此角色是创建和管理 Dataflow 作业的最低要求。 [1]:cloud.google.com/dataflow/docs/concepts/access-control#roles @IoTuser 是的,我认为这是一个错字之类的。我从启用了所有 GCP 范围和默认计算引擎服务帐户的 GCE 实例运行它 我认为我的问题是由于区域和区域,你的脚本对我有用,所以最后,在调试我的之后,我可以部署它:region= europe-west1 and zone= europe-west1-c 我在terraform 文档中没有看到terraform import 部分dataflow。那么,我们不能使用terraform 导入现有数据流作业的状态吗?我指的是terraform.io/docs/providers/google/r/dataflow_job.html

以上是关于使用 Terraform 部署数据流的主要内容,如果未能解决你的问题,请参考以下文章

如何在 terraform 中运行 kubectl apply 命令

为 Terraform 服务帐户定义 ClusterRoleBinding

如何使用 terraform 将 aws ec2 私有 ips 传递给模板文件

使用 Terraform 部署数据流

存储在 aws 机密管理器中的 Azure 机密

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署