GCPが高すぎる！！のでコストカットしてみた！

## はじめに

個人で運用しているサービスにGCPを使っているが、$300分の無料枠を使い切ってしまったので、コストカットについて真剣に考える
（無料枠とはいえ、最初から考えておくべきだった、、、しかも無料枠のほとんどはelasticsearchを試しに使ってみた際にdeploymentをdeleteするのを怠ったせいで、半分くらい消費してた、、、、）

## 明細確認（2020年7月）

まずは、Googleから届いた明細を確認する
合計で10000円ほどだった
勉強がてら作成した月1000アクセスしかないサービスで月10000円はちょっと高すぎる、、

- Compute Engine 合計 9320円
  - N1 Predefined Instance Core running in Americas 2500円
  - N1 Predefined Instance Core running in Americas 2400円
  - N1 Predefined Instance Ram running in Americas 1300円
  - N1 Predefined Instance Ram running in Americas 1200円
  - Network Load Balancing 2000円
  - HTTP Load Balancing 800円
  - Storage PD Capacity 750円
  - External IP Charge 350円
  - tatic Ip Charge 20円
  - 継続利用割引 -2000円
- Cloud SQL 合計 1000円
  - Micro instance 800円
  - Standard storage 200円
- Cloud DNS
  - ManagedZone 20円
- Cloud Storage 1円

それぞれ費用の高いものをピックアップして、もっと安くならないか検討していく！


## Compute Engine 合計 9320円

合計9320円と今回の最大のターゲットだ
さらに分割してそれぞれ見ていく

### Core running 4900円　Ram running 2500円

#### 課金の仕組みを整理

- 使用量に応じて課金される
- 使用量はギガバイト（GB）単位で計算される
- 請求書には1時間あたりのvCPUとメモリ使用量が個別に記載される
- ステータスがRUNNINGのインスタンスに対して課金される
- 割引が適用される（継続利用割引、確約利用割引、プリエンプティブルVMインスタンス割引のいづれか）

#### 価格表から7月の請求金額と比べる

![スクリーンショット 2020-08-09 22.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/c1990706-1551-1da1-0835-89be7ead4326.png)

今使用しているインスタンスが2つでそれぞれvCPUは1つ、そしてメモリは3.75GB
価格表よりほぼ請求金額と一致した
・CPUの費用は $0.031611 * 1 * 765(7月の使用時間) * 105(ドル円相場) = 2539.15...
・メモリの費用は $0.004237 * 3.75 * 765(7月の使用時間) * 105(ドル円相場) = 1276.26...

算出方法は理解できたので、ここからコストカットできないか検討する

#### コストカット

まず、インスタンスのタイプを変更する
n1-standard-1（vCPU x 1、メモリ 3.75 GB）が1番低スペックだと思っていたが、プリエンプティブルなるものがあった！！

プリエンプティブルなインスタンスについて簡単にまとめると
・通常のインスタンスよりはるかに低価格で作成、実行できるインスタンス
・他のタスクのリソースへのアクセスが必要な場合に、Compute Engine によって終了（プリエンプト）される可能性がある
・Compute Engine の余剰のキャパシティを利用する機能であり、使用できるかどうかは利用状況に応じて異なる
・Compute Engine は、24 時間実行した後で、必ずプリエンプティブル インスタンスを終了する

サービスレベルが落ちる可能性があるが、どこまで影響あるかは使ってみて検証する（何より価格が破格！）

次に、インスタンスは2つもいるのかというところで、結論いらない
当時はローリングアップデートの際にpodがスケジューリングできなくて、増やしたと記憶しているが、
サービスの性質上、デプロイ中はサービスが停止するのは許容できる（本当はよくないことではあるが、、）
または、デプロイするときだけインスタンスを増やすという作戦もある（めんどくさいけど、、、）

```bash:起動しているインスタンスを確認
$ gcloud compute instances list
NAME                                                ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-gke-cluster-xxxxxx  us-west1-a  n1-standard-1               xxx.xxx.xxx.xxx  xxx.xxx.xxx.xxx  RUNNING
gke-gke-cluster-xxxxxx  us-west1-a  n1-standard-1               xxx.xxx.xxx.xxx   xxx.xxx.xxx.xxx   RUNNING
```

#### 来月の請求見込みは一体いくら！？

インスタンスは1つで
・CPUの費用は $0.006655 * 1 * 765(使用時間) * 105(ドル円相場) = 534.5628...
・メモリの費用は $0.000892 * 3.75 * 765(使用時間) * 105(ドル円相場) = 268.687..

以上より、約800円と試算！（4500円ほどコストカットに成功（のはず））🎉

### Network Load Balancing 2000円 HTTP Load Balancing 850円

#### 価格表から7月の請求金額と比べる

![スクリーンショット 2020-08-10 0.23.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/a7b4e3e8-f2b3-bd9b-6013-dd7955e7d706.png)

Network Load Balancingは転送ルールは増やしてないので、価格表より
0.025 * 765(7月の使用時間) * 105(ドル円相場) = 2008.125円（今月の請求と大体一致）

#### コストカット

Network Load Balancingは転送ルールも増やしてないので、これ以上コストカットできなそう。。。

HTTP Load BalancingはArgoCDで作成されたロードバランサなので、削除する。（デプロイするときに都度都度立ち上げるか。。）
サービス側のnamespaceと合わせて、Network Load Balancingの転送ルールを増やすことで、兼用できそうなので後日検討する

結果的に、来月からは2000円のみの請求となるはず！🎉

### Storage PD Capacity 750円

#### 課金の仕組みを整理

- 各VMインスタンスには、1つ以上のディスクが接続されていて、各ディスクには費用がかかる
- ディスク関連のすべての課金は、秒単位で計算され、すべての永続ディスクタイプ、スナップショット ストレージ、ローカルSSD料金が含まれる
- ディスクのプロビジョニング容量には、使用済みおよび未使用のすべての容量が含まれる

#### 価格表から7月の請求金額と比べる

![スクリーンショット 2020-08-10 18.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/5ca0f6be-c539-c831-ebdd-985af3e89152.png)

2つのインスタンスでそれぞれ100GBの標準の永続ディスクを使っていたので、下記のような計算となる。
0.04 * 200 * 105 = 820

#### コストカット

まずはインタタンスの数を1つに減らしたので、半額となる
また、100GB使ってないはず、ということで確認してみると

```bash
# df -hT
ファイルシス   タイプ  サイズ  使用  残り 使用% マウント位置
overlay        overlay    95G  5.9G   89G    7% /
```

案の定、7%ほどしか使ってないので、50GBくらい変更する

![スクリーンショット 2020-08-10 18.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/3c8d1727-d67e-2707-3e9c-ad0734135393.png)

と思ったら、最低100GBしか設定できなかった、、、（こんなにいらないのに、、）

ストレージに関してはインスタンスを1つに減らしたことで、来月は400円ほどになるはず🎉

### External IP Charge 350円

#### 価格表から7月の請求金額と比べる

![スクリーンショット 2020-08-10 19.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/50e264ea-1d75-5225-835f-97efd07f2969.png)

> 予約した静的外部IPアドレスをVMインスタンスや転送ルールなどのリソースに割り当てていない場合、その未使用のIPアドレスは、使用中の静的外部IPアドレスとエフェメラル外部 IPアドレスよりも課金レートが高くなります。

これは驚き！

ちょっとわからなかったのが、
7月は使用時間が1500時間で300円ほどの請求で、1時間に$0.002
プリエンティブルなVMインスタンスを使っていたわけではないのに、なぜだ、、🧐
（使用時間が1500時間というのもよくわからない、、）

#### コストカット

これ以上下がりそうもなさそうなので、来月の試算すると（インスタンスをプリエンプティブルにしたので下がるかもしれないが、）
0.002 * 3(使用しているIPアドレスの数） * 105 * 765 = 481.95

算出方法が間違っているかもしれないが、来月は480円くらいと予想！

## Cloud SQL 合計 1000円

#### 課金の仕組みを整理

- Cloud SQLの料金は、使用しているインスタンスのタイプによって異なる（MySQL第2世代を使っている）
- インスタンスの料金、ストレージとネットワークの料金によって構成される

#### 価格表から7月の請求金額と比べる

##### インスタンスの料金

![スクリーンショット 2020-08-10 19.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/cb9ede07-10a5-1d93-e4f9-56ee20cc715a.png)

7月の利用料金を算出してみると
0.0105 * 740（使用時間） * 105 = 815.85（請求金額とほぼ一致！）

##### ストレージの料金（ネットワークに関しても請求料金が0だったので無視する）

![スクリーンショット 2020-08-10 20.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214984/8763252a-68d4-d165-f322-b2af9af8fbf2.png)

7月の利用料金を算出してみると
10(GB) * 0.17 * 105 = 178.5（請求金額とほぼ一致！）

#### コストカット

インスタンスの料金に関しては、現在使っているマシンタイプはdb-f1-microで、最低のスペックを使っているので、これ以上コストカットできない、、
また、ストレージの料金に関しても、10GB以下には設定できないので、来月の請求もおよそ1000円くらいとなるだろう


## まとめ

来週の請求予想をまとめると

- Compute Engine 合計 3195円
  - N1 Predefined Instance Core running in Americas 550円
  - N1 Predefined Instance Ram running in Americas 250円
  - Network Load Balancing 2000円
  - Storage PD Capacity 375円
  - External IP Charge 350円
  - tatic Ip Charge 20円
- Cloud SQL 合計 1000円
  - Micro instance 800円
  - Standard storage 200円
- Cloud DNS
  - ManagedZone 20円
- Cloud Storage 1円

合計4216円と試算した
約6800円のコストカットに成功！！🎉（なはず）

まだ不明な点はあるが、GCPにコストに対して完全に無頓着な状態からは脱却でき、無駄なコストも削減できそうでよかった！
（とはいえ、コストをカットした分、サービスにどのくらい影響を受けるかはウォッチしておく）


## 参考

https://console.cloud.google.com/?hl=ja