GCPにGethをTerraformで立ち上げる
EthereumでDappsの開発環境をGCPに載せたくなったのでそのときに作ったTerraformの紹介です。
使い方
https://github.com/k2wanko/gcp-geth をgit 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_disk
のsize
はGBで設定します。無料枠の最大である30
を設定しています。
type
はpd-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
派だという人は気をつけてください。再起動時にデータが消失します。
詳しくはドキュメントを確認してください。
Discussion