AWS サーバーレスアプリケーションモデル ~ チュートリアル: Hello World アプリケーションのデプロイの実施

今回のお題は「AWS サーバーレスアプリケーションモデル ~ チュートリアル: Hello World アプリケーションのデプロイの実施」

記事からの引用だが、前提条件はこれ。
f:id:graySpace:20200414145938p:plain

次の3つのステップを実施する。
動作環境はWSLで、OSはubuntu

#Step 1 - Download a sample application
sam init

#Step 2 - Build your application
cd sam-app
sam build

#Step 3 - Deploy your application
sam deploy --guided

ここまでは特に問題なし。詳細は記事参照

問題は「ステップ 4: アプリケーションをローカルでテストする (オプション)」。

ドキュメントに従って、API をローカルでホストする。

$sam local start-api
Error: Running AWS SAM projects locally requires Docker. Have you got it installed?

おかしい。。。WSLにもdockerをインストールしたのだが、Dockerが必要だと言われる。
ぐぐったら、次の記事に原因が書いてあった。
qiita.com

記事から引用させていただくと、原因は「WSL内のDockerはホストにはなれず、WSLはあくまでもクライアント」だから、利用できないようです。
f:id:graySpace:20200414152551p:plain

したがって、WindowsにインストールしたDockerを、WSLから使う必要がある。
そのために、下記設定を行う(これも記事から引用)。
f:id:graySpace:20200414152839p:plain

設定を行うと起動成功。

user@host:~/workspace/sam-app$ sam local start-api
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template
2020-04-14 15:32:44 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)

しかし、いくら待ってもAWSのマニュアル通りの出力にならない。
Docker イメージが読み込まれない。。。
f:id:graySpace:20200414153503p:plain

気にせず、curlで「curl http://127.0.0.1:3000/hello」もしくはブラウザで「http://127.0.0.1:3000/hello」を実行すると、Dockerイメージは読み込まれたが、502エラー。

Lambda returned empty body!
Invalid API Gateway Response Keys: {'errorMessage', 'errorType'} in {'errorType': 'Runtime.ImportModuleError', 'errorMessage': "Unable to import module 'app': No module named 'app'"}

2020-04-14 06:39:34 127.0.0.1 - - [14/Apr/2020 06:39:34] "GET /hello HTTP/1.1" 502 -
2020-04-14 06:39:34 127.0.0.1 - - [14/Apr/2020 06:39:34] "GET /favicon.ico HTTP/1.1" 403 -

1 回限りの呼び出しを実行してみるとDockerイメージの読み込みが行われたが、エラー。。。

user@host:~/workspace/sam-app$ sam local invoke HelloWorldFunction --event ./events/event.json
Invoking app.lambda_handler (python3.7)

Fetching lambci/lambda:python3.7 Docker container image......
Mounting /home/user/workspace/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: 143cbc71-xxb3-114b-b44c-ba4d31cda5fc Version: $LATEST
[ERROR] Runtime.ImportModuleError: Unable to import module 'app': No module named 'app'

END RequestId: 111xxxbc1272-aab3-114b-b84c-ba8d31cda9fc
REPORT RequestId: 7aera91cbc72-aaeraeraab3-1aera14b-b8aewra4c-baaera8d31arecda9fc Init Duration: 97.00 ms Duration: 2.98 ms
Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 23 MB

{"errorType":"Runtime.ImportModuleError","errorMessage":"Unable to import module 'app': No module named 'app'"}