share facebook facebook facebook twitter twitter menu hatena pocket slack

2021.04.22 THU

AWS ChaliceでEC2とRDSを自動で起動停止するLambdaを作成(祝日対応版)

西田 駿史

WRITTEN BY 西田 駿史

任意のタグが付いたEC2、RDSインスタンスをスケジュールで起動停止するためのLambdaです。Chaliceで作ってあるのでハンドラーを変えればAPIエンドポイントから実行したりもできます。以下実装です。「AutoSta...

こちらの記事の祝日対応版です。

Google Calendar APIを使って起動日が祝日の場合は処理を行わないように。
また、Google Calendar APIだと正月や会社の休日に対応できないので、環境変数に別途例外休日を設定できるようにしています。

記事のコードにimport文と祝日判定のためのロジックを追加。

app.py

import datetime
import urllib.request
import json

app.py

def change_instances_state(event, target='ec2', state='Start', dryrun=True):

    if is_holiday():
        return  # 休日なら処理終了

    if state == 'Stop':  # 停止させる条件

app.py

def is_holiday():
    now = datetime.datetime.now()
    app.log.debug(now)

    # 環境変数で設定した休日と比較
    days = now.strftime('%m/%d')
    env_holidays = os.environ['HOLIDAYS'].split(',')

    if days in env_holidays:
        app.log.info("%s is env holiday." % days)
        return True

    # Google Calendar APIから祝日判定
    url = 'https://www.googleapis.com/calendar/v3/calendars/japanese__ja@holiday.calendar.google.com/events'
    query = {
        'key': os.environ['GOOGLE_CALENDER_API_KEY'],
        'timeMin': now.strftime('%Y-%m-%d') + 'T00:00:00Z',
        'timeMax': now.strftime('%Y-%m-%d') + 'T23:59:59Z'
    }

    try:
        with urllib.request.urlopen('{}?{}'.format(url, urllib.parse.urlencode(query))) as r:
            response = json.loads(r.read())
            app.log.info(response)

            if r.getcode() != 200:
                app.log.error("Google Calendar API response not OK.")
                return True

            if 'items' in response and len(response['items']) > 0:
                summary = response['items'][0]['summary']
                app.log.info("{} is {}.".format(days, summary))
                return True

    except urllib.error.URLError as e:
        app.log.error(e.reason)
        return True

    return False

Google CloudのコンソールからGoogle Calendar APIを有効にしてAPIキーを発行します。

発行したAPIキーでこんな感じの呼び出しで祝日が取れればOK。
https://www.googleapis.com/calendar/v3/calendars/japanese__ja@holiday.calendar.google.com/events?key=[API_KEY]&timeMin=2021-04-29T00:00:00Z&timeMax=2021-04-29T23:59:59Z

発行したAPIキーと例外休日の設定を追加します。

.chalice/config.json

{
  "version": "2.0",
  "app_name": "schedule-startstop",
  "stages": {
    "dev": {
      "lambda_timeout": 20,
      "environment_variables": {
        "DRYRUN": "True",
        "TZ": "Asia/Tokyo",
        "HOLIDAYS": "01/01,01/02,01/03,12/31",
        "GOOGLE_CALENDER_API_KEY": "**********************************"
      }
    }
  }
}

これでデプロイすれば祝日、例外休日判定付きで同じように使うことができます。

元記事はこちら

AWS ChaliceでEC2とRDSを自動で起動停止するLambdaを作成(祝日対応版)

西田 駿史

西田 駿史

2019年4月入社。第四開発事業部グループリーダー。海岸オフィス所属

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。