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

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

AWS Cloud9の環境にはDockerが既定でインストールされており、下記の４つのイメージが標準で作成されている。
これでコンテナを作って使えないかと考えた。

```
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しましょう。