開発用EC2サーバの費用をなるべく安くする為の運用

こんばんは! 最近はホビーでAWSのEC2サーバをいくつか稼働させているんですが、そのうち開発用につかっているサーバの運用について今回は紹介しようと思います。
動作環境
# ホストマシン環境
OS: Windows 10 Home
version: 21H1
# 仮想マシン環境(AWS EC2)
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
$ uname -a
Linux ip-*************.ap-northeast-1.compute.internal 4.14.241-184.433.amzn2.x86_64 #1 SMP Wed Aug 4 14:35:15 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
運用状況
基本的にホビーで開発をする際は、VSCodeの拡張機能のRemote - SSHを使って、EC2に接続をしてAmazon Linux2上で開発をしてます。
ただ、EC2は従量課金ですので24時間稼働させるとそれなりに月額料金がかさんでくるので、必要な時に手動で起動させて、使い終わったら停止させるという運用をしています。
開発時にやっていること
EC2が必要な時に動作させる
以下のシェルスクリプトを作成して、開発の時だけ実行するようにしています。AWS CLIがインストールされており各種認証用の設定がされていることが前提となります。
*****************はEC2インスタンスID
start-ec2.sh
#!/bin/sh
# EC2インスタンスを開始
aws ec2 start-instances --instance-ids ***************** && \
# EC2インスタンスが開始するまでウェイトする
aws ec2 wait instance-running --instance-ids *****************
開発が終わったら停止させる
VSCodeでの開発が終わったら開始する時と同様に下記のシェルスクリプトを実行して、手動で止めるようにしてます。
*****************はEC2インスタンスID
stop-ec2.sh
#!/bin/sh
# EC2インスタンスを停止
aws ec2 stop-instances --instance-ids ***************** && \
# EC2インスタンスを停止完了までウェイトする
aws ec2 wait instance-stopped --instance-ids *****************
停止忘れをした時の為にEvent Bridgeから自動停止させる
手動で止めるのを忘れることもありそうだなーと思ったので、さらにAmazon Event Bridge(旧Cloud Watch Events)にルールを作成して、特定時刻になったら自動的にEC2を停止させる処理を走らせるようにもしてみました。
EventBridgeでCron式に0 16 * * ? *を指定し、EC2を停止させるLambda関数を毎日1:00(JST)に実行するようにしています。
EventBridgeのCron式はGMTで記述する必要があるので注意です。
*****************はEC2インスタンスID
Lambda関数: StopEC2
import boto3
region = 'ap-northeast-1'
instances = ['*****************']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stopped your instances: ' + str(instances))
これでうっかりEC2を止め忘れた場合も安心ですね。 ただし夜更かしした時は要注意です😂
あとがき
最近Windows10でDockerが動かなかったりといったトラブルがあったので、Linux上で開発ができるようになったことは素直に嬉しいです。
EC2のスナップショットを定期的にとるように設定しておけばバックアップもとれるのも良いですね!