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ファイルへのパスは上記のように直接記載することも出来るが環境変数を利用することもできる。
環境変数は下記の順で優先参照される
GOOGLE_CREDENTIALSGOOGLE_CLOUD_KEYFILE_JSONGCLOUD_KEYFILE_JSON
terraformには専用のサービスアカウントを作成することが推奨されているが一応アプリケーション用のサービスアカウントを兼用することもできる。
アプリケーション用のサービスアカウントへのパスは下記環境変数にセットする。
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_destroyはterraform 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_6MYSQL_5_7MYSQL_8_0POSTGRES_9_6POSTGRES_10POSTGRES_11POSTGRES_12,POSTGRES_13-
POSTGRES_14、 SQLSERVER_2017_STANDARDSQLSERVER_2017_ENTERPRISESQLSERVER_2017_EXPRESSSQLSERVER_2017_WEBSQLSERVER_2019_STANDARDSQLSERVER_2019_ENTERPRISESQLSERVER_2019_EXPRESSSQLSERVER_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
}
-
tierはBASICかSTANDARD_HAから選択 -
redis_versionはサポート対象のバージョンページから確認出来そう
GKE
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