乐趣区

关于java:Terraform-101-从入门到实践-Terraform在公有云GCP上的应用

《Terraform 101 从入门到实际》这本小册在南瓜慢说官方网站和 GitHub 两个中央同步更新,书中的示例代码也是放在 GitHub 上,不便大家参考查看。


Terraform 反对的私有云有很多,如 AWS、Azure、Google、Alibaba 等。将 Terraform 利用于私有云,才最能施展其弱小的性能。

初始化 GCP 我的项目

创立一个新我的项目

首先咱们须要初始化一个 GCP 我的项目。GCP 给开发者提供了收费试用的服务,咱们能够在不花钱的状况下学习 GCP 的性能。

要应用 GCP,咱们须要创立一个我的项目,它所有的资源都是在我的项目之下治理的:

创立 Service Account

在理论开发中,咱们不能应用本人的账号在做操作,最好的形式是创立一个服务账号(Service Account),这应该也是所有云平台都举荐的形式。创立地位如下:

输出账号名字:

抉择角色,为了不便,我间接抉择 Owner,会领有所有权限,但理论利用必定不能这样,要做好隔离:

创立密钥文件

对于 Service Account,不是通过用户名明码来受权的,而是通过密钥文件,创立如下:

抉择新建一个密钥,并格局为 json。创立后,会主动下载 key 文件。

设置 gcloud SDK

Key 文件拿到后,咱们能够设置环境变量:GOOGLE_APPLICATION_CREDENTIALS

$ export GOOGLE_APPLICATION_CREDENTIALS=/Users/larry/Software/google-cloud-sdk/pkslow-admin-for-all.json

激活 Service Account:

$ gcloud auth activate-service-account admin-for-all@pkslow.iam.gserviceaccount.com --key-file=${GOOGLE_APPLICATION_CREDENTIALS}

设置 SDK 的我的项目 ID:

$ gcloud config set project pkslow

检查一下设置是否正确:

$ gcloud auth list
               Credentialed Accounts
ACTIVE  ACCOUNT
*       admin-for-all@pkslow.iam.gserviceaccount.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`


$ gcloud config list
[core]
account = admin-for-all@pkslow.iam.gserviceaccount.com
disable_usage_reporting = True
project = pkslow

Your active configuration is: [default]

应用 gcloud 创立 Pub/Sub

SDK 设置好后,就能够应用了,咱们应用它来创立 Pub/Sub 试试。创立主题和订阅:

$ gcloud pubsub topics create pkslow-test
Created topic [projects/pkslow/topics/pkslow-test].

$ gcloud pubsub subscriptions create pkslow-sub --topic=pkslow-test
Created subscription [projects/pkslow/subscriptions/pkslow-sub].

查看是否创立胜利:

$ gcloud pubsub topics list
---
name: projects/pkslow/topics/pkslow-test


$ gcloud pubsub subscriptions list
---
ackDeadlineSeconds: 10
expirationPolicy:
  ttl: 2678400s
messageRetentionDuration: 604800s
name: projects/pkslow/subscriptions/pkslow-sub
pushConfig: {}
topic: projects/pkslow/topics/pkslow-test

在浏览器查看,发现曾经胜利创立了:


Terraform 创立 Pub/Sub

下载 Terraform 插件

咱们须要装置 GCP 的 Terraform 插件来治理 GCP 资源:

# 设置插件目录
$ export TERRAFORM_PLUGIN=/Users/larry/Software/terraform/plugins
# 创立目录
$ mkdir -p ${TERRAFORM_PLUGIN}/registry.terraform.io/hashicorp/google/4.0.0/darwin_amd64
$ cd ${TERRAFORM_PLUGIN}/registry.terraform.io/hashicorp/google/4.0.0/darwin_amd64
# 下载
$ wget https://releases.hashicorp.com/terraform-provider-google/4.0.0/terraform-provider-google_4.0.0_darwin_amd64.zip
# 解压
$ unzip terraform-provider-google_4.0.0_darwin_amd64.zip

筹备 Terraform 代码

须要提供 Terraform 代码理治理 Pub/Sub,更多细节请参考:Terrafrom GCP.

版本文件 version.tf:

terraform {
  required_version = "= 1.0.11"
  required_providers {

    google = {
      source  = "hashicorp/google"
      version = "= 4.0.0"
    }
  }
}

主文件 main.tf:

provider "google" {project     = "pkslow"}

resource "google_pubsub_topic" "pkslow-poc" {name = "pkslow-poc"}

resource "google_pubsub_subscription" "pkslow-poc" {
  name  = "pkslow-poc"
  topic = google_pubsub_topic.pkslow-poc.name

  labels = {foo = "bar"}

  # 20 minutes
  message_retention_duration = "1200s"
  retain_acked_messages      = true

  ack_deadline_seconds = 20

  expiration_policy {ttl = "300000.5s"}
  retry_policy {minimum_backoff = "10s"}

  enable_message_ordering    = true
}

初始化和变更

指定插件目录初始化:

$ terraform init -plugin-dir=${TERRAFORM_PLUGIN}

使变更失效,就会在 GCP 上创立对应的资源:

$ terraform apply -auto-approve

如果没有产生谬误,则意味着创立胜利,咱们检查一下:

$ gcloud pubsub topics list
---
name: projects/pkslow/topics/pkslow-poc

$ gcloud pubsub subscriptions list
---
ackDeadlineSeconds: 20
enableMessageOrdering: true
expirationPolicy:
  ttl: 300000.500s
labels:
  foo: bar
messageRetentionDuration: 1200s
name: projects/pkslow/subscriptions/pkslow-poc
pushConfig: {}
retainAckedMessages: true
retryPolicy:
  maximumBackoff: 600s
  minimumBackoff: 10s
topic: projects/pkslow/topics/pkslow-poc

留神:咱们并没有提供任何明码或密钥,那 Terraform 怎么能够间接操作我的 GCP 资源呢?因为它会依据环境变量 GOOGLE_APPLICATION_CREDENTIALS 来获取。

发送和接管音讯

咱们通过 gcloud 来发送音讯到 Pub/Sub 上:

$ gcloud pubsub topics publish pkslow-poc --message="www.pkslow.com"
messageIds:
- '3491736520339885'

$ gcloud pubsub topics publish pkslow-poc --message="Larry Deng"
messageIds:
- '3491738650256958'

$ gcloud pubsub topics publish pkslow-poc --message="Hi, pkslower"
messageIds:
- '3491739306095970'

从 Pub/Sub 拉取音讯:

$ gcloud pubsub subscriptions pull pkslow-poc --auto-ack

咱们还能在 GCP 界面上监控对应的队列,非常不便:


通过 Google Cloud Storage(GCS)治理 Terraform 的状态 State

治理 Terraform 状态文件的最佳形式是通过云端的对立的存储,如谷歌云就用 GCS。

首先要创立一个 Bucket:

$ gsutil mb -p pkslow -l us-west1 -b on gs://pkslow-terraform
Creating gs://pkslow-terraform/...

$ gsutil ls gs://
gs://pkslow-terraform/

而后在 Terraform 文件中配置对应的信息:

terraform {
  backend "gcs" {
    bucket  = "pkslow-terraform"
    prefix  = "state/gcp/pubsub"
  }
}

初始化后,就会在 Bucket 上创立对应的目录:

$ terraform init -plugin-dir=${TERRAFORM_PLUGIN}

变更失效:

$ terraform apply -auto-approve

咱们在浏览器查看一下,发现曾经胜利状态了对应的状态文件:

通过近程的云端,不仅能够存入状态文件,也能够从状态文件读取数据,如一些输入变量。比方模块 A 创立了一个 VM,而咱们可能通过这种形式获取它的 IP,以便在其它模块应用。大抵的配置如下:

data "terraform_remote_state" "foo" {
  backend = "gcs"
  config = {
    bucket  = "terraform-state"
    prefix  = "prod"
  }
}

resource "template_file" "bar" {template = "${greeting}"

  vars {greeting = "${data.terraform_remote_state.foo.greeting}"
  }
}
退出移动版