🔨

GCPにGethをTerraformで立ち上げる

2021/04/17に公開

EthereumでDappsの開発環境をGCPに載せたくなったのでそのときに作ったTerraformの紹介です。

使い方

https://github.com/k2wanko/gcp-gethgit cloneしてきて

下記コマンドを実行します。

gcloud auth application-default login

これはterraformで利用するためのログインです。
新規プロジェクトでまだGCEを有効にしていない場合は次のコマンドを実行して有効にします。

gcloud services enable compute.googleapis.com

terraform apply を実行します。project_id を聞かれるので入力してください。

$ terraform apply
var.project_id
  Enter a value: [project_id]

geth attach

terraform apply が成功するとinstance_nameが出力されるので下記のコマンドでSSH Port Forwardingでgethのhttp portをローカルマシンにマッピングします。

gcloud config set project [project_id]
gcloud compute ssh [instance_name] -- -N -L 8545:localhost:8545

別のターミナルを開いてgeth attachを実行することでconsoleにアクセスできます。

geth attach rpc:http://localhost:8545

gethの起動オプションは main.tfに記述しているので適宜上書きして利用してください。

解説

ここからはmain.tfの中身を解説していきます。

基本コンセプトは「GCPの無料枠で収まるようにする」なのでGKEとかではなくGCEを利用しました。

まずGCEの無料枠は下記3リージョンのf1-microインスタンスと30GBのHDD Storage、1GBの外向きネットワーク転送量です。これが毎月無料で利用できます。

  • Oregon: us-west1
  • Iowa: us-central1
  • South Carolina: us-east1

リージョンはこのなかで一番日本に近そうなus-west1を選択しました。
リージョン内のゾーンはどこを使ってもいいのでterraformのrandom_shuffleを利用し3箇所からランダムに選んでいます。

resource "random_shuffle" "zone" {
  input        = ["us-west1-a", "us-west1-b", "us-west1-c"]
  result_count = 1
}

次にインスタンスの設定です。 google_compute_instance を利用してGCEインスタンスを作成します。

resource "google_compute_instance" "geth" {
  name         = "geth-${random_integer.instance_id_suffix.id}"
  machine_type = "f1-micro"

  boot_disk {
    initialize_params {
      size  = 30
      type  = "pd-standard"
      image = "cos-cloud/cos-stable"
    }
  }

nameではインスタンスネームを設定しています。
machine_typeは無料枠のためにf1-microを設定しています。

boot_disksizeはGBで設定します。無料枠の最大である30を設定しています。
typepd-standardで、これも無料枠のために固定です。ネットワーク経由のHDDが利用されます。
imageはどのOSを使うかで今回はDockerでGethを利用するので「Container-Optimized OS」を利用します。

Container-Optimized OSについて

Container-Optimized OSはDockerコンテナの実行に最適化されたGCE用のOSです。
GCEの機能であるmetadataに必要な設定を入れるだけで素早くDockerコンテナを実行でき、OSのアップデートも自動でやってくれます。

  metadata = {
    cos-metrics-enabled    = true
    google-logging-enabled = true
    user-data              = <<EOF
#cloud-config
write_files:
- path: /etc/systemd/system/ethereum.service
  permissions: 0644

cos-metrics-enabled を設定することでインスタンスのメトリクスをCloud Monitoringに記録してくれます。

google-logging-enabled はgoogleが用意したfluentdを起動してインスタンス内のログをCloud Loggingにエクスポートしてくれます。

user-data には cloud-configを記述し、Dockerコンテナをsystemdのサービスとして設定するようにしています。

Gethのボリュームマウント先に /var/ethereum を選択しているのはCOSの制約で永続化したいデータは /home/varに保存する必要があります。私は/opt/etc派だという人は気をつけてください。再起動時にデータが消失します。

詳しくはドキュメントを確認してください。

https://cloud.google.com/container-optimized-os/docs/concepts/disks-and-filesystem?hl=ja

Discussion