GCEでインスタンス作成、ポートを変更してSSHで接続

## やりたいこと
- 【このページ】無料枠でGCEを起動したい
- 【このページ】SSHの22番ポートを3333番ポートに変更したい
- 【[こちらから](https://qiita.com/kawagoe6884/items/709826bcb1d84957e88f)】GCE(仮想マシン) 内の Python(Ubuntu) でSeleniumを使ったスクレイピング
- 【[こちらから](https://qiita.com/kawagoe6884/items/709826bcb1d84957e88f)】取得したファイルをGoogle Driveにアップロード
- 【[こちらから](https://qiita.com/kawagoe6884/items/944424e553eab9159b98)】スクレイピングを cron で定期的に実行する
- 【[こちらから](https://qiita.com/kawagoe6884/items/944424e553eab9159b98)】指定の時間にインスタンスをオン/オフする


## 全体図
![cloud.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/6c42035e-15d4-66d7-537c-b8edad69f16e.jpeg)


## GCPを始める前に必要なもの
- 携帯電話の番号
  Googleからのショートメッセージを受け取るため

- Googleアカウント
  二段階認証を設定してください、乗っ取られたら元も子もないので。

- クレジットカード
  Vプリカなどのプリペイドカードは無料トライアル登録不可

二段階認証の設定と無料トライアル登録までの手順は割愛


## ① GCEの有効化
1. 画面左上、Google Cloud ロゴの左にある [**ナビゲーション メニュー**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/905ec8b6-5113-79f1-4da7-1335f4100d0e.jpeg) から [**すべてのプロダクトを表示**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5f5caefb-2f98-b89f-8dd7-f97d2c8f92b6.jpeg)
1. コンピューティングの [**Compute Engine**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/e7102602-e87b-fced-0fdc-e6c2d556823e.jpeg) を選択
1. Compute Engine APIを [**有効にする**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/e8949fd8-ec40-2dc4-fef0-f24c51c88c70.jpeg)



## ② インスタンスの作成
1. [**インスタンスを作成**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/60432bdf-2a8c-c63e-4d51-073125da229f.jpeg) をクリック
1. マシンの構成・ブートディスクを以下に変更する
   ※[**無料枠**](https://cloud.google.com/free/docs/free-cloud-features?hl=ja#compute)で使う場合は、<font color="red">**赤枠**</font>を変更しないこと(投稿日時点)
   ![06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/cd4cc6b6-cef1-825a-d63e-bc590cfd859e.jpeg)
   ![07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/2ca2e3da-0e33-3b33-8f09-48de74fe11a3.jpeg)
1. ページの一番下にある [**作成**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/91e7df95-86a0-dae6-c00c-ae95c3fcd074.jpeg)



## ③ SSHの設定
1. 画面右上、通知マークの左にある **Cloud Shellをアクティブにする**
   ![09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/f72d4188-9433-b76c-1b66-fe078ed8aa94.jpeg)
1. ウィンドウの下部にコンソールが表示されるので、コンソール内に以下の3行を入力
   ※ ↓ パスフレーズを聞かれますが、設定せずに進めました
   ```shell:ユーザー名@cloudshell:~ (プロジェクト名)$
   ssh-keygen -t rsa -f ~/.ssh/my-ssh-key -C hogehoge
   chmod 400 ~/.ssh/my-ssh-key
   cat ~/.ssh/my-ssh-key.pub
   ```
1. コンソール内に出力された ```ssh-rsa ～～～ hogehoge```　をコピーする
1. 作成時につけた [**インスタンス名**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/a25fd260-a189-2cbb-b6fb-73642883ef73.jpeg) をクリック
1. [**編集**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/9f20b109-185e-4945-d6fe-41e07aab7020.jpeg) をクリック
1. 表示されたページの真ん中、やや下にある
   セキュリティとアクセス　＞　SSH 認証鍵　＞　[**＋項目を追加**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/0705dab1-f332-168a-5f70-a8433a399e04.jpeg)
1. コピーした ```ssh-rsa ～～～ hogehoge``` を貼り付ける
   ![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/fc0e6020-3418-8129-8b08-e20a63866d1b.jpeg)
1. ページの下部にある [**保存**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5fa144f1-48cb-87d9-3aeb-610b2722b936.jpeg)



## ④ 接続できるか確認
1. コンソールに以下の1行を入力
   **※[外部 IP アドレス]**　[**③ SSHの設定**](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd#-sshの設定) の続きならページの真ん中から、サイドメニューの [**VM インスタンス**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/9d5e3373-eb93-47d1-c043-635d812f168a.jpeg) からも確認できます
   ```shell:ユーザー名@cloudshell:~ (プロジェクト名)$
   ssh -i ~/.ssh/my-ssh-key hogehoge@[外部 IP アドレス]
   ```
1. 初回だけ接続時に ```Are you sure you want to continue connecting (yes/no/[fingerprint])?``` と聞かれるので ```yes```
1. ```hogehoge@vm-hoge:~$``` と表示されたら接続完了
1. このままだと、デフォルトのポート番号22のままなので、ポート番号3333へ変更します



## ⑤ ファイアウォールの設定
### ⑤-1　接続先のsshd設定を修正
1. コンソールに以下の4行を入力
   ```shell:hogehoge@vm-hoge:~$
   sudo cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org
   sudo sed -i -e "s/#Port 22/Port 3333/g" /etc/ssh/sshd_config
   sudo systemctl restart sshd
   exit
   ```

### ⑤-2　SSHの22番ポートを閉じるルールの作成
1. 画面左上、Google Cloud ロゴの左にある　[**ナビゲーション メニュー**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/905ec8b6-5113-79f1-4da7-1335f4100d0e.jpeg) から [**すべてのプロダクトを表示**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5f5caefb-2f98-b89f-8dd7-f97d2c8f92b6.jpeg)
1. ネットワーキングの [**VPC ネットワーク**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/d3e1934d-a71e-8c6a-b822-ef2790dd6334.jpeg) を選択
1. [**ファイアウォール** から **ファイアウォール ルールを作成**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5071b503-c3b3-4c18-95bb-64328e8d6839.jpeg)
1. 変更した箇所が以下のテーブル
      | 項目 | 値 |
      |:-:|:-:|
      | 名前 | disable-ssh22 |
      | 説明 | 22番ポートを閉じる |
      | 一致したときのアクション | <INS>**拒否**</INS> |
      | ターゲットタグ | disable-ssh22 |
      | 送信元 IPv4 範囲 | 0.0.0.0/0 |
      | ☑ TCP | 22 |
1. ページの一番下にある [**作成**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/c4741e3a-b6eb-0da4-4a02-988f8fea3f28.jpeg)

### ⑤-3　SSHの3333番ポートを開くルールの作成
1. もう一度、[**ファイアウォール ルールを作成**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/aecf58b3-98e0-eb4d-df46-0deebf214105.jpeg)
1. 変更した箇所が以下のテーブル
      | 項目 | 値 |
      |:-:|:-:|
      | 名前 | enable-ssh3333 |
      | 説明 | 3333番ポートを開く |
      | 一致したときのアクション | <INS>**許可**</INS> |
      | ターゲットタグ | enable-ssh3333 |
      | 送信元 IPv4 範囲 | 0.0.0.0/0 |
      | ☑ TCP | 3333 |
1. ページの一番下にある [**作成**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/c4741e3a-b6eb-0da4-4a02-988f8fea3f28.jpeg)

### ⑤-4　設定をインスタンスに反映
1. 画面左上、Google Cloud ロゴの左にある [**ナビゲーション メニュー**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/905ec8b6-5113-79f1-4da7-1335f4100d0e.jpeg) から [**すべてのプロダクトを表示**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5f5caefb-2f98-b89f-8dd7-f97d2c8f92b6.jpeg)
1. コンピューティングの [**Compute Engine**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/e7102602-e87b-fced-0fdc-e6c2d556823e.jpeg) を選択
1. 作成時につけた [**インスタンス名**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/a25fd260-a189-2cbb-b6fb-73642883ef73.jpeg) をクリック
1. [**編集**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/9f20b109-185e-4945-d6fe-41e07aab7020.jpeg) をクリック
1. 表示されたページの真ん中、やや上にある
   ネットワーク インターフェース　＞　ネットワーク タグ
1. ファイアウォール ルールを作成したときに設定した **ターゲットタグ** を入力
   ![19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/2277548d-eeef-d3b2-bd1c-fb611e05780c.jpeg)
1. ページの下部にある [**保存**](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1934278/5fa144f1-48cb-87d9-3aeb-610b2722b936.jpeg)



## ⑥ もう一度、接続できるか確認
1. コンソールに以下の1行を入力
   今回は **```-p 3333```** でポート番号を指定
   ```shell:ユーザー名@cloudshell:~ (プロジェクト名)$
   ssh -i ~/.ssh/my-ssh-key -p 3333 hogehoge@[外部 IP アドレス]
   ```
1. 接続できたら終わりです、お疲れ様でした


## おまけ： 楽してSSH
※外部IPの設定がデフォルトの場合、IPが切り替わるごとにconfigの再設定が必要
　[お金がかかる](https://cloud.google.com/vpc/network-pricing?hl=ja#ipaddress)が、外部IPをエフェメラル(簡単に言うと動的IP)を静的IPに変更すれば不要になる
1. ```exit``` を入力して接続先から切断しておく
1. コンソールに以下の1行を入力、config を作成・編集する
   ```shell:ユーザー名@cloudshell:~ (プロジェクト名)$
   vim ~/.ssh/config
   ```
1. config ファイルの中身は以下のようにする
   ```config
   Host hogehoge
       HostName [外部 IP アドレス]
       User hogehoge
       Port 3333
       IdentityFile ~/.ssh/my-ssh-key
   ```
1. **Esc** で編集モードを抜けて **Shift + Z** を2回押して保存
1. ウィンドウ下部のコンソールに以下の1行を入力
   ```shell:ユーザー名@cloudshell:~ (プロジェクト名)$
   ssh hogehoge
   ```
1. [⑥ もう一度、接続できるか確認](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd#-%E3%82%82%E3%81%86%E4%B8%80%E5%BA%A6%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D) より楽してSSH接続完了


## メモ
- Ubuntu 22.10以降、sshd関連に変更があるので[上記コマンド](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd#-1%E6%8E%A5%E7%B6%9A%E5%85%88%E3%81%AEsshd%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BF%AE%E6%AD%A3)で設定できない
- [③ SSHの設定](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd#-sshの設定) から先の一連の流れはWindows PowerShell、MacOS ターミナルからも出来る
  Windows PowerShellで行う場合　```~(チルダ)```は```$HOME```に、```vim```はPowerShellに入ってないのでconfigファイルを用意する。
- GCPの無料トライアルを登録後、やってみたいこと(?)は何ですか？みたいなアンケートっぽい画面が表示されるがアンケートではなく、よく使うものをピン留めするだけの有難迷惑なのでスルー推奨
- 楽にコピペできるように書き残したかったので、各コードの頭に **#** (rootユーザー) と **$** (一般ユーザー) は使用しない
- **my-ssh-key** と **hogehoge** は変更可能。admin, root, user のような安直なのは避けるべき
- ファイアウォールの設定 [⑤-2](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd#-2sshの22番ポートを閉じるルールの作成) と [⑤-3](https://qiita.com/kawagoe6884/items/940d87d9a0b7d919f1dd#-3sshの3333番ポートを開くルールの作成) の**名前**、**ターゲットタグ**も変更可能。
- [無料枠 を確認したい](https://cloud.google.com/free/docs/free-cloud-features?hl=ja#compute)
- [Cloud Shell を初期化したい](https://cloud.google.com/shell/docs/resetting-cloud-shell?hl=ja#reset) ~~公式ガイド推奨バルス~~
- ["Permission denied (publickey)" の対応](https://stackoverflow.com/questions/51614552/google-cloud-platform-ssh-to-google-cloud-instance-will-have-permission-denied)
- [ssh コマンドをスッキリさせる](https://qiita.com/miyuki_samitani/items/0ae736fee026337ccdb9)
- ```shell:鍵長とハッシュ値と公開鍵暗号の方式の確認
  ssh-keygen -l -f ~/.ssh/my-ssh-key.pub
  ```
- ```shell:.ssh パーミッションの一括変更
  find ~/.ssh -type d -print | xargs chmod 700 ; find ~/.ssh -type f -print | xargs chmod 600
  ```


## 参考先
https://qiita.com/Brutus/items/22dfd31a681b67837a74

https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd#ssh-%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%82%92%E3%81%8B%E3%81%88%E3%82%8B

https://qiita.com/kira_puka/items/429caa48218d6597c363

https://ideal-reality.com/computer/server/ssh-config-permission/