AWS Lambdaでrequestsを使うためのセットアップ

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

Python環境のAWS Lambdaを使うにあたってrequestsを使いたかったのですが、デフォルトのLambdaでは外部モジュールとなるrequestsは使えないようで。
これに気が付く前に、Lambdaを実行した結果が以下です。
"errorMessage": "Unable to import module 'lambda_function': No module named 'requests'",と出ていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f775b7c7-2d24-a18c-d0de-2bc7fc29af2c.png)

これを解消するために、レイヤーというものを作ってLambdaに追加する必要があるようで、その手順の備忘録です。
※Cloud9で用意するのが簡単という記事を拝見したのですが、私はうまくいかずでした・・・

# 手順
レイヤーを作るにあたり必要となるzipファイルを用意していきます。
まずローカルでpython環境を立ち上げます。
私はanacondaを起動してそれをVSCodeで開いて準備しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7a7159b1-1be7-d59c-019d-247bc30d4404.png)
pythonとpipのバージョンは以下となります。Lambda側のPythonランタイムと併せましょう。
```
PS C:\Users\ohtsu\Documents\Python_dev> python -V
Python 3.12.3
PS C:\Users\ohtsu\Documents\Python_dev> pip3 -V
pip 23.3.1 from C:\Users\ohtsu\anaconda3\envs\any\Lib\site-packages\pip (python 3.12)
```
Lambdaのランタイムは以下でした。ローカル側とあっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4b8d5f9c-226c-d4ec-2a4e-750205102d6d.png)

以下のコマンドを実行してpythonフォルダを作成し、そこに移動してください。
pythonというフォルダ名はLambdaで指定されているようなので変えてはいけません。
```
PS C:\Users\ohtsu\Documents\Python_dev> mkdir python
PS C:\Users\ohtsu\Documents\Python_dev> cd .\python\
```

以下のコマンドを実行してrequestsをインストールします。
色々インストールされます。
```
PS C:\Users\ohtsu\Documents\Python_dev\python> pip3 install requests -t . 
Collecting requests
  Using cached requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)
Collecting charset-normalizer<4,>=2 (from requests)
  Using cached charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl.metadata (34 kB)
Collecting idna<4,>=2.5 (from requests)
  Using cached idna-3.7-py3-none-any.whl.metadata (9.9 kB)
Collecting urllib3<3,>=1.21.1 (from requests)
  Using cached urllib3-2.2.1-py3-none-any.whl.metadata (6.4 kB)
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2024.2.2-py3-none-any.whl.metadata (2.2 kB)
Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Using cached certifi-2024.2.2-py3-none-any.whl (163 kB)
Using cached charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl (100 kB)
Using cached idna-3.7-py3-none-any.whl (66 kB)
Using cached urllib3-2.2.1-py3-none-any.whl (121 kB)
Installing collected packages: urllib3, idna, charset-normalizer, certifi, requests
Successfully installed certifi-2024.2.2 charset-normalizer-3.3.2 idna-3.7 requests-2.31.0 urllib3-2.2.1
PS C:\Users\ohtsu\Documents\Python_dev\python> ls


    ディレクトリ: C:\Users\ohtsu\Documents\Python_dev\python


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/05/04     22:20                bin
d-----        2024/05/04     22:20                certifi
d-----        2024/05/04     22:20                certifi-2024.2.2.dist-info
d-----        2024/05/04     22:20                charset_normalizer
d-----        2024/05/04     22:20                charset_normalizer-3.3.2.dist-info
d-----        2024/05/04     22:20                idna
d-----        2024/05/04     22:20                idna-3.7.dist-info
d-----        2024/05/04     22:20                requests
d-----        2024/05/04     22:20                requests-2.31.0.dist-info
d-----        2024/05/04     22:20                urllib3
d-----        2024/05/04     22:20                urllib3-2.2.1.dist-info
```

このディレクトリをzip化します。
今回はこんな感じでrequests.zipとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/ab5f2606-61d1-0f01-7ece-60e146c9a3db.png)

AWSのLambdaの管理画面を開き、左にあるレイヤーを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/fffe8aa9-9541-593c-1a53-e297d0d60219.png)
レイヤーの作成を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/1c7abbd0-b5ef-99e8-f7ac-90929579e7d7.png)
任意の名前を入力して、先ほど作成したzipファイルをアップロードし、作成を押下します。
![screencapture-ap-northeast-1-console-aws-amazon-lambda-home-2024-05-04-22_24_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f5eae912-16c6-c673-2ebb-76bf3ad18cb6.png)
作成されたことを確認します。Arnは後で使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6f66d849-526e-b02e-58b3-e208fad2feba.png)
作成したレイヤーをLambdaにアタッチします。
Lambdaのコードが書かれているところを下にスクロールするとレイヤーという項目があります。レイヤーの追加を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2ee0144e-af4b-5401-6efb-85b9e1efe0c2.png)
ARN指定で、先ほど作成したレイヤーのARNを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d9c3df3b-f788-11bc-fe64-4ab06b933d41.png)
レイヤーの欄に追記されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/dc8a6101-4788-ddc4-37f5-c6fc24c711ff.png)
テストでLambdaを動かすと今度はちゃんと動きました。
どんな関数を動かしているかは今後Qiitaに投げます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/0bfffc08-b104-f18e-ea60-46321c91ae8b.png)