かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

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-lambdaBuild Examples を見ると docker run -it lambci/lambda:build-python3.8 bash と記述されており、これで bash を起動すると python -m unittest -v コマンドを実行することが出来ました。

という理由で lambci/lambda:build-python3.8 の Docker Image を利用することにしました。

参照したサイト・書籍

  1. lambci / docker-lambda
    https://github.com/lambci/docker-lambda

  2. In 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/48777179

  3. Configure an interpreter using Docker
    https://www.jetbrains.com/help/pycharm/using-docker-as-a-remote-interpreter.html

目次

  1. lambci/lambda:build-python3.8 をベースに Pillow、moto をインストールしたカスタム Docker Image を作成する
  2. Docker コンテナでユニットテストを実行する
  3. IntelliJ IDEA からユニットテストを debug 実行する時にコードが Docker コンテナで動くようにする
  4. (メモ書き)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 を作成します。

f:id:ksby:20200613200742p:plain f:id:ksby:20200613200847p:plain f:id:ksby:20200613200950p:plain f:id:ksby:20200613201052p:plain

Docker コンテナでユニットテストを実行する

docker run --rm -it -v ``pwd -W``:/var/task:rw,delegated lambci/lambda:build-python3.8-resize-image-app-project bashpwd -W 前後の ` は1つだけに変更すること)を実行して Docker コンテナで bash を起動します。

/var/task にプロジェクトのルートディレクトリがマウントされていることが確認できます。

f:id:ksby:20200613202726p:plain

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 で実行してみると以下のようになります。

f:id:ksby:20200613203017p:plain

python -m unittest -v を実行するとテストが1件成功しました。

f:id:ksby:20200613203149p:plain

exit コマンドで Docker コンテナから抜けます。

IntelliJ IDEA からユニットテストを debug 実行する時にコードが Docker コンテナで動くようにする

IntelliJ IDEA のメインメニューから「File」-「Project Structure...」を選択して「Project Structure」ダイアログを表示します。

画面左側で「SDKs」を選択した後、中央のリストの上部から「+」-「Add Python SDK...」を選択します。

f:id:ksby:20200613211844p:plain

「Add Python Interpreter」ダイアログが表示されます。画面左側で「Docker」を選択してから、画面右側の「Image name」で作成したカスタム Docker Image(lambci/lambda:build-python3.8-resize-image-app-project)を選択して「OK」ボタンをクリックします。

f:id:ksby:20200613212253p:plain

「Project Structure」ダイアログに戻ると「Remote Python 3.8.3 Docker (lambci/lambda:build-python3.8-resize-image-app-project)」が追加されています。「OK」ボタンをクリックしてダイアログを閉じます。

f:id:ksby:20200613212449p:plain

IntelliJ IDEA のメインメニューから「Run」-「Edit Configurations...」を選択して「Run/Debug Configurationis」ダイアログを表示します。

前回作成した Python tests の設定で以下の点を変更します。

f:id:ksby:20200613213100p:plain

  • 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」で右側のフォルダアイコンをクリックします。

f:id:ksby:20200613213300p:plain

「Edit Docker Container Settings」ダイアログが開くのでマウント先の Container Path を「/opt/project」→「/var/task」に変更します。

f:id:ksby:20200613213508p:plain

「Run/Debug Configurationis」ダイアログに戻ってから「Docker container settings」の設定が以下の画像のようになっていることを確認した後「OK」ボタンをクリックしてダイアログを閉じます。

f:id:ksby:20200613213810p:plain

以上で設定は完了です。次は debug 実行してみます。

まず IntelliJ IDEA の Services Tool Window で Docker コンテナが1つも存在しないことを確認してから、

f:id:ksby:20200613214426p:plain

IntelliJ IDEA のエディタ上で handler.resize(event, None) の行に breakpoint を設定して「Debug 'Unittests for test_r...'」を選択します。

f:id:ksby:20200613214638p:plain

Console に以下の画像のように表示された後、breakpoint で止まります。

f:id:ksby:20200613214903p:plain f:id:ksby:20200613215024p:plain

Services Tool Window を見ると debug 用に起動していると思われるコンテナ(実行中)と /pycharm_helpers_IU... から始まるコンテナ(停止している)がありました。

f:id:ksby:20200613215205p:plain

Debugger で「Step Info」「Step Over」で処理を進めることができることも確認できます。

debug 実行を終了させると、

f:id:ksby:20200613215634p:plain

コンテナは /pycharm_helpers_IU... から始まるもののみ残っていました。こちらは自動で削除されないようです。

f:id:ksby:20200613215750p:plain

(メモ書き)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 を作成できません。

f:id:ksby:20200613220653p:plain

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 が作成できます。

f:id:ksby:20200613221009p:plain (..........途中省略..........) f:id:ksby:20200613221107p:plain

履歴

2020/06/13
初版発行。