そうこのシリーズ!
で試してみました!!AWSが慣れているせいかシンプル過ぎて罠に色々とハマりましたが..
まずはAWSとGCPを比較してきましょう。
■今回実装すること
・VPC
インターネットゲートウェイの設定
サブネットの設定(めんどくさいので1個)
ルートテーブルの設定
ファイアーウォール(セキュリティーグループ的な)の設定
・GCE(1台)
OSはCentOS7
上記のVPC、ファイアーウォールを使用
SSDは100GB
外部IPアドレスも(EIP的な)
まったく同じ。
■Terraformの構成
・terraform version
1 2 3 |
$ terraform -v Terraform v0.11.1 + provider.google v1.3.0 |
・tree gcp
1 2 3 4 5 6 7 8 9 |
$ tree . └── gcp ├── gcp_backend.tf ├── gcp_firewall.tf ├── gcp_provider.tf ├── gcp_variables.tf ├── gcp_vpc.tf └── gcp_gce.tf |
今回はちゃんと機能ごとに分けて作りました。
■サービスアカウントの設定(クレデンシャル)
https://blog.adachin.me/archives/6747
これを参考にしましょう。
といってもgcloudコマンドは別に必要ないので、
クレデンシャルだけローカルに保管。
■gcp_backend.tf
1 2 3 4 5 |
backend "gcs" { bucket = "terraform" path = "terraform.tfstate" credentials = "/Users/adachin/gcloud/terraform-xxxxxxxxxx.json" } |
tfstateファイルはもちろんS3でいうGoogle cloud storage(GCS)に保管します。
クレデンシャルはサービスアカウントで作ったやつを指定。
ここらへんはAWSと同じ。
■gcp_provider.tf
1 2 3 4 5 |
provider "google" { credentials = "${file("/Users/adachin/gcloud/terraform-xxxxxxxxxxxxx.json")}" project = "mythic-xxxxxxxx-xxxxxx" region = "asia-northeast1" } |
プロバイダーはもちろんgoogle。プロジェクトはGCPダッシュボードのホームから見れます。
■gcp_variables.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
variable "region" { default = "asia-northeast1" } variable "region_zone" { default = "asia-northeast1-a" } variable "test_ssh_keys" { type = "string" default = <<EOF terraform:ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx EOF } variable "instance_type_web01" { default = "custom-2-2048" } |
変数はregionとGCEはAWSとは違ってユーザと鍵を指定できます。なのでterraformユーザと公開鍵をぶち込んでおきます。あとはインスタンスタイプもカスタマイズできるので、一旦2コアの2GBに変数化もしてます。(メンテしやすいように)ちなみにスケールアップはterraformから行うとdestroyしてしまうので、コンソールから変更し、コードを直せば相違はなくなります。
■gcp_vpc.tf
1 2 3 4 5 6 7 8 9 10 11 12 |
resource "google_compute_network" "test-vpc" { name = "test-vpc" auto_create_subnetworks = "false" } resource "google_compute_subnetwork" "test-subnet1a" { name = "test-subnet1a" ip_cidr_range = "10.0.0.0/24" network = "${google_compute_network.test-vpc.name}" description = "test-subnet-a" region = "${var.region}" } |
今回はサブネット1つなのでたったこれだけ!
AWSの場合はルーティング、ゲートウェイの設定も入れないとダメですがGCPは楽ちん。
■gcp_firewall.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
resource "google_compute_firewall" "office" { name = "office" network = "${google_compute_network.test-vpc.name}" allow { protocol = "icmp" } allow { protocol = "tcp" ports = ["1-65535"] } source_ranges = ["xxx.xxx.xxx.xxx","xxx.xxxx.xxxx.xxxx"] target_tags = ["web"] } resource "google_compute_firewall" "web" { name = "web" network = "${google_compute_network.test-vpc.name}" allow { protocol = "icmp" } allow { protocol = "tcp" ports = ["80","443"] } source_ranges = ["0.0.0.0/0"] target_tags = ["web"] } |
適当にオフィスは全許可。80.443は公開用に。ファイアーウォール(セキュリティーグループ的な)作ります。
■gcp_gce.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
resource "google_compute_address" "web01" { name = "web01" region = "${var.region}" } resource "google_compute_instance" "web01" { name = "web01" machine_type = "${var.instance_type_web01}" zone = "${var.region_zone}" tags = ["server", "web"] boot_disk { initialize_params { image = "centos-cloud/centos-7" size = "100" type = "pd-ssd" } } network_interface { subnetwork = "${google_compute_subnetwork.test-subnet1a.name}" access_config { nat_ip = "${google_compute_address.web01.address}" } } metadata { "block-project-ssh-keys" = "true" "sshKeys" = "${var.test_ssh_keys}" } } |
外部IPアドレス(EIP的な)作ってGCEはCentOS7でSSD100GB。SSDはコスト高いので標準永続ディスクを使用したい場合は「type = “pd-standard”」にすればOK。ネットワークインターフェースは作ったサブネットを指定してnatIP(外部アドレス)も指定。最後に公開鍵をぶち込んで終わりです。tagの部分はファイアーウォールと同じものを指定しないと読み込んでくれないので注意!
ここらへんはAWSと結構違う。
■まとめ
GCP Terraformは触ってて物足りなさを感じた。AWSのほうがダントツに面白いかもしれん。というかTerraformやってる人少ない….
参考
https://www.terraform.io/docs/providers/google/index.html
0件のコメント