AWS EC2を安く使うためのポイント(個人利用向け)

#はじめに
・私がAWS EC2を利用していく中で、これは安く使うためのポイントだと感じたことをまとめました。
・最後まで読んだのにがっかりしたという方を出さないためにここでぶっちゃけておきます。このページの結論は「安くするためのポイント」=「パブリックIPアドレスの固定、スナップショットの利用を諦める」です。この時点で興味がなくなった方はそっとこのページを閉じることをおすすめします。:sunglasses:
・ほぼ個人用のメモ&日記的なもので素人目線かつ間違えた情報を記載しているかもしれません。すべてを鵜呑みにせずにご参照頂けますと助かります。また間違えを指摘していただけますとかなり助かります。

#高くなってしまう理由
・AWS EC2 は仮想マシン（インスタンス）を提供するサービスで、仮想マシンを停止すれば基本的に料金は発生しません。しかし、以下のサービスを利用している場合は、停止状態でも料金が発生してしまいます。この辺を理解せずにAWS EC2を利用していると想定より高いコストを請求されることになります。
※かなり大雑把にまとめてしまいましたがご容赦ください。

- Amazon Elastic Block Store (Amazon EBS)
 - 汎用 SSD (gp2) ボリューム:$0.10/1GB（1か月間）※リージョン：米国東部<br/>仮想マシンに搭載されるストレージサービスです。
 - スナップショット:$0.05/1GB（1か月間）※リージョン：米国東部<br/>Amazon EBSのスナップショットをAmazon S3に保管するサービスです。
- Elastic IP アドレス:$0.005/1時間　※リージョン：米国東部<br/>AWS EC2では仮想マシンを起動するたびにパブリックIPが変わりますが、Elastic IPアドレスを使えばIPを固定しておくことができます。

※特にElastic IPはなかなかエグいです。例えば、1ヶ月間(31日間)まるまる仮想サーバを使ってなかったとするとそれだけで「$3.72×固定したIPアドレスの数」 を請求されることになります。
※スナップショットの乱用にも注意が必要です。スナップショット初回時はEBSをまるまるコピーし、次回以降は増分のみスナップショットを行うという仕様になっているので、スナップショットの容量は仮想マシンに搭載しているEBSよりも容量が膨らみます。スナップショットを利用する仮想マシンを増やしすぎるとコストにのしかかって来る危険性があります。

#安くするための方針・考え方
・AWS EC2を個人で利用する場合、仮想マシンを起動するよりも停止しておく時間が圧倒的に多くなります。よって「仮想マシン停止時のコストをスリム化する」＝「安くする」となります。※かなりヘビーに使いたい場合や仮想マシンを常に動かしたい場合は別ですが。。。

#安くするためのポイント
・以下サービスを使わない、または利用を最小限にする。

- Amazon Elastic Block Store (Amazon EBS)<br/>仮想マシンには最低限の容量を積む。それでも足りない場合はAmazon S3を利用する。

- Elastic IP アドレス<br/>基本的に使わず、サーバの設定や連携には全力でlocalhostまたはAWSから採番されるプライベートIPを利用する方法を考える。

・ちなみにですが、以上の方針のもとAWS EC2を使っている私のとある月の請求は以下のようになっています。インスタンスのレベルは色々ですが、1ヶ月に21.396h利用して$14.24の請求です。（私はAmazon S3を仮想マシンにマウントするのがめんどくさいのでEBSを自重することなく使ってます笑）
21時間くらいしか使ってね～のかよショボっと自分でも思ってしまいましたが、趣味で使う分なのでこの程度かもしれませんね。。。。
![Screenshot 2018-05-02 at 13.37.22.png](https://qiita-image-store.s3.amazonaws.com/0/144326/a4f9a43b-9d7a-1987-2f20-1b359d8bbe3a.png)


#おまけ
・EC2を安く使うためのポイントと言いながら、「パブリックIPアドレスの固定、スナップショットの利用を諦める」というショボい結論しか本ページでは書けておらず、具体的に何の指針も示せておりません。しかし、せっかくここまで読んで頂いた方のために、最近私が最近便利だなーと思った方法を記載しておこうと思います。
## aws-cliとシェルスクリプトでパブリックIPアドレスの自動取得&特定ファイルへの自動化反映

###作成の経緯
とあるサーバをElastic IPの利用なしで使っているとき、仮想マシン起動時に毎回パブリックIPが変わるので、毎回サーバの設定ファイルにパブリックIPを書き込み直すというアホなことをやっていました。あまりにめんどいので、sshで入ったときもしくは、サーバ起動したときにシェルとかで自動的にやらせたくて作りました。
###前提
・aws-cliのインストール方法と初期設定については申し訳無いですが、[公式リファレンス](https://aws.amazon.com/jp/cli/)
を見るかググるかで調べてみてください。手抜きで申し訳無いです:sweat:
###スクリプトの説明
・Linuxサーバにてaws-cli初期設定済みの前提で以下シェルスクリプトを説明します。
スクリプトでやっていることは主に下記の２点です。

- aws-cliを使いインスタンスのidをキーにしてパブリックIPとパブリックDNSを環境変数として登録する。

- 特定のディレクトリにいる設定ファイル"xxxxx.conf"の特定行(以下スクリプトでは16行、18行)をsedコマンドを使って書き換える

・「xxxxxxxxx」やら、「STATIC_ADDRESS=」、「HOSTNAME」テキトーに名前をつけているだけなので、適宜変えて使っていただければと思います。このシェルスクリプトをbashrcに書くなり、スタートアップ(init.dとかsystemdとか)に登録してもらえれば、パブリックIPアドレスが必要なwebサーバ等の初期設定が楽になるのではないでしょうか？

###コード全文
```sh

#!/bin/bash

#get aws instance global IP and DNSNAME
export AWS_PUBLIC_IP=$(aws ec2 describe-instances --instance-ids i-xxxxxxxxx | jq -r '.Reservations [] .Instances [] .PublicIpAddress')
export AWS_PUBLIC_DNSNAME=$(aws ec2 describe-instances --instance-ids i-xxxxxxxxx | jq -r '.Reservations [] .Instances [] .PublicDnsName')


# add to write configutarion of global IP and DNSNAME 
sed -i -e '16d' /xxxxx/xxxxx.conf
sed -i -e "16i STATIC_ADDRESS=\'${AWS_PUBLIC_IP}\'" /xxxxx/xxxxx.conf
sed -i -e '18d' /xxxxx/xxxxx.conf
sed -i -e "18i HOSTNAME=\'${AWS_PUBLIC_DNSNAME}\'" /xxxxx/xxxxx.conf

```

#あとがき
・私自身がAWSについての中途半端な知識しかなく、間違えているところや乱暴な説明等があるかと思います。
・もしもっとこう書いた方がいい等のアイディアがある方はぜひアドバイスいただけると幸いです。
・AWSをこれから使ってみたいと考えている個人の方に少しでも役立てば幸いです。