GCE(google compute engine)インスタンスの自動停止・スケジュール

GCE(google compute engine)で、利用しない時間にインスタンスを停止したい。
そのために、GAE(google app engine)で、起動・停止用アプリケーションを設置し、それらのアプリケーションをGAEのcronで定期実行する。

目次
☆GAEとは
☆必要ファイル
 -crom.yaml
-app.yaml
-実行スクリプト(instance.py)
-libs
☆アプリケーションのデプロイ

―――――――――

☆GAEとは
App Engineはインフラ部分を管理せずにWEBアプリを実装できる仕組み
過去記事を参照
http://tug-uca.hatenablog.com/entry/2018/06/12/182533


☆必要ファイル
cloud shell上で必要ファイルを以下のように配置する。

任意のフォルダ
├─ lib
|   └─ ....
└─ cron.yaml
└─ app.yaml
└─ 実行スクリプト(instance.py)

本記事の大部分は以下の記事を参考にしている。
https://qiita.com/hatappi/items/a756ea8fd29d7d802e13


-crom.yaml
起動時間、停止時間を変えたいときは、このファイルを変更する。
フォーマット:https://cloud.google.com/appengine/docs/standard/python/config/cron#Python_app_yaml_The_schedule_format

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

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /instance/start
  script: instance.app
  login: admin
- url: /instance/stop
  script: instance.app
  login: admin

-実行スクリプト(instance.py)

扱うインスタンスを追加・変更するときは[インスタンス名のリスト]を変更する。

#!/usr/bin/python
# -*- coding: utf-8 -

import sys
sys.path.insert(0, 'libs')
import webapp2
from oauth2client.client import GoogleCredentials
from googleapiclient.discovery import build

project = 'プロジェクトID'
zone = 'インスタンスのあるゾーン'
instance_names = [インスタンス名のリスト]

credentials = GoogleCredentials.get_application_default()
compute = build('compute', 'v1', credentials=credentials)

# 開始用のHandler class
class InstanceStartHandler(webapp2.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(webapp2.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 = webapp2.WSGIApplication(
        [
            ('/instance/start', InstanceStartHandler),
            ('/instance/stop', InstanceStopHandler)
        ],
        debug=True
        )


-libs
標準のライブラリ以外はディレクトリlibsに入れておく必要がある。
https://qiita.com/cocodrips/items/3bc82b1136a2bd7a7997

pip install -t libs google-api-python-client
pip install -t libs oauth2client


☆アプリケーションのデプロイ

cloud shell上で以下のコマンドを実行する
アプリケーションのデプロイ

gcloud app deploy app.yaml

cronのデプロイ

gcloud app deploy cron.yaml

成功していれば、タスクキューのcronジョブが設定される。
f:id:Tug-uca:20180615154543p:plain

Google App Engine事始め

App Engine 入門 (Python)

基本的には、上記の公式チュートリアルをやってみると分かるが補足的な覚書を以下に記す。

  • App Engineはインフラ部分を管理せずにWEBアプリを実装できる仕組み
  • アプリケーションは(おそらく)ひとつのプロジェクトに対して1つ
  • 操作は、基本的にコンソール中、右上部にあるGoogle Cloud Shellで行う
  • 一度、Google Cloud Shell上で環境構築、動作を確認し、プロジェクトにデプロイする
  • 複数回デプロイしていくと、過去のバージョンも自動的に管理される

将棋AI進化の変遷(盤面評価の方法について)

盤面評価とはある盤面が自分にとってどれだけ有利な状態であるかを判断することである。
AIが行うには、盤面が入力、評価値が出力となる、評価関数をAIが持つ必要がある。
将棋AIに盤面の評価関数の変遷について下図のようにまとめられる。
徐々に人の手を介さず、AI自身で評価関数を獲得していっていると言える。

f:id:Tug-uca:20171226114100p:plain

今後、様々な対象に対してAIが実装されていくと予想されるが、初めから完全なものができるとは考えづらい。
AI進化の一例として参考になるかもしれない。


※似たような考え方で自動運転のレベル(http://standards.sae.org/j3016_201609/)があるがこちらはまだ最後まで到達していない。

参考:
www.bizcompass.jp

サンプルサイズの決め方

間違いも含まれている可能性はあるが、現状の理解をまとめる。

「サンプルサイズ」は、「有意水準」と「検出力」と「効果量」の値が決まれば、決まる。
この4つの因子は、いずれが3つの値が決まると、残りの1つの因子の値が決まる関係にある。

有意水準」と「検出力」と「効果量」それぞれについての説明

有意水準
本当は帰無仮説が正しいのに、誤って棄却してしまう確率。
図中の"False Negative"
0.01や0.05を使うことが多い。

「検出力」
帰無仮説が正しくないときに、正しくを棄却する確率。
図中の"True Negative"
0.8を使うことが多い。

f:id:Tug-uca:20170712151307p:plain
http://mojix.org/2008/11/24/false_positive_false_negativeより

「効果量」
効果量は「検出したい差の程度」や「変数間の関係の強さ」のことで、その実験の効果を見るための指標。
P値はその値より極端な値をとる確率を示したものに過ぎないため、その実験において実際にどの程度の効果があったかを知ることはできない。
例えば同じ平均値の2群を比較した場合にはサンプルサイズが大きい方がP値は小さくなる。

概念は、上記でよいのだが、具体的な問題を考えたとき、それぞれの値をどう導出するのかがまだ理解できていない。


以下、参考サイト

※具体的な問題には下サイトが参考になりそう。しかし、4つの因子との関係が明らかではない。
標本の大きさの決定

※主に参考にしたサイト
https://bellcurve.jp/statistics/course/9313.html

※Rのコードが載っているので実践的
https://www.slideshare.net/takashijozaki1/tokyo-r140222-tjo

※本来参考にすべき本
http://amzn.to/2uchyji

Google Cloudで追加ディスクのマウントを行う

以下の2ステップに分かれる。

1.google cloud上でディスクの追加を行う。
2.OS上で追加ディスクのマウントの設定を行う。


1.google cloud上でディスクの追加を行う。
 ここではgoogle cloudのコンソール上での操作を行う。
 
 対象のインスタンス→編集→追加ディスク→項目を追加
f:id:Tug-uca:20170622150118p:plain
 

 ディスクの作成を行いソースの種類をなしにして、作成する。
f:id:Tug-uca:20170622150151p:plain

 これでディスクの追加は完了


2.OS上で追加ディスクのマウントの設定を行う。
 ここからはGoogle CloudというよりOSの問題
 OSは今回centos7を利用
 ※windowsであれば、[ スタート] - [ 管理ツール ] – [サーバーマネージャー] で追加する
10.5. ディスクをマウントする(Windows OSの場合) — Cloudn Compute VPCタイプ OpenNW 操作マニュアル v2.20.9

 


2-1.マウントの準備

 ディスクをフォーマットする

sudo mkfs.ext4 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/google-disk

f:id:Tug-uca:20170622150052p:plain

 マウントポイントの作成

sudo mkdir -p /mnt/disks/extend

 マウントしてみる

sudo mount -o defaults /dev/disk/by-id/google-disk /mnt/disks/extend

 マウントされているディスクを表示し、一覧に含まれていれば正しくできている

df -h

2-2.起動時にマウントする設定

sudo vi /etc/fstab

 でファイルを開き、下の行を末尾に追記する

/dev/disk/by-id/google-disk     /mnt/disks/extend       ext4    defaults        0 2

 各項目の意味はこちらを参照
www.infraeye.com







参考:
http://www.apps-gcp.com/gce-disk-expansion/
Linux ハードディスクをマウント(mount)する

Google CloudにSCP・SSH・SFTPでアクセス

環境はWindows
SCP・SSH・SFTPいずれにおいても必要なのは以下の4つ、

  • ユーザID
  • アクセス先IP
  • パスワード
  • 秘密鍵

接続自体はクライアントソフトの違いくらいで問題なのは公開鍵・秘密鍵の生成と、Google Cloudへ公開鍵の登録
操作は公式で用意しているので省略。
https://cloud.google.com/compute/docs/instances/connecting-to-instance?hl=ja
PuTTYで鍵を生成する場合、必要な4つのうちアクセス先以外はこの時に決定される。


実際のアクセス方法についてもWinSCPでの例が公式で記載されている。
https://cloud.google.com/compute/docs/instances/transfer-files?hl=ja

jupyter, AnacondaをGoogle Cloud Platfrom上で動かす

jupyterをGoogle Cloud Platfrom上で動かして、ローカルのブラウザからアクセスしたい。
以下その手順

1.Google Cloud Platfromでインスタンス作成
f:id:Tug-uca:20170524163101p:plain
環境構築時は小さい構成でよい。
今回はcentOSを利用している。
できたらSSHでアクセスする。


2.Anacondaインストー
2-1. wget,bzip2のインストー

su yum install wget
su yum install bzip2

2-2. Anacondaのダウンロードとインストー
(最新のバージョンはhttps://www.continuum.io/downloadsで確認)

mkdir downloads
cd downloads
wget https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh
bash Anaconda3-4.3.1-Linux-x86_64.sh

途中出てくる質問はすべてyesにする。

3.jupyterの設定
3-1. コンフィギュレーションファイルを作成

cd
jupyter notebook --generate-config
cd .jupyter

3-2. SSL用の鍵を作成

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem


3-3. パスワードからハッシュ値の生成
pythonで以下を実行、得られたハッシュ値は控えておく。

from notebook.auth import passwd; passwd()

3-4. コンフィギュレーションファイルを編集

# OpenSSLで作ったファイルへのパス
c.NotebookApp.certfile = u'/home/username/.jupyter/mycert.pem'
c.NotebookApp.keyfile  = u'/home/username/.jupyter/mykey.key'
# どのIPアドレスからのアクセスも受け入れる
c.NotebookApp.ip = '*'
# passwd()コマンドで作ったパスワードのハッシュを貼る
c.NotebookApp.password = u'sha1:bcd259ccf...'
# 勝手にブラウザを起動しない
c.NotebookApp.open_browser = False
# 外部からアクセスするためのポート番号を指定する
c.NotebookApp.port = 8888

3-5. 作業フォルダの作成とjupyterの起動

cd 
mkdir jupyter_workdir
cd jupyter_workdir
jupyter notebook


4.vmのネットワーク設定
VMインスタンスの編集を開く。

f:id:Tug-uca:20170524174851p:plain
4-1. ファイアウォールHTTPS トラフィックを許可するにチェックを入れる
4-2. 外部IPで新しい静的IPを追加する(IP追加にコスト発生の場合あり)
4-3. ネットワークのdefaultをクリックし、ファイアウォール ルールを追加
 名前:任意
 ソースタグ: 0.0.0.0/0 どのようなホストからでも接続を許す
 許可対象のプロトコルまたはポート : tcp:8888
f:id:Tug-uca:20170524171854p:plain

変更出来たら設定を保存する


確認
https://「外部IP」:8888/ にアクセスし、先ほど作成したパスワードを入力する。
f:id:Tug-uca:20170524172855p:plain
実行できた。
f:id:Tug-uca:20170524173018p:plain


参考
Set up Anaconda + IPython + Tensorflow + Julia on a Google Compute Engine VM – Harold Soh
Google Cloud Platform で Jupyter のサービスを動かす » DSP空挺団