AWS公式Lambda Layerの中身を調べる

# はじめに

[Lambda Layer](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html) を使えば、異なるLambda関数で機能を共有したり、依存関係を分離してパッケージの運用性、保守性を高めたりできます。AWS公式からも AWSLambdaPowertools など便利なLambda Layerがいくつか提供されており、使用されている方も多いでしょう。

しかしながら、外部から提供されるLambda Layerの中身がどうなっているのか、何が含まれているのか気になることはないでしょうか? 本稿では、Lambda Layerの内容を簡単に調べる方法を紹介します。また、Layerを自作するにあたり、LayerパッケージングのベストプラクティスをAWS公式の実例から学ぶこともできます。

# Lambda Layerの実体を取得する

Lambda Layerはzipパッケージとして提供されます。そのzipファイルを取得することで内容を分析できます。

AWS CLIの `aws lambda get-layer-version-by-arn` を使えば、LayerのARNを指定して、zipファイルのURLを取得できます。以下は、Python向けのAWSLambdaPowertoolsの情報を取得した例です。レスポンスの `Content.Location` の値がzipファイルのURLです。このURLにブラウザやcurlでアクセスすればLayerのzipファイルをローカルにダウンロードして分析できます。

```console
$ aws lambda get-layer-version-by-arn --arn arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:12
{
    "Content": {
        "Location": "https://awslambda-ap-ne-3-layers.s3.ap-northeast-3.amazonaws.com/snapshots/017000801446/AWSLambdaPowertoolsPythonV3-python313-arm64-8abd5289-dad0-4412-8da9-ebf201a57c02?versionId=c3qevbjVT3id8YZX7uWDp8Nkw7ZSeFui&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEH4aDmFwLW5vcnRoZWFzdC0zIkgwRgIhAIyeDfcFwpNJosjgzqCn8K70Z8FdYPNKaNRLg8%2BT%2FBPgAiEAyrJcY9zL7uMbeEdPxrtWhPWxL0NKOfEDPqACswjT814qwAUINxACGgw5MjI5OTIxNTgxNzQiDDVK5v7GL1qh2R2bYiqdBRYi1hid3zpA5VxAv34IOTJRFwirx4FtCvK9%2FEeLHZdgH2CuhAfVlaVwNGPg6WFdn8FG%2BrKQTOn4ajGLlx7EQ5inxHSbB7Gz5RZ3wdYy3Cjvtze09GZcHBsMUlv4HnXQ%2B%2FXcDDQ0Fgh%2Fn8TT43DwrpkilZnRa%2FrjomE91MQ056Nyz366Dwfi%2Bqo2ZTAyI2vkqpw2bBaXaMOYv%2F0got6pZWThx1x4FIG4S7ABchKJwi9gEieqhYcrU6cNtmJLcwYlGzXe0tuFcDl5A3ErjaQZ4UjwxT56N8uSztDgjWKV4z3TzcwTVPjbjcyCXZKD3hnyegWNmdr44pFszbTFBAyiOgxlV3luScH9PnUa%2FBYRHVZJw7RT8kDY0njR8uKFagg%2BOTEckFEeZ3M5qPl8HOqqpyKXJKGLrDDzLSpXvtlZgI88KgDoxJX8S2ix1eW%2BxidCdO%2B3532Kc1BCe8Ur2K%2BlPZUUlPnFUIRuTHZjrLnn9KZ6eWQkrfjSvo570tIxitjjSC8Q3O5WVwmsDQJUeEYcjC87LLvCEkiXEzV3ml%2FABmViA1DPet7%2Ftmgry5aIXP6kAOOImwMG6h5MwC6bILnyQ3JIE5aghUrzU26WVmImh9m2QtkY9SYp9OhEnzvWLhU1hZFcng4e3VolDK7BIZhMf01jjwYMjPJuZ7FgpQDRnlNWULSyy2qQ%2Bnet5a5M3uJ9oUyuBDfE1IMAaBQ5bsyUIeYq1OSEhaKqMIVjWjon1XaNEDTmlFDitMlMKQ%2FuhZgDR6Mv9W5A5pcqqjqxR84HPKY4sjgc7XBSubdnJ5aVTKKzLwr7CWpVOHiZO7Hix3GLq6lkW%2B0xu%2BQAP2PGWBAYoA%2FaHujeDzgcrtdj4tV5A8v%2FfuiQhysaLqa5e4p%2FqjC11pnBBjqwAY1BYn3xTge7st3FOY8qDqXd4yuhp7kmE87JoyxsDHbiHmTXxbwquq%2By5pmXHapL3UdI11kwNIcg2%2BIFQAsATwOFjuF3GAYmEutzUvfBQArnAZ6HIX%2Bop3jj9OvEDgdnvgnAMxuAmg9nAd%2BAx%2Bxf2q4CT3JTB4VSoDjnHQre5SXTyMIwlGpaZdRtYNYlGTr6bxmM9jm%2FEYPYcMRAbMdarNLMFwDtwZPlkp97aVQOGrS6&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250515T231516Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=ASIA5NZU6UXPNPPFTUB4%2F20250515%2Fap-northeast-3%2Fs3%2Faws4_request&X-Amz-Signature=f76cc204c30822730e19d87357f1a43fb241fbeae02acee6cd74baa733d45f5b",
        "CodeSha256": "iLhlWJUv6DTx7S1utiWG9BGgbTZ5pBJZJHqbmrreq2k=",
        "CodeSize": 8255798
    },
    "LayerArn": "arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64",
    "LayerVersionArn": "arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:12",
    "Description": "Powertools for AWS Lambda (Python) V3 [arm64 - Python 3.13] with extra dependencies version 3.10.0",
    "CreatedDate": "2025-04-08T12:03:38.304+0000",
    "Version": 12,
    "CompatibleRuntimes": [
        "python3.13"
    ],
    "LicenseInfo": "MIT-0",
    "CompatibleArchitectures": [
        "arm64"
    ]
}
```

以下は、Layerのzipをダウンロードして、ファイル一覧を表示する例です。もちろん一覧だけでなくファイル一つ一つの内容を精査することもできます。

```console
$ aws lambda get-layer-version-by-arn \
  --arn arn:aws:lambda:ap-northeast-3:017000801446:layer:AWSLambdaPowertoolsPythonV3-python313-arm64:12 \
  --output text \
  --query 'Content.Location' \
  | xargs curl -o layer.zip

$ zip -l layer.zip
Archive:  layer.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
   172141  1980-01-01 00:00   python/typing_extensions.py
   341832  1980-01-01 00:00   python/_cffi_backend.cpython-313-aarch64-linux-gnu.so
        6  1980-01-01 00:00   python/wrapt-1.17.2.dist-info/top_level.txt
      153  1980-01-01 00:00   python/wrapt-1.17.2.dist-info/WHEEL
     1557  1980-01-01 00:00   python/wrapt-1.17.2.dist-info/RECORD
     6351  1980-01-01 00:00   python/wrapt-1.17.2.dist-info/METADATA
     1304  1980-01-01 00:00   python/wrapt-1.17.2.dist-info/LICENSE
        4  1980-01-01 00:00   python/wrapt-1.17.2.dist-info/INSTALLER
    28687  1980-01-01 00:00   python/wrapt/wrappers.py
     3881  1980-01-01 00:00   python/wrapt/weakrefs.py
     5204  1980-01-01 00:00   python/wrapt/patches.py
    10997  1980-01-01 00:00   python/wrapt/importer.py
(...中略...)
    11281  1980-01-01 00:00   python/attr/__init__.pyi
     2057  1980-01-01 00:00   python/attr/__init__.py
       87  1980-01-01 00:00   python/annotated_types-0.7.0.dist-info/WHEEL
      802  1980-01-01 00:00   python/annotated_types-0.7.0.dist-info/RECORD
    15046  1980-01-01 00:00   python/annotated_types-0.7.0.dist-info/METADATA
        4  1980-01-01 00:00   python/annotated_types-0.7.0.dist-info/INSTALLER
     1083  1980-01-01 00:00   python/annotated_types-0.7.0.dist-info/licenses/LICENSE
     6421  1980-01-01 00:00   python/annotated_types/test_cases.py
        0  1980-01-01 00:00   python/annotated_types/py.typed
    13819  1980-01-01 00:00   python/annotated_types/__init__.py
---------                     -------
 21196672                     867 files
```

# ARNの取得方法

上記の方法は、LayerのARNが必要です。ARNを特定するには、ダミーのLambda関数等に調査したいLayerを追加してみてください。Layer一覧にARNが表示されます。

![追加したLamda Layer一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31469/6ad9f9bc-7044-4399-aeeb-19b86b635cd9.png)


実際にLayerを追加せずにARNを特定したい場合は、Layerのプロジェクトサイトに記載されています(例: [AWSLambdaPowertools for PythonのARNリスト](https://docs.powertools.aws.dev/lambda/python/latest/#lambda-layer))。しかしながら、調べた限りでAWS公式の全Layerを網羅した信頼できるARN一覧情報は見つけられませんでした (もしご存じの方がいればコメント等でご教示いただけると幸いです)。

# まとめ

AWS CLIを用いてLambda Layer 実体のzipファイルを取得、分析する方法を紹介しました。AWS公式やサードパーティなど外部提供のLayerを調査する場合にご活用いただければと思います。