使用terraform在GCP上构建VM环境

Terraform是什么?

terraform是HashiCorp公司提供的一种用Go语言编写的基础设施即代码(IaC)工具,它是开源的。通过使用terraform,可以使用代码定义GCP或AWS云服务上的基础设施资源,并使用所定义的代码自动构建基础设施资源。

通过使用terraform将基础设施资源转化为IaC,可以减少人为错误并降低基础设施资源的构建和管理成本。

使用terraform,在GCE上构建虚拟机环境。

安装Terraform

※我使用的是Google Cloud SDK的版本357.0.0和Terraform的版本1.0.7。(這是文章撰寫時的最新版本)

在OS X上,您可以使用Homebrew安装Terraform。

brew install terraform

在终端界面中输入”terraform version”,若显示版本信息,则表示安装正确。

$ terraform version
Terraform v1.0.7
on darwin_amd64

GCP的配置设置

如果您的PC终端尚未安装Cloud SDK,请从这里安装Cloud SDK。

如果在安装Cloud SDK时使用”gcloud init”命令进行了SDK的设置,并且想要使用其他与认证的Google用户帐户不同的帐户进行开发,请使用以下命令进行验证所需的Google帐户和设置项目ID。

# GCPにログイン
gcloud auth login
# ワーキングプロジェクト設定。各自設定しているプロジェクトリスト内の [PROJECT_ID]を設定
gcloud config set project [PROJECT_ID]

然后,您可以通过Cloud SDK登录到您的Google用户帐户的项目中,以启用可用的服务。您可以使用以下命令获取可以在项目中启用的服务列表。

# 有効化できるサービス一覧の取得
gcloud services list --available

另外,您可以通过以下命令来获取已在项目中启用的服务列表。

# 有効化されているサービスの取得
gcloud services list --enabled

由于本次我们将使用terraform来构建GC的VM环境,因此请确保以下服务帐户已启用。

# プロジェクトのリソースに関するサービス
gcloud services enable cloudresourcemanager.googleapis.com

# リソースに対してロール(アクセス権限)を設定するサービス
gcloud services enable iam.googleapis.com

# プロジェクトで使用できるサービスの設定を行うサービス
gcloud services enable serviceusage.googleapis.com

# GCEの操作に関するサービス
gcloud services enable compute.googleapis.com

# コンテナベースのアプリケーションを構築および管理をこなうサービス
gcloud services enable container.googleapis.com

# ストレージ操作に関するサービス
gcloud services enable storage-component.googleapis.com

用于GCP访问的凭据文件配置

首先,为了访问GCP,我们将创建一个专门用于terraform的服务账号,并进行凭证文件配置。

# サービスアカウント名「terraform-serviceaccount」を作成
gcloud iam service-accounts create terraform-serviceaccount --display-name "Account for Terraform"

要确认GCP的网页管理界面中的「IAM和管理」→「IAM」→「权限」的列表中是否有创建名为”terraform-serviceaccount”的服务账号。

terraform.png

接下来,我们将为创建的Terraform账户赋予”基本的角色(Primitive roles)”权限。由于这将授予广泛的权限,因此如果您正在使用多个账户用户进行开发,我们建议您使用”事先定义的角色(Predefined roles)”或者”自定义角色(Custom roles)”。

# サービスアカウント「terraform」に「Primitive roles(基本の役割)」を追加
gcloud projects add-iam-policy-binding [PROJECT_ID] \
  --member serviceAccount:terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com \
  --role roles/editor

接下来,我们将为创建的服务账号”terraform-serviceaccount”生成凭证文件。通过执行以下命令,你可以将凭证文件保存为JSON格式,并将其保存在”~/.ssh/terraform.json”文件中,但如有需要,请根据实际情况自行更改文件路径和凭证文件名。

# アカウントのCredentialファイルを発行
# Credentialファイル名は「terraform.json」とする
gcloud iam service-accounts keys create ~/.ssh/terraform.json \
  --iam-account terraform-serviceaccount@[PROJECT_ID].iam.gserviceaccount.com

这是可选的,但如果需要的话,建议在之前生成的Credential文件中注册环境变量,这样将来的开发工作会更加轻松。

# 環境変数にCredentialファイルを設定する
export GOOGLE_CLOUD_KEYFILE_JSON=~/.ssh/terraform.json

使用Terraform构建GCE的虚拟机环境。

首先,创建一个用于保存定义基础设施资源的代码的目录,使用terraform。
*之后的操作假设在创建的目录“test_terraform”中进行。

mkdir test_terraform

接下来,在使用Terraform构建基础设施资源之前,需要定义要使用哪个提供程序。为了方便理解,我们将创建一个名为“provider.tf”的文件,但也可以定义为“main.tf”等其他文件名。(请将创建的文件“provider.tf”保存在刚刚创建的“test_terraform”目录中。)

# プロバイダーはgoogleを使用
# credentials : 先ほど作成・保存したcredentialsファイル「terraform.json」のファイルパスを記載
#               ※環境変数にCredentialファイルを定義した場合はcredentialsの内容の記載不要
# project    : GCPで使用するプロジェクトIDを指定
# region     : リソースを管理するためのデフォルトのリージョンを指定。今回は「asia-northeast1」とする。

provider "google" {
  credentials = "${file("~/.ssh/terraform.json")}"
  project     = "[PROJECT_ID]"
  region      = "asia-northeast1"
}

在Terraform官方文档中有Google提供程序配置的参考,详细信息请参阅该文档。

如果成功创建了「provider.tf」文件,请在终端界面上使用「cd」命令进入之前创建的文件夹「test_terraform」。在包含「provider.tf」文件的目录中执行以下命令,可以初始化terraform工作空间并确认是否创建了文件夹「.terraform」和文件「.terraform.lock.hcl」。

terraform init

接下来,我们将使用terraform来通过代码定义要创建的GCE的虚拟机环境。要构建的虚拟机环境的代码文件将被命名为 “compute_instance.tf”。

# GCE上で作成するVMの環境を定義します。
# name     : 構築するVM環境の名前を定義。今回は「test」とします。
# machine_type : マシンタイプを設定。今回は「f1-micro」とする。
# zone     : 構築するVMのゾーンを設定。今回は「asia-northeast1-b」とする。
# auto_delete : インスタンスが削除されたときにディスクが自動削除されるかどうか。デフォルトはtrue。
# image    : このディスクを初期化する元のイメージの設定。(OSイメージの定義)
# size     : ディスクのイメージサイズを設定(GB)。今回は10GBとする。
# type     : GCEのディスクタイプ(HHDかSSDなど)を設定。
# network  : 構築するVM環境が接続するネットワーク名(特にGCP上のネットワークを編集してなければdefaultでok)

resource "google_compute_instance" "default" {
  name          = "test"
  machine_type  = "f1-micro"
  zone          = "asia-northeast1-b"
  boot_disk {
    auto_delete = true
    initialize_params {
      image = "ubuntu-os-cloud/ubuntu-1804-lts"
      size = 10
      type = "pd-standard"
    }
  }
  network_interface {
    network = "default"
  }
}

在上述中,我在terraform中定义的GCE的VM环境”compute_instance.tf”内,使用注释提供了有关内容的说明,请参考此处的参考资料获取更多详细信息。

请把涉及GCE VM环境设置的配置文件”compute_instance.tf”保存在名为”test_terraform”的文件夹中,然后使用以下命令使用terraform来检查定义内容。

terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_compute_instance.default will be created
  + resource "google_compute_instance" "default" {
      + can_ip_forward       = false
      + cpu_platform         = (known after apply)
      + current_status       = (known after apply)
      + deletion_protection  = false
      + guest_accelerator    = (known after apply)
      + id                   = (known after apply)
      + instance_id          = (known after apply)
      + label_fingerprint    = (known after apply)
      + machine_type         = "f1-micro"
      + metadata_fingerprint = (known after apply)
      + min_cpu_platform     = (known after apply)
      + name                 = "test"
      + project              = (known after apply)
      + self_link            = (known after apply)
      + tags_fingerprint     = (known after apply)
      + zone                 = "asia-northeast1-b"

      + boot_disk {
          + auto_delete                = true
          + device_name                = (known after apply)
          + disk_encryption_key_sha256 = (known after apply)
          + kms_key_self_link          = (known after apply)
          + mode                       = "READ_WRITE"
          + source                     = (known after apply)

          + initialize_params {
              + image  = "ubuntu-os-cloud/ubuntu-1804-lts"
              + labels = (known after apply)
              + size   = 10
              + type   = "pd-standard"
            }
        }

      + confidential_instance_config {
          + enable_confidential_compute = (known after apply)
        }

      + network_interface {
          + name               = (known after apply)
          + network            = "default"
          + network_ip         = (known after apply)
          + subnetwork         = (known after apply)
          + subnetwork_project = (known after apply)
        }

      + reservation_affinity {
          + type = (known after apply)

          + specific_reservation {
              + key    = (known after apply)
              + values = (known after apply)
            }
        }

      + scheduling {
          + automatic_restart   = (known after apply)
          + min_node_cpus       = (known after apply)
          + on_host_maintenance = (known after apply)
          + preemptible         = (known after apply)

          + node_affinities {
              + key      = (known after apply)
              + operator = (known after apply)
              + values   = (known after apply)
            }
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

使用命令“terraform plan”,可以根据“.tf”文件中的信息查看将创建/修改/删除哪些资源。
接下来执行命令“terraform apply”,将根据“.tf”文件中的信息在GCP上创建资源。

terraform apply

在执行命令时,终端会询问类似下面的问题:“您是否要执行此操作?(构建基础设施资源吗?)”,请键入“是”来确认。

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

如果出现以下显示结果,则我认为可以使用Terafform在GCE上构建VM环境。

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

请您确认一下,在浏览器上的GCP管理界面的虚拟机列表中,我们刚刚创建的虚拟机环境 “test” 是否已经成功构建。

スクリーンショット 2021-09-30 21.34.21.png

总结

这次我介绍了使用terraform在GCP上构建虚拟机环境的方法。使用terraform还可以通过代码定义各种资源,如网络配置、防火墙、存储和数据库等,所以我希望将来可以逐渐将我在兴趣和工作中使用的基础设施资源用代码明确起来。

广告
将在 10 秒后关闭
bannerAds