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

set setting reset

インフラ関連の小ネタと備忘録

Reserved Instances が expire される前に通知する

aws awscli bash

そういう機能がある気もしますが、bash で書けたので晒してみます。 cron などで日次で動かすことを想定しています。

この内容だと、30/15/7日前に通知メールを送信するようになっています。

#!/bin/bash

# Reserved Instance expire checker

from_address="_from_mail_address_"
to_address="_to_mail_address_"

notification()
{
    MAILBODY="""
ReservedInstances will expire ${d} days after.
please consider buying.

AZ : ${AZ}
InstanceType : ${INSTANCE_TYPE}
InstanceCount : ${INSTANCE_COUNT}
"""

    echo "${MAILBODY}" | mail -s "ReservedInstances Notification" -r ${from_address} ${to_address}

}

check_ri()
{
    ACTIVE_RIS=$(aws --region ap-northeast-1 ec2 describe-reserved-instances \
        --query 'ReservedInstances[?State==\`Retired\`].[End,AvailabilityZone,InstanceType,InstanceCount,State]' \
        --output text)

    echo "${ACTIVE_RIS}" | while read line
    do
        AZ=$(echo "${line}" | awk {'print $2'})
        INSTANCE_TYPE=`echo "${line}" | awk {'print $3'}`
        INSTANCE_COUNT=`echo "${line}" | awk {'print $4'}`

        TODAY=$(date +'%Y%m%d')
        END_DATE=$(echo "${line}" | awk {'print $1'} | cut -d T -f 1)
        CHECK_DATE_1=`date -d "${END_DATE} - 30 days" +'%Y%m%d'`
        CHECK_DATE_2=`date -d "${END_DATE} - 15 days" +'%Y%m%d'`
        CHECK_DATE_3=`date -d "${END_DATE} - 7 days" +'%Y%m%d'`

        if [ ${TODAY} -eq ${CHECK_DATE_1} ]; then
            d="30"
            notification
        elif [ ${TODAY} -eq ${CHECK_DATE_2} ]; then
            d="15"
            notification
        elif [ ${TODAY} -eq ${CHECK_DATE_3} ]; then
            d="7"
            notification
        fi
    done
}

check_ri && exit 0