ゼロからWeb開発

ゼロからWeb開発

育休2回も経てる間に時代に取り残されちゃったWeb開発者のブログ

GCEで事前準備(SSHでサーバー接続するまで編)

課金状況ふまえまして、GCEでRailsアプリ作ることにしました( ;∀;)

今までの苦労は…ってあんまりしてないか。せっかく環境作らなくていいと思ったのに\(^o^)/

と思ったらワンクリックでRuby on Rails環境をデプロイできるだと…!?

www.publickey1.jp

 しかし課金部分が気になる…そしてそれをどうやって作るのかの記事が見当たらない…けど関係ないWordPressの記事見てたら出てきた笑。

これかな?

LAMP Stack|Google Cloud Launcher

 でもインスタンスがn1-standard-1で無料枠のf1-microじゃないっぽいのでやめとこう…

 

今回は常時無料枠を気にして進めていきたい。けど試しながら進めるので課金されたら後戻りかそのまま突っ走るかを決めていきたい。

▼GCE無料枠

Google Compute Engine の料金  |  Compute Engine ドキュメント  |  Google Cloud

 

-----------------------------------------------------------------------------------------------------------

ではでは、GCEでRailsアプリ作成の事前準備をしていこう。

これ参考に進めていく。

いつでも無料!Google Compute Engine 常時無料枠の使い方 | あぱーブログ

遙かデジタリアへ: RubyのCGIをGoogle Cloud Platformの無料枠で動かしたい ~(1)セットアップ

Google Compute Engine で apacheウェブサーバを無料でつくってみた【GoogleComputeEngine】 - DRYな備忘録

GCEでWordPressがほぼ無料運用できるようになったので改めてまとめる – codes / cipher

 

GCPの設定

1.プロジェクト作成

GCPコンソールからプロジェクトを新規作成する。

 

2.VMインスタンス作成

Compute Engine>VMインスタンスから作成する。

f:id:muzirushi78:20180402135457p:plain

  • ゾーン(リージョン)は米国のみ無料枠のため、USから始まるゾーンを選択
  • マシンタイプは無料枠のmicro
  • ブートディスクは慣れたCentOSで、標準の永続ディスク無料枠分30GB
    CentOSは会社で使ってるからと以前これで構築したから

 

f:id:muzirushi78:20180403092857p:plain

 

f:id:muzirushi78:20180403131142p:plain

f:id:muzirushi78:20180403131952p:plain

 

SSH接続設定

1.SSHクライアントへの接続

ローカルPCで動くネイティブSSHクライアントの方が後々便利らしいが、とりあえず今はブラウザ上からSSHクライアントを起動できるのでそれでする。

gcloudコマンドはインスタンス管理とかに便利らしい。

よく使うgcloudコマンドたち - Qiita

f:id:muzirushi78:20180403135320p:plain

 

Welcome to Cloud Shell! Type "help" to get started.$ gcloud compute --project "【プロジェクトID】" ssh --zone "us-east1-b" "instance-1"

cloud shellでgcloudコマンドを実行するために自分のプロジェクトにアクセスするための一文がもう書いてあるのでそのままエンター

 

WARNING: The public SSH key file for gcloud does not exist.WARNING: The private SSH key file for gcloud does not exist.WARNING: You do not have an SSH key for gcloud.WARNING: SSH keygen will be executed to generate a key.This tool needs to create the directory[/home/【Googleアカウント】/.ssh] before being able to generate SSHkeys.Do you want to continue (Y/n)?

WARNINGと出てビクっとするが、SSH鍵がないよ~との警告。

SSH鍵作る?と聞いてきてくれるので「y」を入力。

 

Generating public/private rsa key pair.Enter passphrase (empty for no passphrase):

パスフレーズを入力。で、再度入れろに対しても入力するとSSH秘密鍵を作成してComputeEngineに登録される。

SSH秘密鍵のパスフレーズは(つけるなら)11文字以上にしましょうねという話 - 本当は怖い情報科学

ちなみにあとで変更も可能。その場合は(今はやってない)、ssh-keygen -p.

 

Enter passphrase for key '/home/【Googleアカウント】/.ssh/google_compute_engine':

さらにパスフレーズを聞いてくるので入れるとログインされる。

 

2.SSHのセキュリティ対策

せっかく作成したVMインスタンスを好きなようにいじっていきたいが、その前にセキュリティ対策をしていく。

デフォルトではポート番号22が使われているが、このままだと悪意あるユーザに攻撃されまくりで課金されちゃうのも嫌なので変更します!

 

参考するのは

CentOSでSSHのポート番号変更~VPSのセキュリティ対策! | Affiwork

SSHのセキュリティ対策について | server-memo.net

GCE の無料枠のサーバを立るときに、初見でハマりそうなところ - Qiita

【GCE/CentOS 7】Google Compute Engine で ssh に繋がらない(sshd起動失敗)場合の復旧方法 - TokunagaKazuya.tk

3番目リンクの通りやったら4番目リンクのようにSSH接続できなくなるよう。なので3番目リンクと4番目リンクは合わせ技で。 

 

ファイアウォールルールの追加

ネットワーキング>VPCネットワーク>ファイアウォール ルール>ファイアウォール ルールの作成

f:id:muzirushi78:20180403213847p:plain

隠れてる部分は全部開けたいポート番号。隠す必要ないけど(・_・;)

このポート番号は好きな番号(0番~65535番)でいいけど、よく使われているwell knownポート(0~1023番)、企業等のプログラムの登録済みポート番号(1024番~49151番)以外がいい。

ファイアウォールルール作成後、Compute Engine>VMインスタンス>該当のVMインスタンス>編集>ネットワーク タグに上記で作成したターゲットタグを追加

f:id:muzirushi78:20180403215759p:plain

 

SELinuxiptables(firewall) の無効化

CentOSで標準に備わっているSELinuxiptables(firewall) を無効化する。

$ sudo systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

/etc/selinux/configを編集したいので、その前にバックアップ。

$ cd /etc/selinux/

ファイル確認。うむあるな。バックアップしてまた確認。

$ lsconfig final semanage.conf targeted tmp

$ sudo cp config config_180403 

$ lsconfig config_180403 final semanage.conf targeted tmp

編集~下図のような編集をする。

$ sudo vim config

f:id:muzirushi78:20180403221831p:plain

このvimがね、まだ慣れないのよ。使いづらい。でも慣れたらvim最高~~!ふ~~!ってなるらしいので慣れるまで使いまくるぜ。

脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き) - Qiita

ちなみに

  • 「/SELINUX」でSELINUXを検索、「n」で次のSELINUXを検索
  • 「i」で編集モード
  • 「ctrl + [」でコマンドモードに戻る
  • 「:wq」で保存して閉じる(「:q」で保存せずに閉じる)
  • 「:q!」で編集したはいいものの、なかったことにしたいので保存せずに閉じる

 

 

ポート番号の変更

ポート番号は/etc/ssh/sshd_configファイルに書いてあり、編集の前にバックアップ。

$ cd /etc/ssh

$ lssshd_config 他諸々

$ sudo cp sshd_config sshd_config_180403
$ lssshd_config sshd_config_180403 他諸々

できたできた。

$ sudo vim sshd_config

 以下のように編集。デフォルトから「#Port 22」とコメントアウトされているので、その下に「Port ポート番号」を追加。

f:id:muzirushi78:20180403223303p:plain

リロードして設定を反映させる。

 $ sudo systemctl restart sshd

 

ここで一旦確認

ブラウザ上のSSHからアクセスできないことを確認。

f:id:muzirushi78:20180403224640p:plain

 以下のエラーが出るので、ポート22で接続できなくなったようだ。

f:id:muzirushi78:20180403224804p:plain

また、「gcloudコマンドを表示」でも接続できなくなった。

$ gcloud compute --project "branchesproject-gce" ssh --zone "us-east1-b" "instance-1"ssh: connect to host 35.231.222.26 port 22: Connection refusedERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].

以下を試したけどConnection timed outする。

ターミナルから GCE に gcloud でログインする場合(SSH ポート変更後) - 技術メモ2

ちなみに「ブラウザ ウィンドウでカスタムポートを開く」からなら指定のポート番号からSSH接続できた。sudoも使える。しかし遅い。接続がとんでもなく遅い。

 

サーバーの再起動

VMインスタンスを停止→開始して、サーバーを再起動する。

で、上記の反映確認。

$ sudo systemctl is-enabled firewallddisabled

$ getenforceDisabled

どちらもdisabledと出たのでOK!

 

ちなみにrootのパスワード設定したり、参考リンク② の通り進めたかったけど、gcloudコマンドでSSH接続がまだ出来ないので、ちょっと後回し…

 

ローカルからSSH接続

1.GoogleCloudSDKのインストール

ブラウザのターミナルから接続すると遅いので、GoogleCloudSDKをインストール。

▼参考

Google Cloud SDK のインストール方法(Windows版)|apps-gcp.com|G Suite(旧:Google Apps) やGoogle Cloud Platform サービスについて紹介します

インストール失敗した…

Windows版Google Cloud SDKのインストールに失敗する - Qiita

これ試したけど上手くいかず…とりあえずユーザ名が日本語なのが原因らしい。そこでc:\users\ユーザ名~を変更しました。変更するだけじゃだめよ。

もう幼ければなんでもいい Windows7で簡単にユーザーフォルダ名を変更する方法

ふにゃぶろ! ユーザープロファイルのフォルダ名を変更する

リスクありそうなので、自己責任でお願いします!

 

2.初期設定

あとは作成したVMインスタンスに接続したい。

Google Cloud SDKのインストールと認証の設定について - TASK NOTES

出来たショートカットから起動。

f:id:muzirushi78:20180405110341p:plain

以下赤字が私が入力。

インストール後にCloudSDKを初期化する。

>gcloud init

Pick configuration to use:
[1] Re-initialize this configuration [default] with new settings
[2] Create a new configuration
Please enter your numeric choice:  1

どの構成か選べ…?初期構成の最初期化の「1」を選択(英語能力は底辺)。

 

Choose the account you would like to use to perform operations for
this configuration:
[1] 【自分のGoogleアカウント】@gmail.com
[2] Log in with a new account
Please enter your numeric choice: 1

ログインを求められるので、「1」と入力し、次はプロジェクト選択しろと言われるので、プロジェクト選択。

Do you want to configure a default Compute Region and Zone? (Y/n)?  y(nでも良かったのかも。変更したかったわけじゃないし。

デフォルトのリージョンまたはゾーンの変更  |  Compute Engine ドキュメント  |  Google Cloud


Which Google Compute Engine zone would you like to use as project
default?
If you do not specify a zone via a command line flag while working
with Compute Engine resources, the default is assumed.
[1] us-east1-b
[2] us-east1-c
~~~以下リージョンがズラズラ

Please enter numeric choice or text value (must exactly match list
item): 1(上述と同じところを選ぶ)

Your project default Compute Engine zone has been set to [us-east1-b].
You can change it by running [gcloud config set compute/zone NAME].

Your project default Compute Engine region has been set to [us-east1].
You can change it by running [gcloud config set compute/region NAME].

Created a default .boto configuration file at [C:\Users\sato\.boto]. See this fi
le and

(略)

C:\Program Files (x86)\Google\Cloud SDK>

 

3.SSH接続

で、次にSSH接続してみる。

>gcloud compute --project "【プロジェクトID】" ssh --zone "us-east1-b" "instance-1" --ssh-flag="-p 【ポート番号】"

WARNING: The PuTTY PPK SSH key file for gcloud does not exist.
WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [C:\Users\【ユーザ名】\.ssh] before
being able to generate SSH keys.

Do you want to continue (Y/n)? y

ERROR: gcloud crashed (UnicodeDecodeError): 'ascii' codec can't decode byte 0x82
in position 0: ordinal not in range(128)

If you would like to report this issue, please run the following command:
gcloud feedback

To check gcloud for common problems, please run the following command:
gcloud info --run-diagnostics

もう一回やると

>gcloud compute --project "【プロジェクトID】" ssh --zone "us-east1-b" "instance-1" --ssh-flag="-p 【ポート番号】"

Updating project ssh metadata...|Updated [https://www.googleapis.com/compute/v1/
projects/branchesproject-gce].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.
plink: unknown option "-p"
ERROR: (gcloud.compute.ssh) Could not SSH into the instance. It is possible tha
t your SSH key has not propagated to the instance yet. Try running this command
again. If you still cannot connect, verify that the firewall and instance are s
et to accept ssh traffic. 

あれ、ポート番号指定の方法(後述参照)が違う??「-p」なんて知らない言われてるよ。あと、SSH keyもないって。で、UnicodeDecodeErrorはascii文字じゃない字(日本語とか)が入ってると出るエラー。

Google Cloud Platform - OSS ERP Compiere Distribution Lab

コンソール>Compute Engine>メタデータSSH認証鍵を確認。

f:id:muzirushi78:20180405221739p:plain

おほう…まさかの…ローカルPCのユーザ名(日本語)が残ってるよ…

上述で変更したけどね、プロファイルのユーザ名変更する前にgcloud initしちゃったのよ…それのせいかな…

あとローカルPCの\\ユーザフォルダ\.ssh\google_compute_engine.pubの中身見たら、ユーザ名(日本語)が文字化けしてるわ…

google_compute_engine.pubの文字化けをユーザ名(英数)に修正し、VMインスタンスの方も日本語入ってるSSH認証鍵は削除して、ユーザ名(英数)の方のSSH認証鍵を追加。

で、今度はポート番号消して

>gcloud compute --project "【プロジェクトID】" ssh --zone "us-east1-b" "instance-1"

 あ、進んだ。で、コネクションエラー出てPuTTYの真っ黒の画面だけになった。

PuTTYの左上のアイコンクリックして「New Session」を選択。

f:id:muzirushi78:20180405222611p:plain

VMインスタンスの外部IPアドレスとポート番号入力して接続。

f:id:muzirushi78:20180405223329p:plain

次に下記画面のSSH認証鍵の設定で、プライベートキーをローカルPCの\\ユーザフォルダ\.ssh\google_compute_engine.ppkを選択。

f:id:muzirushi78:20180405223652p:plain

うーん、またエラー…

f:id:muzirushi78:20180405223737p:plain

(PuTTYユーザマニュアル) 2.2 ホストキーを検証する(SSHのみ) - 2.2 Verifying the host key (SSH only) - いろいろ解析日記

警告してくれてるだけでそのまま進めてもいいよう。「はい」を選択。

ユーザ名を聞かれるので、ローカルPCのユーザ名を入力。

f:id:muzirushi78:20180405231536p:plain

Authenticating with public key "ローカルPC名\ユーザ名(日本語)@PC名"

……!!!!!!!!!?????????????

まだ付いてくるかユーザ名(日本語)ーーーーーーーーーーーーー!!!!!

どうしたらいいんだ…あ、上述のローカルPCの\\ユーザフォルダ\.ssh\google_compute_engine.ppkにユーザ名(日本語)が文字化けで書いてある…しかし直すとログインできない…( ;∀;)とりあえずほっとく…

 

 

 

 

 

 

閑話休題】gcloudでSSH接続の試行錯誤(未解決)

ブラウザからgcloudコマンドでSSH接続したくて、VMインスタンスrsaの公開鍵を登録した話(解決せず)

gceにローカルからgcloudで接続できなくなった場合、そうubuntuで。 - Qiita

$ cd /home/【Googleアカウント】/.ssh

vim google_compute_engine.pub

で、この内容をコピーしたかったけど出来なかったので、vimの設定を変更

vim様でクリップボードにコピーできるようにする - Qiita

初心者向け vimrcの設定方法 - Qiita

$ vim --version | grep clipboard-clipboard

vimの状態見てみると、「-clipboard」となっておりクリップボード利用できない。

バージョンが悪いらしいのだが、設定ファイル編集で出来るようなのでそれで進める。

$ vim ~/.vimrc

これで設定ファイルが作成された状態。

これで以下を追記。

--------------------------------------

" 行番号を表示
set number
" クリップボードの有効
set clipboard=unnamed,autoselect

--------------------------------------

 もう一回確認。$ vim --version | grep clipboard-clipboard

うぬ。まだ「-clipboard」…でもコピー出来るようになったのでよしとする。

そのままVMインスタンスの詳細設定>SSHキーに登録

しかし無効な鍵ですと言われたので、改行や余計な空白を削除してから登録、保存。

$ gcloud compute --project "【プロジェクトID】" ssh --zone "us-east1-b" "instance-1" --ssh-flag="-p 【ポート番号】"

ssh: connect to host 35.231.222.26 port 49153: Connection timed outERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].

しかし結局アクセスできず…

元に戻しました…