はじめに
今回は、TerraformでGCPを利用する入門として、リソースを構築してみたいと思います。
前提として、GCPのアカウント発行、PCにTerraformが導入されている前提となります。
まだ、準備が完了していない方は以下の記事をご参考ください。
GCP VPCの概要
GCPにおけるVPCは以下の通りで説明されています。
AWSやAzureと概念が異なる点もあるので注意が必要です。
今回は、VPCを作成するだけなのでそこまで意識する必要はありません。
Virtual Private Cloud(VPC)ネットワークは、Andromeda を使用して Google の本番環境ネットワーク内に実装された物理ネットワークを仮想化したネットワークです。
VPC ネットワークは次のことを行います。
- Compute Engine 仮想マシン(VM)インスタンス向けの接続を提供します。
- ネイティブの内部パススルー ネットワーク ロードバランサと内部アプリケーション ロードバランサ用のプロキシ システムを提供します。
- Cloud VPN トンネルと、Cloud Interconnect 用の VLAN アタッチメントを使用して、オンプレミス ネットワークに接続します。
- Google Cloud の外部ロードバランサからバックエンドにトラフィックを分散します。
プロジェクトには複数の VPC ネットワークを設定できます。この設定を禁止する組織のポリシーを作成しない限り、新しいプロジェクトは、各リージョンに 1 つのサブネットワーク(サブネット)を持つデフォルトネットワーク(自動モード VPC ネットワーク)が設定された状態で開始されます。
手順
VPCを作成するTerraformコードを記述
任意のエディタを開き、プロジェクトフォルダを作成して、配下にmain.tfというファイルを作成、以下のコードを記述します。
provider "google" {
project = "YOUR_PROJECT_ID"
region = "us-central1" # 任意のリージョンを指定
}
resource "google_compute_network" "my_vpc" {
name = "my-vpc"
auto_create_subnetworks = false
}
以下のコマンドを実行して、初期化を行います。
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/google...
- Installing hashicorp/google v5.24.0...
- Installed hashicorp/google v5.24.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Terraformリソースのドライラン
terraform planを実行することでドライランができます。
ドライラン:記述したコードの実行時に、現在の状態と構成ファイルの差異を分析し、実際に何が変更されるかを示す計画を表示します。この計画には、作成、更新、削除されるリソースの一覧や、それらの変更内容が含まれます。何を行うかを理解し、変更が適切であることを確認できます。また、予期しない変更やエラーがある場合には、それらを事前に発見し、対処することができます。
$ terraform plan
╷
│ Error: Attempted to load application default credentials since neither `credentials` nor `access_token` was set in the provider block. No credentials loaded. To use your gcloud credentials, run 'gcloud auth application-default login'
│
│ with provider["registry.terraform.io/hashicorp/google"],
│ on main.tf line 1, in provider "google":
│ 1: provider "google" {
│
│ google: could not find
│ default credentials. See
│ <https://cloud.google.com/docs/authentication/external/set-up-adc>
│ for more information
しかし、サービスアカウントの権限利用設定ができておらずエラーになりました。
本題とは逸れますが、ここでサービスアカウントを作成して権限利用の設定を行います。
Terraform用サービスアカウントを作成して権限付与する
以下の記事が非常に参考になりましたのでこの手順に従って認証設定を進めていきます。
- サービスアカウントの作成
$ gcloud iam service-accounts create terraform --display-name="service-account-for-terraform"
Created service account [terraform].
- Googleアカウントに権限付与
$ gcloud iam service-accounts add-iam-policy-binding terraform@[myprojectid].iam.gserviceaccount.com --member='user:[mygoogleaccount]' --role='roles/iam.serviceAccountTokenCreator'
Updated IAM policy for serviceAccount [terraform@[myprojectid].iam.gserviceaccount.com].
bindings:
- members:
- <user:googleaccount@example.com>
role: roles/iam.serviceAccountTokenCreator
etag: BwYV3VpME0Q=
version: 1
- サービスアカウントに権限付与
gcloud projects add-iam-policy-binding [myprojectid] --member='serviceAccount:terraform@[myprojectid].iam.gserviceaccount.com' --role='roles/bigquery.dataEditor'
Updated IAM policy for project [myprojectid].
bindings:
- members:
- <serviceAccount:terraform@myprojectid.iam.gserviceaccount.com>
role: roles/bigquery.dataEditor
- members:
- <serviceAccount:service-161369152734@compute-system.iam.gserviceaccount.com>
role: roles/compute.serviceAgent
- members:
- <serviceAccount:accountid-compute@developer.gserviceaccount.com>
- <serviceAccount:accountid@cloudservices.gserviceaccount.com>
role: roles/editor
- members:
- <user:googleaccount@example.com>
role: roles/owner
etag: BwYV5_6QhjU=
version: 1
- Terraformのデフォルト認証情報にGoogleアカウントの認証情報を設定
$ gcloud auth application-default login
Your browser has been opened to visit:
これで準備が整いました。
改めて、terraform planを実行して、ドライランを実施していきます。
$ 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_network.my_vpc will be created
+ resource "google_compute_network" "my_vpc" {
+ auto_create_subnetworks = false
+ delete_default_routes_on_create = false
+ gateway_ipv4 = (known after apply)
+ id = (known after apply)
+ internal_ipv6_range = (known after apply)
+ mtu = (known after apply)
+ name = "my-vpc"
+ network_firewall_policy_enforcement_order = "AFTER_CLASSIC_FIREWALL"
+ numeric_id = (known after apply)
+ project = "[myprojectid]"
+ routing_mode = (known after apply)
+ self_link = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
─────────────────────────────
Note: You didn't use the -out
option to save this plan, so
Terraform can't guarantee to
take exactly these actions if
you run "terraform apply"
now.
terraform applyした際に作成されるリソースが表示されました。
実際にapplyしていきます。
$ terraform apply
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_network.my_vpc will be created
+ resource "google_compute_network" "my_vpc" {
+ auto_create_subnetworks = false
+ delete_default_routes_on_create = false
+ gateway_ipv4 = (known after apply)
+ id = (known after apply)
+ internal_ipv6_range = (known after apply)
+ mtu = (known after apply)
+ name = "my-vpc"
+ network_firewall_policy_enforcement_order = "AFTER_CLASSIC_FIREWALL"
+ numeric_id = (known after apply)
+ project = "[myprojectid]"
+ routing_mode = (known after apply)
+ self_link = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
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
google_compute_network.my_vpc: Creating...
google_compute_network.my_vpc: Still creating... [10s elapsed]
google_compute_network.my_vpc: Creation complete after 13s [id=projects/test-project-1-419603/global/networks/my-vpc]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Enter a value:と聞かれるのでyesと回答すると上記の通り作成が開始します。
1,2分程度で以下のようにmy-vpcが作成されました。
まとめ
今回はTerraformを使用して、GCP上にリソースを作成してみました。
次回からは、GKEなど他のリソース構築も試していきたいと思います!
最後までご覧いただきありがとうございました。
コメント