機械学習の学習プロセスや、ビットコインのマイニングなど、処理に時間のかかるプログラムがあります。
そのようなプログラムをローカルのPCで実行してもよいのですが、今回はクラウドの計算資源であるGoogle Compute Engine(GCE)を利用して実行します。
1からGCEの環境設定をするのではなく、所望のプログラムを実行するDockerイメージを作成し、それをGCEにデプロイしプログラムが実行され、処理した結果がSlackに通知される、そのようなシステムを作ります。
流れは以下のようになります。
- 実行結果をSlackに通知するプログラムを作成する
- プログラムを実行するDockerイメージを作成する
- 作成したDockerイメージをGoogle Container Registryにpushする
- DockerイメージをデプロイしたGCEインスタンスを作成する
- (実行結果がSlackに通知される)
実行結果をSlackに通知するプログラムを作成する
任意の桁の整数をランダムに生成し、それが素数であればslackに通知するプログラム prime.py
を作成します。
slackの通知にはslackclientというライブラリを使います。
SLACK_API_TOKEN
はSlack APIからアプリを作成し、設定することで得られます。
import random
import slack
def is_prime(num):
for i in range(2, num):
if (num % i) == 0:
return False
return True
def post(message):
client = slack.WebClient(token='SLACK_API_TOKEN')
client.chat_postMessage(channel='#random', text=message)
if __name__ == '__main__':
digit = 7 # 桁数
while True:
num = random.randrange(10 ** digit, 10 ** (digit + 1))
if is_prime(num):
post(num)
break
python prime.py
を実行するとSlackに素数が通知されると思います。
プログラムを実行するDockerイメージを作成する
prime.py
を実行するDockerイメージを作成します。
slackclient
を使っているので、 requirements.txt
にその旨を記述します。
slackclient
Dockerfileには、 requirements.txt
を使ってライブラリをインストールすること、 prime.py
を実行することを記述します。
ベースイメージには、Python 3のイメージを使っています。
FROM python:3
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD python prime.py
ディレクトリ構成は以下のようになります。
.
├── Dockerfile
├── prime.py
└── requirements.txt
prime
というタグでDockerイメージを作ります。
docker build -t prime .
docker run prime
を実行するとSlackに通知が飛ぶと思います。
作成したDockerイメージをGoogle Container Registryにpushする
GCPでプロジェクト作成や、Cloud SDKをインストールしていない場合は行います(参考)。
Dockerイメージにレジストリ名をタグ付けします。PROJECT-IDには作成したGCPのプロジェクトIDが入ります。
docker tag prime gcr.io/[PROJECT-ID]/prime
タグ付けができたらDockerイメージをGoogle Container Registryにpushします。
docker push gcr.io/[PROJECT-ID]/prime
Google Container Registryのコンソールにアクセスして、リポジトリにイメージがあればOKです。
DockerイメージをデプロイしたGCEインスタンスを作成する
GCEのコンソールよりインスタンスを作成します。
レジストリにDockerイメージをpushするときタグを設定しなかったので、コンテナイメージは gcr.io/[PROJECT-ID]/prime:latest
となります。
一度プログラムを実行したらそのまま終了してもらって構わないので、再起動ポリシーは 常にオフ
にします。
操作画面は以下のようになると思います。
インスタンスを作成すれば、pushしたDockerイメージがデプロイされ、素数を生成するプログラムが実行され、実行結果がSlackに通知されます。
まとめ
時間のかかるプログラムを実行するDockerイメージを作成し、それをGCEにデプロイ・実行し、結果をSlackの通知で受け取る、というシステムを作りました。
これくらいの規模であれば旨味はないかもしれませんが、インスタンスを何台も立ち上げて、並列で計算する必要がある場合などは、一つひとつGCEの環境設定するよりも効率的に結果を得られるかもしれません。