AWS
Docker
AWSCloud9

AWS Cloud9上に既定で用意されているDockerイメージからコンテナを起動しようとするとExited (1)となる

AWS Cloud9で新規作成した環境に標準で用意されているDockerイメージを使ってみようとしたが上手くいかず調査したときのメモ。

AWS Cloud9の環境にはDockerが既定でインストールされており、下記の4つのイメージが標準で作成されている。

これでコンテナを作って使えないかと考えた。

ec2-user:~/environment $ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
lambci/lambda python2.7 b92d1404520d 3 weeks ago 951MB
lambci/lambda nodejs6.10 6d5686f02fe2 3 weeks ago 996MB
lambci/lambda nodejs4.3 ce68cbe2ecf8 3 weeks ago 945MB
lambci/lambda python3.6 659e6b066789 3 weeks ago 1.08GB

しかし、runコマンドでイメージからコンテナを起動しようとすると、立ち上がってすぐにExited (1)となりコンテナが落ちてしまう。

ec2-user:~/environment $ docker run -itd b92d1404520d

7cc7c4396751(略)
ec2-user:~/environment $ docker run -itd 6d5686f02fe2
86e6cb64fa4a(略)
ec2-user:~/environment $ docker run -itd ce68cbe2ecf8
f9ea26de0f5e(略)
ec2-user:~/environment $ docker run -itd 659e6b066789
a32d9cf3042c(略)
ec2-user:~/environment $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a32d9cf3042c 659e6b066789 "/var/lang/bin/pytho…" 6 seconds ago Exited (1) 7 seconds ago keen_galileo
f9ea26de0f5e ce68cbe2ecf8 "/usr/local/lib64/no…" 6 seconds ago Exited (1) 7 seconds ago reverent_tereshkova
86e6cb64fa4a 6d5686f02fe2 "/var/lang/bin/node …" 6 seconds ago Exited (1) 7 seconds ago vigorous_swanson
7cc7c4396751 b92d1404520d "/usr/bin/python2.7 …" 6 seconds ago Exited (1) 7 seconds ago infallible_ardinghelli

--no-truncオプションでコンテナ起動時に実行されるCOMMANDを全文表示してみると、どうやらAWS Lambdaが関数を実行するときの処理シーケンスのように見える。(http://marcy.hatenablog.com/entry/2016/12/14/115953)

ec2-user:~/environment $ docker ps -a --no-trunc

CONTAINER ID   IMAGE COMMAND CREATED STATUS PORTS NAMES
a32d9cf3042c(略) 659e6b066789 "/var/lang/bin/python3.6 /var/runtime/awslambda/bootstrap.py" 7 minutes ago Exited (1) 7 minutes ago keen_galileo
f9ea26de0f5e(略) ce68cbe2ecf8 "/usr/local/lib64/node-v4.3.x/bin/node --expose-gc --max-executable-size=160 --max-semi-space-size=150 --max-old-space-size=2547 /var/runtime/node_modules/awslambda/index.js" 7 minutes ago Exited (1) 7 minutes ago reverent_tereshkova
86e6cb64fa4a(略) 6d5686f02fe2 "/var/lang/bin/node --expose-gc --max-executable-size=160 --max-semi-space-size=150 --max-old-space-size=2547 /var/runtime/node_modules/awslambda/index.js" 7 minutes ago Exited (1) 7 minutes ago vigorous_swanson
7cc7c4396751(略) b92d1404520d "/usr/bin/python2.7 /var/runtime/awslambda/bootstrap.py" 8 minutes ago Exited (1) 8 minutes ago infallible_ardinghelli

docker logsでログを見てみる。

これは明らかにAWS Lambda関数の実行に失敗したときのエラー。

ec2-user:~/environment $ docker logs a32d9cf3042c

START RequestId: 010a633a-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
Unable to import module 'lambda_function': No module named 'lambda_function'
END RequestId: 010a633a-xxxx-xxxx-xxxx-xxxxxxxxxxxx
REPORT RequestId: 010a633a-xxxx-xxxx-xxxx-xxxxxxxxxxxx Duration: 1 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 19 MB

{"errorMessage": "Unable to import module 'lambda_function'"}
ec2-user:~/environment $ docker logs f9ea26de0f5e
START RequestId: 6da74752-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
Unable to import module 'index': Error
at Function.Module._resolveFilename (module.js:325:15)
at Function.Module._load (module.js:276:25)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
END RequestId: 6da74752-xxxx-xxxx-xxxx-xxxxxxxxxxxx
REPORT RequestId: 6da74752-xxxx-xxxx-xxxx-xxxxxxxxxxxx Duration: 9.35 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 22 MB

{"errorMessage":"Cannot find module '/var/task/index'","errorType":"Error","stackTrace":["Function.Module._load (module.js:276:25)","Module.require (module.js:353:17)","require (internal/module.js:12:17)"]}
ec2-user:~/environment $ docker logs 86e6cb64fa4a
START RequestId: 64047b49-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
Unable to import module 'index': Error
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
END RequestId: 64047b49-xxxx-xxxx-xxxx-xxxxxxxxxxxx
REPORT RequestId: 64047b49-xxxx-xxxx-xxxx-xxxxxxxxxxxx Duration: 9.66 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 27 MB

{"errorMessage":"Cannot find module '/var/task/index'","errorType":"Error","stackTrace":["Function.Module._load (module.js:417:25)","Module.require (module.js:497:17)","require (internal/module.js:20:19)"]}
ec2-user:~/environment $ docker logs 7cc7c4396751
START RequestId: cc72da4b-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
Unable to import module 'lambda_function': No module named lambda_function
END RequestId: cc72da4b-xxxx-xxxx-xxxx-xxxxxxxxxxxx
REPORT RequestId: cc72da4b-xxxx-xxxx-xxxx-xxxxxxxxxxxx Duration: 0 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 14 MB

{"errorMessage": "Unable to import module 'lambda_function'"}

どうやら私が使おうとしていたDockerイメージは、AWS Cloud9の本来の機能としてAWS Lambda関数の作成、テスト、デプロイを行う際に使用されるイメージで、正規の使い方ではないことをしようとしていたためエラーで落ちてしまっていた、ということでした。

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/tutorial-lambda.html

結論として、Cloud9上でDockerを利用したい場合は、外部からpullするか、いちからbuildしましょう。