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からしかの通信しか許可しない場合に使う