Unable to import module 'lambda_function': No module namedとなった時の対応方法


- 環境
    - Cloud9
        - 同僚がEC2を利用したCloud9を使っていたので、私も使ってみたくてそのCloud9にアカウントを作ってもらって早速使い始めた。半端ない初心者。
    - Python 3.6.12

# 事象 : `import requests`をして実行したらモジュールがなくて怒られた

```bash
Response
{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Unable to import module 'lambda_function': No module named 'requests'"
}
```

がーん！でも`pip list`は`requests`があるとおっしゃっている。

```bash
ponsuke:~/environment (asynchronous) $ pip list | grep requests
requests            2.24.0
```

## 原因 : 対象のLambda関数にモジュールがインストールされていないから

lambda_function.pyのディレクトリをみればモジュールがないのが分かる。
Cloud9を使ってLambda関数を作るときは`pip list`を見りゃいいというわけではないらしい。

> モジュールのインストール先が間違っていたことがエラーの原因でした.
> Cloud9 は Lambda アプリケーション を利用しているため, アプリケーションディレクトリ(今回はDemoApplication/)が Lambda ファンクションの実行ディレクトリになります.
> したがって, import requests で requests モジュールを読み込みたい場合はアプリケーションディレクトリ直下にモジュールをインストールする必要がありました.
> [Cloud9 上で Lambda を実行する際に “Unable to import module : No module named” エラーが出た場合の対処 | Developers.IO](https://dev.classmethod.jp/articles/where-to-install-modules-on-cloud9/)

```bash
# Lambda関数のディレクトリへ移動して
$ cd lambda_name/

# 中身を見ると・・・モジュールは何にもなかった・・・
ponsuke:~/environment/lambda_name (asynchronous) $ ls -la
total 36
drwxr-xr-x  2 ec2-user ec2-user  4096 Nov 24 01:06 .
drwxr-xr-x 32 ec2-user ec2-user  4096 Nov 20 02:35 ..
-rw-r--r--  1 ec2-user ec2-user   197 Nov 20 02:35 .application.json
-rw-r--r--  1 ec2-user ec2-user  1082 Nov 20 09:04 lambda_function.py
-rw-r--r--  1 ec2-user ec2-user 10690 Nov 24 01:06 lambda-payloads.json
-rw-r--r--  1 ec2-user ec2-user   512 Nov 20 02:35 templap
```

### 対応 : 場所を指定してモジュールをインストールする

> -t, --target <dir>
> Install packages into <dir>. By default this will not replace existing files/folders in <dir>. Use --upgrade to replace existing packages in <dir> with new versions.
> [pip install &mdash; pip 9.1.0.dev0 ドキュメント](https://kurozumi.github.io/pip/reference/pip_install.html)

```bash
ponsuke:~/environment/lambda_name (asynchronous) $ pip install --target . requests
Collecting requests
  Downloading requests-2.25.0-py2.py3-none-any.whl (61 kB)
     |████████████████████████████████| 61 kB 7.1 MB/s
Collecting chardet<4,>=3.0.2
  Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.2-py2.py3-none-any.whl (136 kB)
     |████████████████████████████████| 136 kB 15.9 MB/s
Collecting certifi>=2017.4.17
  Downloading certifi-2020.11.8-py2.py3-none-any.whl (155 kB)
     |████████████████████████████████| 155 kB 18.3 MB/s
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Installing collected packages: chardet, urllib3, certifi, idna, requests
Successfully installed certifi-2020.11.8 chardet-3.0.4 idna-2.10 requests-2.25.0 urllib3-1.26.2
```

### だめな対応 : 場所を指定しないでモジュールをインストールする
場所を指定しないでインストールしても、もうあるものはもうある。

- 参考 : [Python - Pythonモジュールをpipからinstallしようとするとエラーになります。｜teratail](https://teratail.com/questions/266728)


```bash
# ぷ？もうある・・・権限がない？
ponsuke:~/environment/lambda_name (asynchronous) $ pip install requests
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: requests in /home/ec2-user/.local/lib/python3.6/site-packages (2.24.0)
Requirement already satisfied: idna<3,>=2.5 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (1.25.10)
Requirement already satisfied: certifi>=2017.4.17 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (2020.6.20)

# --userオプションでDefaulting to user...は消えたけど状況変わらず
ponsuke:~/environment/lambda_name (asynchronous) $ pip install --user requests
Requirement already satisfied: requests in /home/ec2-user/.local/lib/python3.6/site-packages (2.24.0)
Requirement already satisfied: idna<3,>=2.5 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (1.25.10)
Requirement already satisfied: certifi>=2017.4.17 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (2020.6.20)

# もしかして、Python2になってるとか？と思ってみたけど何も変わらず・・
ponsuke:~/environment/lambda_name (asynchronous) $ python3 -m pip install --user requests
Requirement already satisfied: requests in /home/ec2-user/.local/lib/python3.6/site-packages (2.24.0)
Requirement already satisfied: idna<3,>=2.5 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (2.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (1.25.10)
Requirement already satisfied: certifi>=2017.4.17 in /home/ec2-user/.local/lib/python3.6/site-packages (from requests) (2020.6.20)
```