LoginSignup
1
3

More than 3 years have passed since last update.

時間のかかるプログラムをDockerイメージにまとめ、GCEにデプロイ・実行し、結果をSlackに通知する

Posted at

機械学習の学習プロセスや、ビットコインのマイニングなど、処理に時間のかかるプログラムがあります。
そのようなプログラムをローカルのPCで実行してもよいのですが、今回はクラウドの計算資源であるGoogle Compute Engine(GCE)を利用して実行します。

1からGCEの環境設定をするのではなく、所望のプログラムを実行するDockerイメージを作成し、それをGCEにデプロイしプログラムが実行され、処理した結果がSlackに通知される、そのようなシステムを作ります。

流れは以下のようになります。

  1. 実行結果をSlackに通知するプログラムを作成する
  2. プログラムを実行するDockerイメージを作成する
  3. 作成したDockerイメージをGoogle Container Registryにpushする
  4. DockerイメージをデプロイしたGCEインスタンスを作成する
  5. (実行結果がSlackに通知される)

実行結果をSlackに通知するプログラムを作成する

任意の桁の整数をランダムに生成し、それが素数であればslackに通知するプログラム prime.py を作成します。

slackの通知にはslackclientというライブラリを使います。
SLACK_API_TOKENSlack APIからアプリを作成し、設定することで得られます。

prime.py
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 にその旨を記述します。

requirements.txt
slackclient

Dockerfileには、 requirements.txt を使ってライブラリをインストールすること、 prime.py を実行することを記述します。
ベースイメージには、Python 3のイメージを使っています。

Dockerfile
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です。

registry.png

DockerイメージをデプロイしたGCEインスタンスを作成する

GCEのコンソールよりインスタンスを作成します。

レジストリにDockerイメージをpushするときタグを設定しなかったので、コンテナイメージは gcr.io/[PROJECT-ID]/prime:latest となります。
一度プログラムを実行したらそのまま終了してもらって構わないので、再起動ポリシーは 常にオフ にします。

操作画面は以下のようになると思います。

gce.png

インスタンスを作成すれば、pushしたDockerイメージがデプロイされ、素数を生成するプログラムが実行され、実行結果がSlackに通知されます。

まとめ

時間のかかるプログラムを実行するDockerイメージを作成し、それをGCEにデプロイ・実行し、結果をSlackの通知で受け取る、というシステムを作りました。

これくらいの規模であれば旨味はないかもしれませんが、インスタンスを何台も立ち上げて、並列で計算する必要がある場合などは、一つひとつGCEの環境設定するよりも効率的に結果を得られるかもしれません。

1
3
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
1
3