GCE 자동 시작 및 자동 중지 스케줄링

이번에 하고 싶은 일



GCE 인스턴스의 자동 시작 및 자동 중지를 스케줄링하고 싶습니다.
예를 들면 낮 동안 밖에 사용하지 않기 때문에 밤등은 정지해 두고 아침이 되면 기동시키는 것으로 코스트 절약하고 싶은 등등. . .
AWS에서 말하기 Lambda의 Schedule 이벤트에서 EC2를 자동 시작 및 자동 중지해 보았습니다. #reinvent

GCP에는 AWS Lambda와 같은 Google Cloud Functions이 있지만
아직 막 나오면 Lamda와 같은 스케줄링 기능은 없습니다.
※2016/04/25 현재

GCP에서는 현재 스케줄링 등은 Google App Engine의 cron 서비스를 사용하는 것 같다.
h tps : // c ぉ d. 오, ぇ. 코 m / 아펜 기네 / 도 cs / py 텐 / 곤후 g / c 롱 # Py 텐 _ 아 p_ 나 ml_ 테 _ s ぇ ぇ _ ぇ r 마 t

검증 환경


  • 이번에는 GAE는 파이썬 Django를 사용합니다.
  • gce를 기동, 재기동하기 위해서는 compute api를 사용하므로 인증 주위등 여기을 참고로 합니다. 여기에서 취득한 것을 credentials.json로 한다

  • 인스턴스 목록 가져오기



    우선은 인스턴스 리스트를 취득해 인증이 올바르게 통과하고 있는지 등을 확인한다
    #!/usr/bin/python
    import os
    from oauth2client.client import GoogleCredentials
    from googleapiclient.discovery import build
    
    root_path = os.path.dirname(os.path.realpath(__file__))
    
    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '【credentials.jsonへのpath】'
    credentials = GoogleCredentials.get_application_default()
    
    compute = build('compute', 'v1', credentials=credentials)
    project = '【プロジェクト名】'
    zone = '【gceのインスタンスがあるゾーン】'
    result_exec = compute.instances().list(project=project, zone=zone).execute()
    items = result_exec['items']
    
    for item in items:
      print '''
      id is %s
      name is %s
      zone is %s
      status is %s
      ''' %(item['id'], item['name'], item['zone'], item['status'])
    

    cron 설정, 실행 스크립트 등



    cron.yaml



    GAE 스케줄은 URL을 지정하고 스크립트를 실행합니다.
    이 파일에서는 언제 어느 URL에 액세스 하는지를 지정한다.
    schedule의 format에 대해서는 여기 를 본다
    URL은 선택 사항일 수 있습니다.
    이번에는/instance/start와/instance/stop을 작성했다고 합시다.
    cron:
    - description: instance start
      url: /instance/start
      schedule: every day 09:00
      timezone: Asia/Tokyo
    - description: instance stop
      url: /instance/stop
      schedule: every day 22:00
      timezone: Asia/Tokyo
    

    app.yaml



    위에서 설정한 url이 액세스했을 때 실행하는 script를 정의한다.login: admin
     -----
    
    handlers:
    - url: /instance/start
      script: instance.app
      login: admin
    - url: /instance/stop
      script: instance.app
      login: admin
    

    인스 탄세. py



    시작하거나 중지하는 스크립트가 있는 스크립트
    
    #!/usr/bin/python
    import os
    import sys
    import webapp2 as webapp
    from google.appengine.ext import vendor
    vendor.add('lib')
    from oauth2client.client import GoogleCredentials
    from googleapiclient.discovery import build
    
    root_path = os.path.dirname(os.path.realpath(__file__))
    os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '【credentials.jsonへのpath】'
    
    project = '【プロジェクト名】'
    zone = '【gceのインスタンスがあるゾーン】'
    instance_names = [インスタンス名の配列]
    
    credentials = GoogleCredentials.get_application_default()
    compute = build('compute', 'v1', credentials=credentials)
    
    # 開始用のHandler class
    class InstanceStartHandler(webapp.RequestHandler):
      def get(self):
        print 'instance start process start'
    
        for instance_name in instance_names:
          # project, zone, instance名からインスタンスの情報を取得
          instance = compute.instances().get(project=project, zone=zone, instance=instance_name).execute()
          print '%s is %s' %(instance['name'], instance['status'])
          # インスタンスが停止している場合は開始処理を行う
          if instance['status'] == 'TERMINATED':
            print 'instance %s start......' %(instance['name'])
            compute.instances().start(project=project, zone=zone, instance=instance['name']).execute()
    
        print 'instance start process end'
    
    # 停止用のHandler class
    class InstanceStopHandler(webapp.RequestHandler):
      def get(self):
        print 'instance stop process start'
    
        for instance_name in instance_names:
          # project, zone, instance名からインスタンスの情報を取得
          instance = compute.instances().get(project=project, zone=zone, instance=instance_name).execute()
          print '%s is %s' %(instance['name'], instance['status'])
          # インスタンスが動いている場合は止める処理を行う
          if instance['status'] == 'RUNNING':
            print 'instance %s stop......' %(instance['name'])
            compute.instances().stop(project=project, zone=zone, instance=instance['name']).execute()
    
        print 'instance stop process end'
    
    # app.yamlで設定したURLと実行するclassのセットを配列で定義する
    app = webapp.WSGIApplication(
      [
        ('/instance/start', InstanceStartHandler),
        ('/instance/stop', InstanceStopHandler)
      ],
      debug=True
    )
    

    폴더 구성



    이번에는 3 개의 파일을 만났지만 폴더 구성은 다음과 같습니다.
    ※ GAE는 Django를 사용하고 있다고 가정합니다

    이번에 작성·편집한 파일은 root_dir에 둔다
    root_dir
    ├─ polls
    |   └─ ....
    ├─ lib
    |   └─ ....
    ├─ mysite
    |   └─ ....
    └─ instance.py
    └─ cron.yaml
    └─ app.yaml
    

    작업 업로드 및 확인


  • GAE 코드를 배포하려면 appcfg.py -A stellar-mercury-734 update app.yaml
  • cron 정보를 업데이트하려면 appcfg.py -A stellar-mercury-734 update_cron .

  • 여기까지 오면 GAE의 태스크 큐의 cron 작업에서 아래와 같이 설정한 것을 확인할 수 있다.


    후에는 화면상에서 「지금 실행」하게 되어 시간이 될 때까지 속눈썹으로 지정한 인스턴스가 자동 기동, 자동 정지할 것

    Tips



    3rd party제의 툴을 사용할 때에는 아래와 같이 커멘드를 받아 Django의 lib내에 인스톨 한다
    공식 문서
    pip install -t lib oauth2client 
    

    좋은 웹페이지 즐겨찾기