読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

EC2の自動停止アラームスクリプト

AWS

こんにちは、サーバー担当の山内です。
今回はPython版のAWS CLIを介して、CPU使用率の低いEC2を自動的に停止させるアラームを作ります。

AWS CLI

いつの間にかリリースされ、日々進化を遂げているAWS CLI
Amazon Linuxには最初からAWS CLIが含まれているので、インストールの必要はありません。

自動停止対象

今回は、Amazon Linuxのオンデマンドインスタンスを対象にします。

初期設定

対象インスタンスSSHログインして、AWS CLIの初期設定をします。

$ sudo su  
# aws configure  
AWS Access Key ID [None]: AKIAWONDERPLANET  
AWS Secret Access Key [None]: wonderPLANET/K7MDENG/bPxRfiCY  
Default region name [None]: ap-northeast-1  
Default output format [None]: json

設定ファイルは.awsディレクトリ内に置かれます。
~/.aws/config

configには複数のプロファイルを設定することもできます。
たとえば、新たにusというプロファイルを追加する場合は下のようにします。

[default]  
output = json  
region = ap-northeast-1  
aws_access_key_id = AKIAWONDERPLANET  
aws_secret_access_key = wonderPLANET/K7MDENG/bPxRfiCY  
  
[profile us]  
output = json  
region = us-west-1  
aws_access_key_id = AKIBWONDERPLANET  
aws_secret_access_key = WONDERplanet/2Zp9Utk/h3yCo8nvb  

--profileオプションを使って任意のプロファイルを指定することができます。

# aws ec2 describe-instances --profile us

このようにして実行すれば、usプロファイルのEC2一覧を取得することができます。
結果はjsonで返りますが、--output table--output textと指定して結果のフォーマットを変更することもできます。

アラームの作成

CloudWatchのアラームを作成します。
下の例は、インスタンスIDの取得からアラームの作成までの一連の流れを処理するスクリプトです。

# vim ec2-auto-stop.sh

#!/bin/bash  
  
# インスタンスIDの取得  
EC2_INSTANCE_ID=`wget --quiet --output-document - http://169.254.169.254/latest/meta-data/instance-id`  
  
# 停止条件: 300秒間CPU使用率が10%以下のとき  
PERIOD='300'  
THRESHOLD='10'  
EVAL_PERIODS='1'  
  
PUT_METRIC_ALARM="aws cloudwatch put-metric-alarm --alarm-name $EC2_INSTANCE_ID-AutoStop --namespace \"AWS/EC2\" --dimensions Name=InstanceId,Value=$EC2_INSTANCE_ID --statistic Average --metric-name CPUUtilization --comparison-operator LessThanThreshold --threshold $THRESHOLD --period $PERIOD --evaluation-periods $EVAL_PERIODS --alarm-actions \"arn:aws:automate:ap-northeast-1:ec2:stop\"";  
  
# 実行  
eval $PUT_METRIC_ALARM  
  
exit 0  

スクリプトを実行します。

# bash ec2-auto-stop.sh

スクリプトを実行すると次のようなコマンドを実行することになり、CloudWatchにアラームが1つ新規作成されます。

aws cloudwatch put-metric-alarm --alarm-name i-abcdefgh-AutoStop \  
--namespace "AWS/EC2" \  
--dimensions Name=InstanceId,Value=i-abcdefgh \  
--statistic Average \  
--metric-name CPUUtilization \  
--comparison-operator LessThanThreshold \  
--threshold 10 \  
--period 300 \  
--evaluation-periods 1 \  
--alarm-actions "arn:aws:automate:ap-northeast-1:ec2:stop"

これでアラームが鳴ればEC2が停止するようになります。
スポットインスタンスではうまくいかないようなので注意が必要です。