AWS LambdaでPython外部ライブラリのLayerを作る前に

## 結論
先人によって既に作られてないか、いったん確認してみましょう。
[keithrozario/Klayers](https://github.com/keithrozario/Klayers)

## 使い方
なぜかAWS公式でLayerが提供されていないライブラリ、[pandas](https://pandas.pydata.org/)を例として使います。
(Numpy + Scipyがあるなら、pandasもあってくれていい気がしています)

### 0. 前準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/fa06c36d-2a94-5a23-5ff9-f68157476e68.png)
AWS Lambdaにアクセスして、[関数の作成]を押し、適当な名前の関数を作ります。
「ランタイム」はPython3.8を選びます。「アクセス権限」はノータッチでOKです。

### 1. pandasをインポートし、テストを作成
`import pandas`を追加し、[保存]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/04447e86-627d-9da7-d1de-be7898ed6219.png)

[テスト]を押し、「イベント名」に適当な名前を入れます。
下のJSONは特にいじらなくてOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/8ab23b6d-99db-6b8e-a42a-9458abe99d76.png)

この時点でもう一度[テスト]を押すと失敗します。pandasが無いよと言われています。
それはそうという感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/c277ba14-c27f-804b-56af-c65a01cd5fa1.png)

### 2. pandasのLayerのARNを調べ、Layerを追加
必要な情報は以下の2つです。

* Lambda実行環境のPythonのバージョン
* Lambda関数が所属しているリージョン

いま、自分の実行環境は`Python3.8`でリージョンは`us-east-1`です。(リージョンが異なる場合は、適宜自分のものに読み替えてください。)
[keithrozario/Klayers](https://github.com/keithrozario/Klayers)にアクセスし、[deployments] -> [python3.8] -> [arns] -> [us-east-1.csv]と辿ります。
pandas があるので、該当行のARNをコピーします。pandasのように、複数バージョンのLayerが提供されているライブラリもあります。
ここではpandas1.0.1を選択しました。ほかのバージョンでも特に問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/c1a09616-bac1-3eab-f3d2-fd1b30bae10c.png)

Lambdaに戻り、「Designer」の中の[Layers]を選択します。下に「Layers」というカードが出てくるので、[Layerの追加]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/5c405843-8fe0-19f1-3664-489659087dd4.png)
[レイヤーバージョン ARN を提供]を選択し、「レイヤーバージョン ARN」に先ほどのARNを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/f829ef38-2187-b0df-40e5-555bab123183.png)
[追加]を押して関数の設定ページに戻ります。
きちんと追加されていれば、「Layer」に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/b7257b7a-9e48-3722-175d-e96b8c26b57e.png)

[保存]を押します。

### 3. 確認
さて、これでレイヤーの追加ができたので、pandasを使えるようになっているはずです。
先ほど設定したテストを実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199887/eb17b3ef-b2c6-804b-14d6-0997965a9c8c.png)

pandasがインポートされている状態で、関数が正常終了したことが分かります。


## Layerが用意されているライブラリ一覧
- aiobotocore
- aiohttp
- ansible
- aws-lambda-powertools (Python3.8 only)
- arrow
- aws-xray-sdk
- bcrypt
- beautifulsoup4
- boltons
- boto3
- construct
- dynamodb-encryption-sdk (Python3.8 only)
- elasticsearch
- envelopes
- ffmpeg-python
- flashtext
- google-auth
- google-auth-oauthlib
- grpcio
- gspread
- idna
- itsdangerous
- kafka-python
- nltk
- numpy
- opencv-python-headless
- openpyxl
- pandas
- parliament (Python3.8 only)
- Pillow
- pulp
- pycryptodome (Python3.8 only)
- PyJWT
- pymongo
- PyMUPDF
- PyMySQL
- PyNaCl
- pyOpenSSL
- pyparsing
- pyqldb
- pytesseract
- python-docx
- python-Levenshtein
- pytz
- PyYAML
- reportlab (Python3.8 only)
- requests
- simplejson
- slackclient
- spacy
- SQLAlchemy
- textdistance
- tinydb
- tldextract
- twilio

## 終わりに
OS依存の関数があったりすると、Lambdaの実行環境と同じOSでzipを作らなければならないのでちょっと面倒です。
外部ライブラリをサクッとLambdaで使いたいだけなら、ありがたく先人が開いてくれた道を通らせていただきましょう。

Lambdaで使える他の言語で、類似のgithubリポジトリ等があれば教えていただければ幸いです。
(ざっと探しましたが見つかりませんでした)