• 《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}"
      }
    }
    
  • 相关阅读:
    GoWEB应用性能优化方法与套路
    PKG打包sqlite3项目,如何添加node_sqlite3.node依赖
    vue 中 watch 对对象的深度监听
    结构型-代理模式
    ardupilot开发 --- 起飞前后 篇
    程序员工作5年,还是个中级程序员,如何再快速晋升?
    Linux C/C++ 单实例进程设计
    深度学习:PyCharm中运行Bash脚本
    【DAY11 软考中级备考笔记】数据结构 排序&&操作系统
    最新MySql安装教学,非常详细
  • 原文地址:https://www.cnblogs.com/larrydpk/p/17115356.html