LoginSignup
0
1

More than 3 years have passed since last update.

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

Posted at

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

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": "**********************************"
      }
    }
  }
}

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1