AWSは便利だが、何も考えずに使い続けると結構な料金になることがある。
料金の節約について、実際開発や運用をしていて模索したことなどをまとめる。
詳しい人は既にやっていると思うので、意識してなかった人向け。
まずは現状分析
月額料金詳細をチェックする
rootなどでログインして1月いくらかかっているのか、どのコンポーネントに費用が特にかかっているかを分析する
開発内容によるが、大体はEC2とRDSに掛かっていると思われる
AWS費用のチェック方法
rootアカウントにログイン
↓
アカウントメニュー選択
↓
請求書で今月の詳細を確認
AWS料金節約方法
ここではEC2とRDSに料金がかかっている前提で検討する
STEP1:不要なコンポーネントを削除
当たり前ことであるが、以外と不要なものがあるのでチェックする
・不要なEC2/RDSなどなどコンポーネント削除
→立ち上げっぱなしで忘れているものなどを削除する。よくある。。。
・不要なAMI(EBS)/RDSスナップショットを削除
→AMIはバックアップ後放置しがち
→RDSスナップショットは、RDSのバックアップ期間を小さくする
特に壊れた時以外のロールバック以外必要なければ1日で十分
・他リージョンの不要なコンポーネント削除
→新しいコンポーネントを試したの作り忘れ
STEP2:起動しているコンポーネントを安くする
・EC2を使わない時間(夜間など)に停止させる
以下AWSCLIが実行可能なサーバにスクリプトを配置
#!/bin/bash
AWS_CONFIG_FILE=[ユーザ名]/.aws/credentials
for i in `cat /root/script/instances.txt`
do
aws ec2 start-instances --instance-ids $i
done
#!/bin/bash
AWS_CONFIG_FILE=[ユーザ名]/.aws/credentials
for i in `cat /root/script/instances.txt`
do
aws ec2 stop-instances --instance-ids $i
done
起動・停止したいEC2インスタンスIDを記載
i-xxxxxxxxxx
i-xxxxxxxxxx
crontabで時間設定
00 08 * * 1-5 root /root/script/start_instances.sh > /dev/null 2>&1
00 00 * * * root /root/script/stop_instances.sh > /dev/null 2>&1
・DBの期間停止
→PostgreSQLなどのRDSの一部はインスタンスの停止ができるようになった
EC2停止同様に、RDSも時間停止させる
cronでdbごとに設定するのが一番早い
00 08 * * 1-5 root aws rds start-db-instance --db-instance-identifier [DB識別子] > /dev/null 2>&1
00 00 * * * root aws rds stop-db-instance --db-instance-identifier [DB識別子] > /dev/null 2>&1
・リザーブインスタンス導入
→EC2/RDSはリザーブドインスタンスとして1年または3年契約ができる
開発後の維持管理などは年間契約が多いため、1年契約をやりやすい
参照:
https://dev.classmethod.jp/cloud/aws/how-to-buy-reserved-instances/
・スポットインスタンス導入 (EC2コンソールのスポットリクエストがやりやすい)
→維持管理など、EC2内の構成がほぼ変わらない段階であれば、スポットインスタンスを適用することを考えられる
スポットインスタンスはAMIを前提
参照:
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-requests.html
https://recipe.kc-cloud.jp/archives/321
まとめ
いきなり全てを導入しなくても、以下の順で検討していけばいい
①不要なものを削除する
②使ってない時間を停止するようにする
③リザーブドインスタンス/スポットインスタンスの導入
下にいくほど構成や契約に縛りが出てくるため、開発状況を見てのバランスが大事
①②を開発時
③を衰退期や維持管理で実施するのがよい
費用削減について、感覚的には②で3割減 ③で7割減 ①はうっかり残していたもの次第。。。
もちろんWebサーバなどをたくさん用意する必要がある運用構成や顧客がOKというならいきなり③のほうがよい