▶️

Google Cloud Compute Engineを始めた時の記録

2025/01/01に公開

Google Cloud Compute Engine のインスタンスを作成

とりあえず VM インスタンスを作ってみる

  1. プロジェクトを作成
  2. vm作成
  3. google compute engine api 有効化
  4. リージョン us-west1 (オレゴン) 選択
  5. ゾーン 指定なしのまま
  6. series E2 選択
  7. マシンタイプ E2-micro 選択
  8. ブートディスの構成を変更
  9. ブートディスクの種類をバランス永続ディスクから標準永続ディスクに変更
  10. 選択
  11. ネットワークを選択
  12. ネットワークインターフェースを開く
  13. ネットワークサービスティアを Premium からスタンダードに変更
  14. 完了
  15. 作成

インスタンス作成後、起動状態になる。

sshd のポート変更

いたずらアクセス軽減のために 22 以外のポート (ここではカスタムポート番号と記載する)で ssh できるように設定を追加する。
何か設定をミスる可能性も考慮して 22 のポートは残しておく。

sudo vi /etc/ssh/sshd_config.d/port.conf
port.conf
Port 22
Port 1024より大きい何か適当な数字 <= カスタムポート番号

設定を反映するために sshd を再起動。
下記のどれかが正解 (全部正解かも)

sudo systemctl restart sshd
sudo service ssh restart
sudo /etc/init.d/ssh restart

いたずらアクセスできないようにファイアウォールを設定する

ファイアウォールの設定で

  • デフォルトの 22 ポートは google cloud console の web ブラウザ ssh のみ許可。
  • 外部からのアクセスはカスタムポート番号のみ許可。

のように設定すれば、いたずらは 99% 防げると思う。

外からアクセスできないように一旦インスタンスを停止。

ファイアウォールの設定をするために、新しくVPCネットワークを作成する

  1. VPC ネットワーク選択
  2. VPC ネットワークを作成を選択
  3. 名前に net-ce-default 入力
  4. 説明に compute engine のデフォルトのネットワーク
  5. 最大伝送単位 (MTU) はデフォルトの 1460 のまま
  6. ネットワークプロファイルを構成するはデフォルトのチェックなし
  7. サブネット作成モードは自動を選択
  8. ファイアウォールルールの一覧から net-ce-default-allow-ssh にチェックを入れる
  9. 動的ルーティングモードはデフォルトのリージョンのまま
  10. 最適なパス選択モードはレガシーのまま
  11. 作成

22 ポートに向けてアクセスで、ルールにヒットしなかったものは拒絶するためのファイアウォールルール追加

  • net-ce-default-deny-all
  • 優先度 65535
  • 方向 上り(内向き)
  • 一致したときのアクション 拒否
  • IP範囲 0.0.0.0/0
  • プロトコルとポート TCP 22

google console の web ブラウザ上の ssh 接続を許可するファイアウォールのルールを追加

  • net-ce-default-allow-ssh-console
  • 優先度 65001
  • 方向 上り(内向き)
  • 一致したときのアクション 許可
  • IP範囲 35.235.240.0/20
  • プロトコルとポート TCP 22

sshd の設定に追加したカスタムポート番号は外部からのアクセスを許可するファイアウォールのルールを追加

  • net-ce-default-allow-sshカスタムポート番号
  • 優先度 65000
  • 方向 上り(内向き)
  • 一致したときのアクション 許可
  • IP範囲 0.0.0.0/0
  • プロトコルとポート TCP カスタムポート番号

作成した vm インスタンスに作成したファイアウォールを適用

  1. Compute Engin VMインスタンスを選ぶ
  2. インスタンス名を選択
  3. 編集
  4. ネットワークインターフェースを default から net-ce-default に変更。完了。
  5. 保存

起動してみる

  1. インスタンスを開始
  2. ブラウザから ssh で接続。
  3. 不正ログインを試みているアクセスのログを確認。
cat /var/log/auth.log

terminal ソフトから ssh で接続できるように鍵を登録

web 上の console から ssh 接続したり、 gcloud compute ssh を使用して接続する時はこの対応は不要。

  1. 鍵のベアを作成する。鍵の種類は ed25519 推奨。RSA は避けるのが無難。
  2. Compute Engine VMインスタンスを選ぶ。
  3. インスタンス名を選択
  4. 編集
  5. SSH認証鍵のセクションん項目を追加を選択
  6. 公開鍵とユーザー名を記載する
ssh-ed25519 AAAAhogehoge username@pcname
  1. 保存

os の状態を最新にする

upgrade は結構時間がかかる (10分以上 ?) ので、気長に待つ。

sudo apt-get update
sudo apt-get upgrade

git インストール

sudo apt-get install git
git --version

git 初期設定

git config --global --add user.name "ユーザー名"
git config --global --add user.email "メールアドレス"

ユーザー名とメールアドレスは適当なものでも ok。
github と連携するなら github の noreply アドレスを設定するのがお勧め。
noreplyアドレスは github の Settings の Emails で『Keep my email addresses private』にチェック入れるとしようできる。具体的なアドレスは Keep my email addresses private のチェックマークの下あたりに記載があると思う。
『Block command line pushes that expose my email』はチェックを入れておくのが無難。

github に push するために認証鍵で github できるようにする

鍵を生成

ssh-keygen -t ed25519

公開鍵の内容を確認

cat ~/.ssh/id_ed25519.pub

github の profile の settings の SSH and GPG keys のページを開いて New SSH Key をクリック。
公開鍵の内容を追加する。

https://github.com/settings/keys

タイムゾーンを utc から jst に変更

sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

vmインスタンスをリセット(再起動) ※必要ないかも?

docker インストール

古いパッケージのアンインストール。全部入っていなさそうだけど、実行しても問題なし。

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

apt リポジトリに docker 追加

docker の公式リポジトリにアクセスするためのGPG鍵を追加

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

docker の公式リポジトリを追加

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

docker インストール

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker --version

docker を sudo 付けなくても実行できるように

※ユーザー名の部分は docker を実行するユーザー名に置き換える事

sudo groupadd docker
sudo usermod -aG docker ユーザー名

vmインスタンス再起動みたいに書いてあったけど、次のコマンドを実行すれば不要かも ?

newgrp docker

動作確認。 permission error が出なければ OK

docker run hello-world

その他よく使うツールのインストール

tree ..... テキストでツリー構造を表現するのをサポートしてくれる

sudo apt-get install tree

調査

os の種類やバージョン確認

cat /etc/os-release

どんな port を listen しているか?

ss -atn

sshd 稼働状態

/etc/init.d/ssh status

sshd 再起動時も含めたログ

/var/log/auth.log

タイムゾーン確認

date
cat /etc/timezone
cat /etc/localtime

トラブル色々

permission エラーが出る

$ docker run hello-world
docker: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

sudo をつけなくも実行できる対応ができていない。

ssh の config に port を追加しても追加した port が listen されない

sshd_config ではなく ssh_config の方に設定を追加していた。

なんか思っていたより課金されている

Balanced PD Capoacity として課金。
ストレージがバランス永続ディスクだと無料枠対象外。
タイプを標準永続ディスクにする必要があった。

なんか思っていたより課金されている ?

Google Cloud Console の課金の請求一覧のしょうさいに

  • E2 Instance Core running in America
  • E2 Instance Ram running in America

で請求あるような表記になっていた
ゾーンを指定してしまっていて、リージョン が us-west1-a (オレゴン) になって課金されている ?

ゾーンを指定していなくても、ネットワークインターフェースのネットワークサービスティアが Premium になっていると、勝手にゾーンが指定された状態になる ?

us-west1 を選択すると必ずゾーンが指定される ?

課金されると表示されているけど、実際は請求されない ?

請求書の詳細を全部表示すると最後にdiscount の記載がされていて無料になっていた。

参考サイト

  • debian に docker をインストールする

https://docs.docker.com/engine/install/debian/

  • docker を sudo 無しで実行できるようにする

https://docs.docker.com/engine/install/linux-postinstall/

  • github noreply メールアドレスについて

https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address

Discussion