created: 2022-11-02T23:31:13.638Z

[2022年度版] gcloud コマンドだけで GCP の無料インスタンスとネットワークルールを構成する

何年もまえから(最初から?)GCPでは小さい汎用インスタンスを無料で使わせてくれるキャンペーンをやっている。昔は f1micro というメモリが512MBしかないインスタンスだったが、久しぶりに使おうとしたらe2microという1GBまで利用できるインスタンスが使えるようになっていた。ミドルウェアだけじゃなくてアプリもなんか動かせそうですね。

無料で利用させてもらえるインスタンスのスペック。

  • インスタンスの種類
    • non-preemptible e2-micro VM instance per month in one of the following US regions
  • 地域
    • Oregon: us-west1
    • Iowa: us-central1
    • South Carolina: us-east1

イメージ

今回は Raspbian と組み合わせてあれするものだったので、 debian (debian-11-bullseye-v20220920) を使ってみることにした。

利用できるイメージはこんなコマンドで一覧できる。

$ gcloud compute images list --filter=debian
NAME                                PROJECT       FAMILY           DEPRECATED  STATUS
debian-10-buster-v20220920          debian-cloud  debian-10                    READY
debian-11-bullseye-arm64-v20220920  debian-cloud  debian-11-arm64              READY
debian-11-bullseye-v20220920        debian-cloud  debian-11    

s

インスタンスを生成するコマンド

debian-11-bullseye-v20220920 のイメージを使ってインスタンスを生成する場合。

$ gcloud compute instances create mye2micro \
    --image-family debian-11 \
    --image-project debian-cloud \
    --machine-type e2-micro \
    --zone us-west1-b \
    --metadata-from-file startup-script=../../gcp/mye2micro/startup-script.sh
Created [https://www.googleapis.com/compute/v1/projects/myservices/zones/us-west1-b/instances/mye2micro].
NAME           ZONE        MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
mye2micro  us-west1-b      e2-micro                   10.138.0.2   xxx.xxx3.109.103  RUNNING

startup-scriot

startup-script という引数で、インスタンスが生成された直後にroot権限でシェルスクリプトを実行することができる。

set -eu

apt-get -y update
apt-get -y upgrade
apt-get install -y build-essential apt-transport-https vim wget curl jq

sudo cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
sudo sh -c 'echo "Asia/Tokyo" > /etc/timezone'
sudo dpkg-reconfigure -f noninteractive tzdata

apt-get install -y language-pack-ja-base language-pack-ja
/usr/sbin/update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
source /etc/default/locale

ロケールの設定とか、よく使うコマンドなどを。 本当は自分の手元だと mackerel-agent のインストールとかもやっていて、これは具合がいい。

ssh

インスタンスがたったら gcloud コマンドから ssh ができる。

$ gcloud compute ssh myuser@mye2micro --zone us-west1-b
Updating project ssh metadata...⠛Updated [https://www.googleapis.com/compute/v1/projects/myservices].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.
Linux mye2micro 5.10.0-18-cloud-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Oct 30 14:55:29 2022 from xxx.2xxx.241.64

なお、gcloud が秘密鍵を生成しているだけなので、鍵を指定すれば普通の ssh コマンドでも入れる。

$ ssh -i ~/.ssh/google_compute_engine myuser@xxx.197.109.103

ネットワークルール

なにも指定しないとGCEは「デフォルトネットワーク」というネットワークの内部にインスタンスがつくられるが、これは ssh とか ping とか基本的なポートしかあいていないので、目当てのアプリケーションがあるならそれが利用するポートをあけるルールを生成する必要がある。

たとえば fluentd を動かしたい場合はこんなルールを追加する。

$ gcloud compute firewall-rules create \
  default-allow-fluentd \
  --direction=INGRESS \
  --priority=65534 \
  --network=default \
  --action=ALLOW \
  --rules=tcp:24224,udp:24224,tcp:8888,tcp:24220 \
  --source-ranges=0.0.0.0/0
  • default-allow-fluentd
    • 生成するルールの名前
  • --direction=INGRESS
    • ネットワークに入ってくるデータか、出ていくデータか
  • --priority=65534
    • (他のルールと競合した時の)優先順位
  • --network=default
    • ルールを追加するネットワーク名
  • --action=ALLOW
    • ALLOW か DENY
  • --rules=tcp:24224,udp:24224,tcp:8888,tcp:24220
    • TCPとUDPのポート番号を指定する
    • 複数指定する場合はカンマ区切り
  • --source-ranges=0.0.0.0/0
    • 通信元のIPアドレス
    • 特定のIPからしかの通信しか許可しない場合に使う