LoginSignup
1
1

More than 1 year has passed since last update.

WSL2からAWS LambdaにDocker containerをデプロイしてAPIとして動かすまで

Posted at

はじめに

現在開発中の機械学習を用いた簡単なサービスを作るにあたって、メインPCで処理させるのがどうしてもいやだったのでAWS Lambdaを使用しました。
現在のLambdaはDockerのimageサイズがが10Gまで対応してるので結構なんでも動かせます。
割り当てるメモリサイズを増やせばそこそこ性能も出るため、普通のモデルならGPUもいらないです。

今回は自身の忘備録もかねてwsl2からDocker containerをデプロイしてテストするまでを紹介します。
あまり細かい解説はしていないため、内容は手順書に近いです。

想定する読者

  • 細かいところはどうでもいいのでLambdaでとりあえず何か動かしたい人
  • AWSよくわかってない人(僕もよくわかってないです、間違ってるところあったら教えてください)

なぜWSL2でやるのか

  • 僕がネイティブに色々入れるのが嫌いだから
  • 環境が統一されていることが多そう(=誰でもそのまま動かせる)

実行環境

os:windows11 pro
wsl2:Ubuntu 18.04 LTS

本編

準備

まずはWSL2を導入してない人はこちらから導入しましょう。
Windows10 WSL2にUbuntuをインストールする

次にDockerをWSL2に導入しましょう。
僕はネイティブに何か入れるのが基本的に嫌なので、Docker on Desktopを入れないでよい方法を紹介したこの記事を参考にしました。(ubuntuの手順をそのまま踏むだけではありますが)
Docker Desktopに依存しない、WindowsでのDocker環境

それと持ってない人はAWSのアカウントも作ってください。
AWS

各種必要なパッケージのインストール

AWS CLIの導入

まずはAWS CLIを導入します。

unzipがない場合はこちらを実行してください。

wsl
sudo apt install unzip

次にCLIをダウンロードしてインストールしましょう。

wsl
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

初期設定をします。
IAMユーザという権限周りを設定したユーザを作る必要があるため、以下の記事から「.csvのダウンロード」まで実施してください。
UbuntuでAWS CLIを使えるようにする

wsl2上でsudoをつけてconfig設定をするとうまく設定を参照できないのかコケてしまったため、configは以下のように設定してください。

wsl
aws configure

キーはcsvに書いてあるもの、リージョンは東京ならばap-northeast-1を設定しましょう。

一応csvをimportしてユーザを登録できるのですが、最初のカラムがuser nameとなっているところをUser nameと変える必要があります。(なぜなのか・・・)
AWS CLI v2のconfigure Importを使ってみた

npm/nodejsの導入

色々試したのですが、wsl2では以下の方法がうまくいきました。

wsl
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
source ~/.bashrc
nvm install stable --latest-npm
AWS CDKの導入
wsl
npm install -g aws-cdk

cdkを入力して導入されているか確認してみてください。

Lambdaへデプロイ

Lambdaデプロイ準備

あまりやることないですが、仮想環境にpythonライブラリを入れるのが通例っぽいのでそれの準備をしましょう。

wsl
sudo apt-get install -y python3-venv
デプロイまで

以下の記事のサンプルが分かりやすいので、これに沿って進めていって下さい。
画像をAPI Gateway+Lambdaで受け取って Pillow で処理する(AWS CDK)

この記事の「デプロイ」の手前まで進んだらライブラリをインストールしましょう。
プロジェクトフォルダのrequirements.txtを以下のように書き換えてください。

requirements.txt
-e .
aws_cdk.aws_lambda
aws_cdk.aws_apigateway

書き換えたら仮想環境にライブラリをインストールします。
プロジェクトフォルダのルートで以下を実行してください。

wsl
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

ここまで終わればデプロイができます。
プロジェクトフォルダのルートで以下のコマンドを実行しましょう。

wsl
cdk deploy

テスト

実際に動かしてみましょう。
ここでは一旦上で紹介した記事の通りにPGを作ったと仮定しています。

まずAWSのコンソールから実際に設定されたAPIのエンドポイントを見に行きます。
Lambdaのページに飛ぶとプロジェクトフォルダと同じ名前がついた関数があると思うのでクリックしてください。
次に以下のような画面が表示されるのでAPI GateWayをクリックしてください。

スクリーンショット 2021-10-18 205646.png

そうするとAPIエンドポイントと書かれたURLが2つくらい表示されていると思うので、~/prodとなっている方をコピーして以下のPGに貼り付けてください。
~/test-invoke-stageとなっているものしかない時があったのですが、prodに書き換えたら普通に動きました。
ステージの更新にラグがあるのでしょうか?よくわかりません。

api_test.py
import requests
import base64

with open("./sample.png", 'br') as f:
    encoded_img = base64.b64encode(f.read())

api_endpoint = [API-Endpoint]

r_post = requests.post(api_endpoint, data=encoded_img)
print(r_post.json())

pythonで上記のPGを実行して最終的に{'status': 'ok'}と表示されればうまくいっています。
※サンプルではpngが想定されているので気を付けてください

上手くいってない場合はログをチェックしましょう。
AWSコンソール→CloudWatch→ロググループ
と遷移し、それっぽいものを開くと以下のような画像が出てくると思います。

image.png

日時が近いものを開いてログを見るとどこでエラー出てるとかわかります。
また、標準出力もここに表示されるので色々書き出すとわかりやすそうです。

その他情報

・機械学習モデルをデプロイしたい人
上で紹介した方と同じですが、以下の記事が分かりやすいです。
PyTorch on Lambda で MNIST の推論を実行する API を作成する(AWS CDK)
僕の場合モデルは開発環境でCPUに移してからモデルごと保存するとそのままロードして使えました。

・Docker上でopencv使いたい人
以下をDockerfileに追加してください。(もちろんpipでも入れてください)

RUN yum update -y && \
   yum install -y mesa-libGL

・ローカルでテストしたい人
公式のページが分かりやすいです。
Lambda コンテナイメージをローカルでテストする

1
1
1

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
1