こんにちは、サーバー担当の山内です。
今回は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が停止するようになります。
スポットインスタンスではうまくいかないようなので注意が必要です。