AWS Lambda の Python で pandas や requests を使うのに、Lambda Layer を自作する必要はない -  AWS SDK for pandas を活用しよう

## 概要

- AWS Lambda では、マネージドに提供されている AWS レイヤーがあり、自分でビルドすることなく簡単に利用できる
- [AWS SDK for pandas](https://aws-sdk-pandas.readthedocs.io/en/stable/index.html) のマネージドな Lambda Leyer には、 pandas / numpy といったデータ処理系のモジュールや aiohttp / requests といった HTTP リクエスト用モジュールなど、様々なモジュールがバンドルされている (一覧は後述)
- AWS Lambda でこれらのモジュールを使用する方法として、多くの記事では Lambda Layer を自作する方法や第三者の公開するレイヤーを利用する方法が記載されているが、上述の Lambda Layer でより簡単かつ安全に実現できる

## [AWS SDK for pandas](https://aws-sdk-pandas.readthedocs.io/en/stable/index.html) とは

AWS SDK for pandas (旧名称: AWS Data Wrangler)は、AWS が開発・公開しているオープンソースの Python ライブラリです。 AWS のデータやデータ分析サービスと pandas の DataFrame とのやり取りを容易にする目的で設計されており、例えば「S3 のデータを直接 pandas の DataFrame として読み書きする」などの操作を最小限のコードで実現できます。

本記事では SDK の詳細には触れません。[公式ドキュメント](https://aws-sdk-pandas.readthedocs.io/en/stable/index.html) や、下記動画のちょっぴり Deep Dive ([資料](https://pages.awscloud.com/rs/112-TZM-766/images/20230727_32th_ISV_DiveDeepSeminar_introduction_sdk_for_pandas.pdf)) が参考になりますので、そちらをご参照ください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/BVbBB4F0kFg?si=xr9QQocXtOV2OXmy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

同 SDK を Python 環境にインストールすれば、当該 SDK のモジュールを使うことはもちろん、このモジュールが依存する各種ライブラリも同様に直接利用できます。

そして、この SDK は、AWS Lambda レイヤーのうち、AWS がマネージドに提供する AWS レイヤーとしてもラインナップされています ([公式ドキュメントはこちら](https://aws-sdk-pandas.readthedocs.io/en/stable/install.html#managed-layer))。そのため、自分でレイヤーをパッケージングすることなく Lambda 関数に追加できます。

## やってみる

### Lambda 関数の作成と、Layer 追加前の挙動確認

東京リージョンで、Lambda 関数を作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790935/483c12f5-9e3e-4cdc-bf4c-b4ad1050abd7.png)

まず、何もレイヤーを追加しない状態で pandas を import して、失敗することを確認してみましょう。最初に作成されるコードに、pandas の import とバージョン表示の 2 行を追加してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790935/420fd290-1379-408f-a3e2-69fbafcbbf25.png)

この状態で Lambda 関数の「テスト」タブからテスト実行してみると、pandas が見つからずにエラーになることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790935/3140bcbd-209c-4cd0-b70d-e086c934af25.png)

### AWS SDK for pandas の Lambda Layer 追加

では、AWS SDK for pandas の Lambda Layer を追加してみます。Lambda の「コード」タブに戻り、最下部のレイヤーのセクションで「レイヤーの追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790935/3cb9f967-681f-485f-860b-d8d35a27542c.png)

追加するレイヤーとして「AWS レイヤー」> 「AWSSDKPandas-Python313」を選択し、バージョンも選択します。「追加」をクリックすると追加完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790935/49600172-9b2b-469a-9766-4054a7a4c8e4.png)

再び Lambda 関数の「テスト」タブからテスト実行してみると、pandas の import に成功し、pandas が利用可能であることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790935/67f207d6-46ed-4812-b346-613a6c7abb0a.png)

レイヤーを自作するよりもずっと簡単ですし、AWS レイヤーとして提供されているため安心s利用できますね！

## 参考:含まれているモジュール一覧

2025/02/24 時点で、Python 3.13 版の AWS SDK for Pandas 3.11.0 に含まれるモジュールの一覧は以下の通りです。単にデータ処理系のモジュールだけでなく、 aiohttp や requests といった HTTP リクエスト系モジュールや、スクレイピングモジュールの beautifulsoup4 なども含まれているため、データ処理以外のユースケースでも活用できるかなと思います。

| module_name | version |
| ---- | ---- |
| Events | 0.5 |
| PyMySQL | 1.1.1 |
| aenum | 3.1.15 |
| aiohappyeyeballs | 2.4.4 |
| aiohttp | 3.11.11 |
| aiosignal | 1.3.2 |
| asn1crypto | 1.5.1 |
| async-timeout | 4.0.3 |
| attrs | 24.3.0 |
| autocommand | 2.2.2 |
| awswrangler | 3.11.0 |
| backports.tarfile | 1.2.0 |
| beautifulsoup4 | 4.12.3 |
| certifi | 2024.12.14 |
| charset-normalizer | 3.4.1 |
| et_xmlfile | 2.0.0 |
| frozenlist | 1.5.0 |
| gremlinpython | 3.7.3 |
| idna | 3.10 |
| importlib_metadata | 8.0.0 |
| inflect | 7.3.1 |
| isodate | 0.7.2 |
| jaraco.collections | 5.1.0 |
| jaraco.context | 5.3.0 |
| jaraco.functools | 4.0.1 |
| jaraco.text | 3.12.1 |
| jmespath | 1.0.1 |
| jsonpath-ng | 1.7.0 |
| lxml | 5.3.0 |
| more-itertools | 10.3.0 |
| multidict | 6.1.0 |
| nest-asyncio | 1.6.0 |
| numpy | 2.2.1 |
| openpyxl | 3.1.5 |
| opensearch-py | 2.8.0 |
| packaging | 24.2 |
| packaging | 24.2 |
| pandas | 2.2.3 |
| pg8000 | 1.31.2 |
| platformdirs | 4.2.2 |
| ply | 3.11 |
| propcache | 0.2.1 |
| pyarrow | 18.1.0 |
| python-dateutil | 2.9.0.post0 |
| pytz | 2024.2 |
| redshift-connector | 2.1.5 |
| requests | 2.32.3 |
| requests-aws4auth | 1.3.1 |
| scramp | 1.4.5 |
| setuptools | 75.8.0 |
| six | 1.17.0 |
| soupsieve | 2.6 |
| tomli | 2.0.1 |
| typeguard | 4.3.0 |
| typing_extensions | 4.12.2 |
| typing_extensions | 4.12.2 |
| tzdata | 2024.2 |
| wheel | 0.43.0 |
| yarl | 1.18.3 |
| zipp | 3.19.2 |

一覧取得には以下記事のスクリプトを利用させていただきました。

https://dev.classmethod.jp/articles/lambda-layer-awswrangler-module/

## おわりに

私自身、Pandas を Lambda で利用するにはレイヤーを自作しなければならないと思っていました。お客様向けの検証を行うにあたり、もっと楽な方法がないかな？と思って調べたところ、こんなに簡単になっていることに気付きました。知識アップデートって大事ですね。