Open8

terraformによりGCP管理方法メモ

あるべるとあるべると

変数について

terraformは*.tfファイルを全て読み込むので変数定義は別で用意することも可能

variable.tf
variable gcp_project_id {
  description = "GCP project id"
}

variable gcp_region {
  description = "GCP region"
}
terraform.tfvars
gcp_project_id="project_id"
gcp_region="us-central1"

変数の代入はデフォルトだとterraform.tfvarsというファイルを探す。
他のファイルを指定したいときは下記のようにファイル指定

terraform  apply -var-file=dev.tfvars
あるべるとあるべると

プロバイダの指定

main.tf
provider "google" {
  credentials = file("/path/to/credentials.json")

  project = var.gcp_project_id
  region  = var.gcp_region
  zone    = "${var.gcp_region}-a"
}

credentialファイルへのパスは上記のように直接記載することも出来るが環境変数を利用することもできる。
環境変数は下記の順で優先参照される

  1. GOOGLE_CREDENTIALS
  2. GOOGLE_CLOUD_KEYFILE_JSON
  3. GCLOUD_KEYFILE_JSON

terraformには専用のサービスアカウントを作成することが推奨されているが一応アプリケーション用のサービスアカウントを兼用することもできる。
アプリケーション用のサービスアカウントへのパスは下記環境変数にセットする。

  1. GOOGLE_APPLICATION_CREDENTIALS

環境変数を用いる場合、credentialファイルへの参照をterafformの設定ファイル内に記載する必要はなくなるので下記の用に修正できる。

main.tf
provider "google" {
  project = var.gcp_project_id
  region  = var.gcp_region
  zone    = "${var.gcp_region}-a"
}

参考

あるべるとあるべると

APIの有効化

main.tf
resource "google_project_service" "compute-service" {
  project = var.gcp_project_id
  service = "compute.googleapis.com"

  disable_dependent_services = true
  disable_on_destroy = true
}
  • serviceで有効にしたいAPIを指定する
  • disable_dependent_services はオプションで、APIを無効化する際の挙動を設定する。trueの場合はAPIを無効化した場合それに依存しているサービスも終了される。falseの場合はAPIを無効化しようとするとエラーになる。
  • disable_on_destroyはオプションの項目で、terraform destroyしたときにこのAPIを無効化するか否か。デフォルトはtrue
あるべるとあるべると

Google Storage

main.tf
resource "google_storage_bucket" "storage-bucket" {
  name              = "image-bucket"
  location          = var.gcp_region
  force_destroy     = true

  lifecycle_rule {
    condition {
      age = 30
    }
    action {
      type = "Delete"
    }
  }
}
  • name は作成するストレージの名前
  • fource_destroyterraform destroyしたときに内部のオブジェクトも破棄するか否か(デファルトはfalse)
  • lyfecycleはオブジェクトのライフサイクルに関する設定。上記はオブジェクト作成時から30日後に削除する設定。
    lifecycleの詳細参照
main.tf
resource "google_storage_bucket_iam_binding" "storage-bucket-iam" {
  bucket    = google_storage_bucket.storage-bucket.name
  role      = "roles/storage.objectViewer"

  members = [
    "allUsers",
  ]
}
  • 作成したバケットに関してのIAMの設定も行うことが出来る上記は全ユーザーに閲覧権限を与える設定。

たとえば指定したメールアドレスに管理者権限を与えたければ以下の様になる

main.tf
resource "google_storage_bucket_iam_binding" "storage-bucket-iam" {
  bucket    = google_storage_bucket.storage-bucket.name
  role = "roles/storage.admin"

  members = [
      "user@example.com",
  ]
}
あるべるとあるべると

Cloud SQL

main.tf
resource "google_sql_database_instance" "mysql" {
  name              = "mysql-db"
  database_version  = "MYSQL_8_0"
  region            = var.gcp_region
  settings {
    tier = "db-n1-standard-2"
  }
}
  • database_versionで利用するDBを指定する。現時点でサポートされているのは下記

    • MYSQL_5_6
    • MYSQL_5_7
    • MYSQL_8_0
    • POSTGRES_9_6
    • POSTGRES_10
    • POSTGRES_11
    • POSTGRES_12,
    • POSTGRES_13
    • POSTGRES_14
    • SQLSERVER_2017_STANDARD
    • SQLSERVER_2017_ENTERPRISE
    • SQLSERVER_2017_EXPRESS
    • SQLSERVER_2017_WEB
    • SQLSERVER_2019_STANDARD
    • SQLSERVER_2019_ENTERPRISE
    • SQLSERVER_2019_EXPRESS
    • SQLSERVER_2019_WEB
  • tierでCPUタイプを指定する。利用出来るtierは下記コマンドで確認出来る。

gcloud sql tiers list

僕の環境だと下記のとおり

CPU タイプ
db-f1-micro
db-g1-small
db-n1-standard-1
db-n1-standard-2
db-n1-standard-4
db-n1-standard-8
db-n1-standard-16
db-n1-standard-32
db-n1-standard-64
db-n1-standard-96
db-n1-highmem-2
db-n1-highmem-4
db-n1-highmem-8
db-n1-highmem-16
db-n1-highmem-32
db-n1-highmem-64
db-n1-highmem-96

参考
参考

あるべるとあるべると

Redis

main.tf
resource "google_redis_instance" "redis_instance" {
  name                = "redis-instance"
  tier                = "BASIC"
  memory_size_gb      = 2
  region              = var.gcp_region
  redis_version       = "REDIS_6_X"
  authorized_network  = google_compute_network.vpc_network.self_link
}
あるべるとあるべると

Service Account

main.tf
resource "google_service_account" "sample_account" {
  account_id   = "sample-service-account"
  display_name = "sample-service-account"
}

resource "google_project_iam_member" "sample_iam_1" {
  role   = "roles/cloudsql.client"
  member = "serviceAccount:${google_service_account.sample_account.email}"
}

resource "google_project_iam_member" "sample_iam_2" {
  role   = "roles/storage.objectViewer"
  member = "serviceAccount:${google_service_account.sample_account.email}"
}

resource "google_project_iam_member" "sample_iam_3" {
  role   = "roles/bigquery.user"
  member = "serviceAccount:${google_service_account.sample_account.email}"
}
  • account_idは6〜30文字プロジェクト内でユニークなID