AWSでコストダウンするために、Jenkinsのジョブで自動停止と起動ができるようにしました。
事前準備
EC2の設定で以下のタグを追加
- Stop
- Start
起動
以下コマンドを朝の8時に起動するように設定します。
aws ec2 start-instances --region=ap-northeast-1 --instance-ids `aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Start Name=value,Values=true --query 'Tags[*].ResourceId' --output text`
※尚、PublicインスタンスでRoute53又はELBを利用している場合はインタンス起動後に以下の処理が必要です。
- Route53:レコードへのPublicIP再設定
- ELB:ELB再設定
過去記事を参考に設定して下さい。
停止
以下のコマンドを19時に起動するように設定します。
aws ec2 stop-instances --region=ap-northeast-1 --instance-ids `aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Stop Name=value,Values=true --query 'Tags[*].ResourceId' --output text`
スポットインスタンスの場合は停止が出来ないので、terminateします。
aws ec2 terminate-instances --region=ap-northeast-1 --instance-ids `aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Stop Name=value,Values=terminate --query 'Tags[*].ResourceId' --output text`
問題
Route53へのAPIコールは通常5call/秒が上限に設定されているため、Publicインスタンスの数が5を超える場合、以下のエラーメッセージが返却されて接続できなくなります。
The request was rejected because Route 53 was still processing a prior request.
そのため、起動時はInstanceIdを取得後、1つずつ実行するように修正しました。
for instanceid in $( aws ec2 describe-tags --region ap-northeast-1 --filters Name=resource-type,Values=instance Name=key,Values=Start Name=value,Values=true --query 'Tags[*].ResourceId' --output text ); do
aws ec2 start-instances --region=ap-northeast-1 --instance-ids ${instanceid}
sleep 5s
done
無事解決しました!
おまけ
AWS Cli でフィルターかけるときに、ResouceTypeなどのキャメルケースの場合はresource-typeの用にスネークタイプに置き換える必要があります。
ただしStartのような単語で頭文字のみ大文字の場合はそのまま!なんでや!