resize-image-app-project プロジェクトで作成した AWS Lambda のユニットテストを Docker コンテナ上で動作させる
概要
記事一覧はこちらです。
resize-image-app-project プロジェクトで作成した AWS Lambda のユニットテストを作成する(local動作版) でユニットテストを作成しましたが、Pillow は OS 依存のバイナリがあるので lambci/lambda:build-python3.8 の Docker Image 上でユニットテストを実行して動作確認する方法を調べてみます。
最初 lambci/lambda:python3.8 を利用してユニットテストを動かそうとしたのですが、
- lambci/lambda:python3.8 で Lambda の関数(resize_service/handler.resize)を呼び出す方法は分かったのですが、
python -m unittest -v
コマンドを実行する方法が全然分かりません。 - lambci / docker-lambda の Build Examples を見ると
docker run -it lambci/lambda:build-python3.8 bash
と記述されており、これで bash を起動するとpython -m unittest -v
コマンドを実行することが出来ました。
という理由で lambci/lambda:build-python3.8 の Docker Image を利用することにしました。
参照したサイト・書籍
lambci / docker-lambda
https://github.com/lambci/docker-lambdaIn Git for windows “git bash”, how to “print working directory” in Windows path format that is usable by cmd and Windows explorer?
https://stackoverflow.com/questions/44842275/in-git-for-windows-git-bash-how-to-print-working-directory-in-windows-path/48777179Configure an interpreter using Docker
https://www.jetbrains.com/help/pycharm/using-docker-as-a-remote-interpreter.html
目次
- lambci/lambda:build-python3.8 をベースに Pillow、moto をインストールしたカスタム Docker Image を作成する
- Docker コンテナでユニットテストを実行する
- IntelliJ IDEA からユニットテストを debug 実行する時にコードが Docker コンテナで動くようにする
- (メモ書き)lambci/lambda:python3.8 をベースにカスタム Docker Image を作成する
手順
lambci/lambda:build-python3.8 をベースに Pillow、moto をインストールしたカスタム Docker Image を作成する
プロジェクトのルートディレクトリ直下に Dockerfile を作成して以下の内容を記述します。
FROM lambci/lambda:build-python3.8 COPY resize_service/requirements.txt /tmp/requirements.txt RUN pip install --upgrade pip RUN pip install -r /tmp/requirements.txt RUN pip install moto
コマンドプロンプト(今回は git-bash)で docker build . -t lambci/lambda:build-python3.8-resize-image-app-project
を実行してカスタム Docker Image を作成します。
Docker コンテナでユニットテストを実行する
docker run --rm -it -v ``pwd -W``:/var/task:rw,delegated lambci/lambda:build-python3.8-resize-image-app-project bash
(pwd -W 前後の ` は1つだけに変更すること)を実行して Docker コンテナで bash を起動します。
/var/task
にプロジェクトのルートディレクトリがマウントされていることが確認できます。
pwd -W
の部分は Web の記事を見ると $(pwd)
と書かれていますが、
- Windows 上の git-bash だと
$(pwd)
は/d/project-serverless/ksbysample-serverless/resize-image-app-project
を返す。 - Windows で docker コマンドの -v オプションにマウント元を渡す時には
/d/...
ではなくD:\...
で渡さないとマウントされない(エラーになる)。
という理由で pwd -W
に変えました。試しに git-bash で実行してみると以下のようになります。
python -m unittest -v
を実行するとテストが1件成功しました。
exit コマンドで Docker コンテナから抜けます。
IntelliJ IDEA からユニットテストを debug 実行する時にコードが Docker コンテナで動くようにする
IntelliJ IDEA のメインメニューから「File」-「Project Structure...」を選択して「Project Structure」ダイアログを表示します。
画面左側で「SDKs」を選択した後、中央のリストの上部から「+」-「Add Python SDK...」を選択します。
「Add Python Interpreter」ダイアログが表示されます。画面左側で「Docker」を選択してから、画面右側の「Image name」で作成したカスタム Docker Image(lambci/lambda:build-python3.8-resize-image-app-project)を選択して「OK」ボタンをクリックします。
「Project Structure」ダイアログに戻ると「Remote Python 3.8.3 Docker (lambci/lambda:build-python3.8-resize-image-app-project)」が追加されています。「OK」ボタンをクリックしてダイアログを閉じます。
IntelliJ IDEA のメインメニューから「Run」-「Edit Configurations...」を選択して「Run/Debug Configurationis」ダイアログを表示します。
前回作成した Python tests の設定で以下の点を変更します。
- 「Python initerpreter」を「Use SDK of module」→「Use specified interpreter」に変更した後、「Remote Python 3.8.3 Docker (lambci/lambda:build-python3.8-resize-image-app-project)」を選択します。
次に「Docker container settings」で右側のフォルダアイコンをクリックします。
「Edit Docker Container Settings」ダイアログが開くのでマウント先の Container Path を「/opt/project」→「/var/task」に変更します。
「Run/Debug Configurationis」ダイアログに戻ってから「Docker container settings」の設定が以下の画像のようになっていることを確認した後「OK」ボタンをクリックしてダイアログを閉じます。
以上で設定は完了です。次は debug 実行してみます。
まず IntelliJ IDEA の Services Tool Window で Docker コンテナが1つも存在しないことを確認してから、
IntelliJ IDEA のエディタ上で handler.resize(event, None)
の行に breakpoint を設定して「Debug 'Unittests for test_r...'」を選択します。
Console に以下の画像のように表示された後、breakpoint で止まります。
Services Tool Window を見ると debug 用に起動していると思われるコンテナ(実行中)と /pycharm_helpers_IU...
から始まるコンテナ(停止している)がありました。
Debugger で「Step Info」「Step Over」で処理を進めることができることも確認できます。
debug 実行を終了させると、
コンテナは /pycharm_helpers_IU...
から始まるもののみ残っていました。こちらは自動で削除されないようです。
(メモ書き)lambci/lambda:python3.8 をベースにカスタム Docker Image を作成する
今回は作成しませんでしたが build-
が付かない lambci/lambda:python3.8 をベースにカスタム Docker Image を作成する時は Dockerfile の書き方が少し異なるのでメモ書きとして残しておきます。
FROM に lambci/lambda:python3.8
を記述した Dockerfile を作成し、
FROM lambci/lambda:python3.8 COPY resize_service/requirements.txt /tmp/requirements.txt RUN pip install --upgrade pip RUN pip install -r /tmp/requirements.txt RUN pip install moto
docker build . -t lambci/lambda:python3.8-resize-image-app-project
を実行すると ERROR が出て Docker Image を作成できません。
Dockerfile に USER root
を追加します。
FROM lambci/lambda:python3.8 USER root COPY resize_service/requirements.txt /tmp/requirements.txt RUN pip install --upgrade pip RUN pip install -r /tmp/requirements.txt RUN pip install moto
再度 docker build . -t lambci/lambda:python3.8-resize-image-app-project
を実行すると今度は Docker Image が作成できます。
(..........途中省略..........)
履歴
2020/06/13
初版発行。