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

## このスライドについて

* GCE の無料枠で遊ぶときに、やったほうがいいこととかを紹介します。
* 大体無料で運用できますが、1年間以上の長期運用をする場合はお金がかかるかもしれません。

---
## やったこと
お金をかけずに以下のことができるようにしてみました

* GCE のサーバインスタンスを立てた
* ドメイン取った
* HTTPS 対応した

---
## 概要
私が気づいた「気をつけたほうがいいこと」は、大まかにこんなかんじ。

* 最初に[支払いのログの設定](http://qiita.com/hnw/items/409d6b7c431ca5f74eb2)をする
    * [バケットとオブジェクトの命名ガイドライン](https://cloud.google.com/storage/docs/naming)に従う
* [GCP の無料枠](https://cloud.google.com/free/docs/always-free-usage-limits)でなんとかなるようにする
  * [GCEのf1-microインスタンスを真にタダで使う方法](http://qiita.com/hnw/items/a4e395d047b382e7dc5f) の問題
* [無料ドメインをとる](http://www.freenom.com)
    * [DDNS（ieServer.net系）](https://ieserver.net)だと、証明書発行できない
    * [1年間までなら無料で使えるドメイン](https://my.freenom.com)はある
    * 有料でも、[安めのドメイン](http://www.onamae.com/service/d-regist/price.html)を買ったほうがいいかもしれない？
* [Let's Encrypt](https://letsencrypt.jp/) の証明書を使って HTTPS対応
    * certbot やるだけ
    * 更新忘れないように、cron する
* マシンパワーがないので、PHPのビルドとかはしない
  * `yum install` とか `apt-get install` とかは許容範囲
  * `.configure && make` とかやるなら、数時間かかることを覚悟する

---
## 最初に支払いのログの設定をする
意図しない課金が発生するかもしれないので、そのときに原因がわかるようにします。
@hnw さんの [『GCPの課金データ取得のススメ』](http://qiita.com/hnw/items/409d6b7c431ca5f74eb2)に従って、支払い料金の明細ログを残すようにします。

---
### 11月に1円課金されるかも
@hnw さんが『[無料のはずのGCEのf1-microインスタンスで11月だけ1円課金された理由](https://qiita.com/hnw/items/8a422ccbc63dfbd9e3b9)』で紹介しているように、11月に1円課金されるかもしれません。
こういうのを見つけるために、「最初に支払いのログの設定をする」わけですね。

---
## GCS のバケット名に注意
> ユーザー ID、メールアドレス、プロジェクト名、プロジェクト番号、個人を特定可能な情報（PII）をバケット名やオブジェクト名に使用しないでください。

保存先の GCS のバケット名の付け方に気をつけてください。[『バケットとオブジェクトの命名ガイドライン』](https://cloud.google.com/storage/docs/naming)と[Google Cloud Storage のベスト プラクティス](https://cloud.google.com/storage/docs/best-practices)を参考にしましょう。

---
## バケット名に注意
自分が見るために Google Cloud Console から参照できればいいので、私は以下のコードで生成しました。

```php:バケット名を適当に作る
<?php
echo hash('sha256', microtime(true));
 // b1a4bde7cb21813360e98e16277d66934cb2c6d1c69e15a2b7485db84da8691f みたいなやつ
```

---
## インスタンス立てる前に、SSHで使うユーザ名と認証鍵の登録をする
Google Cloud Console の SSH クライアントだと、遅かったりして使い勝手がびみょいので、普通に `ssh` できるようにしたほうがいいです。

--- 
## ユーザ名と鍵の登録は、「Compute Engine」 の 「メタデータ」
初見だとわかりにくいです。

![鍵の登録1.png](https://qiita-image-store.s3.amazonaws.com/0/29233/cd2940c6-2d23-f380-bba2-2a922ec73647.png)

![鍵の登録2.png](https://qiita-image-store.s3.amazonaws.com/0/29233/408a8fcd-d2c1-ae41-1b13-35d9dc4ffb75.png)

---
## `ed25519` がカジュアルにつかえる
私はとりあえず `ed25519` の鍵を使っています。

新し目のアルゴリズムの鍵がカジュアルに使えるのは良いですね。

---
# f1-micro のインスタンスを立てる

---
## リージョンは `us-` のやつ選ぶ
![リージョン選ぶ.png](https://qiita-image-store.s3.amazonaws.com/0/29233/2c5f3482-3a84-a320-60fa-e59814587667.png)

`us-**` のインスタンスを選ぶ。他のリージョンは無料インスタンスの対象外です。

たぶん、西海岸のほうが早いので、私は西海岸のインスタンスにしました。
速度計測とかしてないけど、ストレスになるほど遅くはありません。（個人差があると思います）

---
## インスタンスサイズを忘れずに `micro` にする
![インスタンスのサイズを選ぶ.png](https://qiita-image-store.s3.amazonaws.com/0/29233/7fa21967-8778-c126-ccb2-42e4efd75353.png)

デフォルトだと、 `vCPU x1` になっています。 `micro` にすると、無料になるっていうメッセージが出てきます。

---
## ハードディスクのサイズを 30GB にする
![OSと、ハードディスクのサイズを調整.png](https://qiita-image-store.s3.amazonaws.com/0/29233/83a3ec24-4671-26e2-5de0-186896016eda.png)

デフォルトだと、 10GB になっています。[30GBまで無料](https://cloud.google.com/compute/pricing#freeusage)なので、30GBにしておきましょう。

---
## 80 と 443 を開けておく
![HTTPとHTTPSは使う.png](https://qiita-image-store.s3.amazonaws.com/0/29233/61f5f7d9-da8f-10a4-fa50-da1849da448b.png)

Let's Encrypt の `certbot` を使いたいので、事前に開けておきます。

---
## IPアドレスを固定しておく
サーバインスタンスが動いていれば、固定のIPアドレスにしても無料なので、使いましょう。

![IPアドレス固定.png](https://qiita-image-store.s3.amazonaws.com/0/29233/4bd9ce10-e471-c8ea-5930-14f19fe3ba97.png)

---
## 使っていない固定のIPアドレスは、お金かかる
「ネットワークの外部IPアドレス」を確認して、あったら早めに開放しましょう。

![未割り当てのIPアドレス.png](https://qiita-image-store.s3.amazonaws.com/0/29233/72e94129-90eb-48aa-484f-3016a17b8acd.png)

---
## SSH のポート番号をかえる
22番ポート以外でつなげるようにし、「22番を閉じるルールを上書きする」ルールを適用します。

以下の手順でやります。

1. 適当なポート番号で、FW開ける
1. サーバに、1.の設定を適用するタグをつける
1. sshd の設定をして、プロセスを再起動
1. 22番を閉じるルールを作る
1. サーバに、3. の設定を適用するタグをつける

これをする理由は、『[22番ポートにブルートフォース攻撃されて、数円課金される可能性](http://qiita.com/hnw/items/a4e395d047b382e7dc5f)を潰す』ため。セキュリティ的な面でも、ポート番号変えておいたほうが良さそうです。

---
## 適当なポートをひとつ開ける
![ポートをひとつ開ける.png](https://qiita-image-store.s3.amazonaws.com/0/29233/584c68b0-c679-41df-7970-f4a7eb6b6124.png)
ルールの名前は、デフォルトのルールにならって、 `allow-XXXX` （XXXXはポート番号）にすると良いです。

ターゲットタグは、デフォルトのルールにならって、 `allowXXXX-server` （XXXXはポート番号）にすると良いです。

この「ポートを開けるルール」を適用したサーバは、この設定をした時点では存在しないので、タグを付けなければいけません。

---
## サーバに「ポートを開ける」タグを付ける
「ポートを開けるルール」で指定した "ターゲットタグ" を追加。

![タグ追加1.png](https://qiita-image-store.s3.amazonaws.com/0/29233/b9770ca7-b54a-63fb-1fef-992da54e0b17.png)

---
## sshd_config のポート番号の設定をかえる
`sudo vi /etc/ssh/sshd_config` で、SSH のポート番号を変更して、 `systemctl restart sshd` する

```diff:/etc/ssh/sshd_config
@@ -14,7 +14,7 @@
 # SELinux about this change.
 # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
 #
-#Port 22
+Port XXXX （XXXX は さっき開けたポート番号）
 #AddressFamily any
 #ListenAddress 0.0.0.0
 #ListenAddress ::
```

これをやるまでは、普通に22 番ポートで作業してください。sshd が使うポート番号の設定をしていないのだから、当然22番ポートで待機しています。

`systemctl restart sshd` したら、新しく設定したポート番号で待機するようになります。
**`sshd_config` の編集をしたターミナルは閉じずにそのまま** で、新しく設定したポートでログインできるかを、新規に繋いで確認してください。確認できたら、閉じていいです。

確認できたら、次に進んでください。

---
## 22 を閉じるルールを追加
![22を閉じる.png](https://qiita-image-store.s3.amazonaws.com/0/29233/e4590f00-7949-3ec5-9ba1-2e8025a3c46a.png)

ポートを開けるときと同じようにやります。
ルールの名前は、`allow` のルールと対になるように、 `disallow-22`にすると良いです。

ターゲットタグは、私は `disallow22-server` にしています。

---
## 「22 を閉じる」ルールを、サーバにタグ付け

ポート開けたときと同様に、ポートを閉じるタグを追加する。

![タグ追加2.png](https://qiita-image-store.s3.amazonaws.com/0/29233/0bd40271-e574-0798-54da-869153fbf596.png)

 22番でアクセスできないことを確認してください。

---
# ドメイン取って証明書発行する
---
## DDNS（ダイナミックDNS） では証明書を取得できない
自宅サーバでは、 [ndxbn.dip.jp](ndxbn.dip.jp) っていう DDNS を使っているのですが、 dip.jp で証明書が取れません。
DDNS は 「dip.jp にサブドメインを割り当てて、正引きできるようにする」のを自動化したサービスだからです。

HTTPSを使いたい場合は、証明書の発行をするのにドメインを取らざるを得ません。

---
## 無料ドメインを取る
[freenom.com](freenom.com) というサービスがあって、12ヶ月間は無料で使えるドメインがとれます。

`ndxbn.tk` をとりました。`tk` が tokyo の略っぽく見えるので。

---
## 1年以上使うなら、安いドメインを取るのも良さそう
[10年契約でも、1万円を切るドメイン](http://www.onamae.com/service/d-regist/price.html)があります。

freenpm.com の無料ドメインが1年分までしか取れないので、1年以上使う予定があるなら、安いドメインを長期で買ってしまっても良いかも。

---
## 【余談】無料ドメイン取る前に、安いドメイン取ってた

無料のドメインを取る前に、 `ndxbn.tokyo` を10年契約でとってしまいまいた。

`ndxbn.tokyo` ドメインを買ったあとで、 「そいうえば無料ドメインあるんじゃね？」と思って、ｇｇったらあった、という感じです。（悲しみ）

一番安いドメインとかだと １年で 1000 円くらいですが、それでも「とりあえず無料で全部やってみたい」という人に同じミスはしてほしくないです。

---
## Let's Encrypt で証明書を発行
`certbot` で発行します。お手軽。

[（日本語の）解説サイト](https://letsencrypt.jp/usage/#GetClientSoftware)を見てやります。オプションの説明とかがややこしいです。

とりあえず、以下のようにやっておけば大丈夫です。

```bash
sudo yum install epel-release
sudo yum install certbot
certbot certonly --webroot -d XXXX.tk #XXXX.tk は、取ったドメイン
```

---
# その他 注意事項
---
## PHPのビルドとかはしない
性能ないので、PHPのビルドとかは厳しいです。

[phpenv](https://github.com/phpenv/phpenv) で ７.１.４ をビルドしたら、62分かかりました。

---
### ビルドした時の様子

/* ここにビルドした時の画像を貼る */

---
# その他参考になる資料
---
## [エンタープライズ企業のベスト プラクティス](https://cloud.google.com/docs/enterprise/best-practices-for-enterprise-organizations)

[エンタープライズ企業のベスト プラクティス](https://cloud.google.com/docs/enterprise/best-practices-for-enterprise-organizations)

> エンタープライズ企業が Google Cloud Platform を最大限活用するための、重要な概念とベスト プラクティスについて学んでみましょう

個人で使うにも参考になりそう（？）な情報があったりなかったり。

---
## [一から学べる Google Cloud Networking リファレンス ガイド](https://cloudplatform-jp.googleblog.com/2016/10/google-cloud-networking_4.html)

> Google Cloud Networking について知りたい人のためにリンク集を作りました。それがこの投稿です。

 [一から学べる Google Cloud Networking リファレンス ガイド](https://cloudplatform-jp.googleblog.com/2016/10/google-cloud-networking_4.html)より引用