メインコンテンツまでスキップ

自前のモデルや関数を追加する

  • exaBase Studioで利用するコンテナレポジトリにイメージをプッシュし、Functionとして利用するチュートリアルです。
  • HelloWorldのチュートリアルで利用したCanvasのFunctionにプッシュしたイメージを追加して実行します。
ARMのCPUを使っているPCでビルドする場合
  • M1 MacなどのARMのCPUを使っている場合は docker buildの時に--platform linux/amd64 を付けてください。
  • 何もオプションを付けないでビルドするとARM用のDockerイメージが生成されますが、Studioの実行環境はIntel/AMD64の環境のため環境差異により動作しません。

準備する

1. ツールとサンプルの取得

ツールのインストール

  • コンテナのビルドとプッシュを行うためにDockerDesktopRancherDesktopを利用します。
  • ECRへイメージをプッシュするためにAWS CLIをインストールします
  • Pythonコードをローカルで実行するためにPythonの安定版をインストールします

サンプル

2. ECRアクセスに必要な情報の確認

Functionの処理は指定したAWS ECRのDockerイメージがexaBase Studio上のランタイムで実行されます。Functionで利用するDockerイメージをすべて登録してください。

ECRURI(貴社のご担当者にご確認ください)
レポジトリ名(貴社のご担当者にご確認ください)
AWS_ACCESS_KEY_ID(貴社のご担当者にご確認ください)
AWS_SECRET_ACCESS_KEY(貴社のご担当者にご確認ください)

3. アプリケーションの開発

このチュートリアルではe1とe2の値を掛け算してe3に出力するというイメージをコンテナ化、ECRへプッシュして実行します。

Functionノードで使用可能なコンテナの要件

Functionとして実行するコンテナでは下記が必要となります。

  • Dockerを使用する
  • DockerfileにCMD/ENTRYPOINTで実行コマンドを設定する
  • Functionノード上のinputoutputパスに対応するようにデータの入出力処理を実装する

ディレクトリ構成を設定する

Functionではデータの入出力をファイル形式で行います。コンテナの要件に沿うようにファイルの受け渡しが正しくできるような実装とフォルダ構成を行います。

フォルダ構成例

{project_root}
 ├ app
 │ ├ data
 │ └ app.py
 ├ requirements.txt
 └ Dockerfile

ソースコードをスクリプトで実行できるように修正する

コマンドラインからapp.pyをスクリプトで実行できるように修正してください。 サンプルコードをフォローして進む場合は e1+e2となっている処理を掛け算に変えてみてください。

サンプルコード app.py
import logging
import os

def main():
input_path1 = './data/entity--e1.txt'
input_path2 = './data/entity--e2.txt'
output_path = './data/entity--e3.txt'

with open(input_path1 , 'r') as f:
e1FileByteData = f.read().strip()
# end with

with open(input_path2 , 'r') as f:
e2FileByteData = f.read().strip()
# end with

e1Int = int(e1FileByteData)

e2Int = int(e2FileByteData)

e3Int = e1Int + e2Int

e3String = str(e3Int)

with open(output_path , 'w') as f:
f.write(e3String)
# end with
print('done')
# end def

if __name__ == '__main__':
main()
# end if
ヒント

Jupyternotebookをご利用の場合はnotebookからdownload as .pyでスクリプトとしてダウンロードするかnbconvertで.pyファイルに変換することを検討してください。また、この手段で作成されたスクリプトはnotebookの一番上のセルから下に順に実行されることになります。セルの順番にご注意ください。

チュートリアル

1. コンテナ化する

ローカルで使用しているライブラリのリストを取得する

ターミナルやコマンドプロンプトから下記を順番に実行してください

# pythonパッケージ pipreqs をインストールします
{project_root} > pip install pipreqs
# 実行したいpythonスクリプトの必要なパッケージのみで構成された依存パッケージリストファイルを作成します
{project_root} > pipreqs

Dockerfileを作成する

  • Dockerfileを作成し、CLIから実行します
  • まずプロジェクトのルートフォルダへ移動し、スクリプトの実行環境と実行コマンドを定義します。
{project_root}  > touch Dockerfile
  • 次にサンプルコードを参考にしてDockerfileを作成してください
Dockerfileのサンプル
# https://hub.docker.com/_/python

FROM alpine:latest
RUN apk add --update python3

# インストール作業を行うフォルダを作成、移動します。
RUN mkdir -p /app/data
WORKDIR /app

# 1行目のCopyでローカル環境からコンテナの/appにrequirements.txtをコピーしています。
COPY requirements.txt /app/
RUN rm /app/requirements.txt

# ローカルのappフォルダを中身ごとWORK_DIRにコピーします。
COPY app ${WORK_DIR}

# コンテナのwork_dirに移動します。
WORKDIR ${WORK_DIR}

# コンテナ実行時に実行されるコマンドです。
CMD ["python", "app.py"]

Dockerイメージをビルドする

  • イメージをビルドします
# -t のオプションを忘れずにつけてください。ECRにイメージをpushするときに使用します。
{project_root} % docker build -t <name_of_your_image>:<tag_or_version_of_the_image> .
  • コマンドが正常に終了したらDockerイメージができています。下記コマンドで、ローカル環境にイメージができていることを確認してください。
% docker images

ローカルでコンテナを実行する

動作確認をします。手順は以下のとおりです。

  1. 入力ファイル(entity--e1.txt、entity--e2.txt)をテスト用のフォルダに格納する
  2. フォルダを指定し、CLIでコンテナにフォルダをマウントして下記を実行する
# -vオプションでホスト(ローカル)のボリュームをコンテナにマウントできます
% docker run -v [絶対パス]/app/data:/app/data <name_of_your_image>:<tag_or_version_of_the_image>

今回は、project_root/app下のdataフォルダを個別にコンテナにマウントしました。 これでプログラムが正常に終了して、ローカルのproject_root/app/dataにアウトプットファイルが出力されていれば、成功です。

2. ECRへプッシュする

  1. CLIで下記コマンドを実行してAWS ECRへログインしてください。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 534148718950.dkr.ecr.ap-northeast-1.amazonaws.com
  1. ローカルイメージのタグ付け ECRにpushするローカルのイメージをタグ付けしてください。
# host名以降は個別に提供されるリポジトリ名を指定してください
% docker tag <name_of_your_image>:<tag_or_version_of_the_image> 534148718950.dkr.ecr.ap-northeast-1.amazonaws.com/<repogitory_name>:<name_of_your_image>
  1. イメージをPushする タグ付けしたイメージをECRにpushします
% docker push 534148718950.dkr.ecr.ap-northeast-1.amazonaws.com/<repogitory_name>:<name_of_your_image>
ヒント

設定したイメージ名称はCanvasのFunctionを設定する際に使用するためメモを取っておくと便利です

3. CanvasでFunctionのURIを指定する

  1. サンプルCanvasをインポートします。

  2. FunctionのImageにECRのURIを入力します。

  3. Canvasをつくってデプロイする 画面右上の デプロイ ボタンからデプロイをします。テナント名は提供されているものを利用してください。

  4. フロントエンドからアクセスする

(フロントエンドSideAppにアクセス)

e1とe2に値を入れて送信ボタンを押します。e3に掛け算した結果が返ってきたら成功です。

ヒント

Injection を使用するとCanvas上からファイルのマウントポイントとファイルの内容を編集してFunctionのinputを作成することができます。