Lambda Layer に紐づくLambdaを一覧で取得する

## 1. はじめに

Python のバージョンアップ対応などで Lambda レイヤーを整理する際、頭を悩ませるのが「どの Lambda が、どのレイヤーの、どのバージョンを実際に使っているのか？」という現状把握ではないでしょうか。

特に、CDK でデプロイされたレイヤーと手動作成のレイヤーが混在する環境において、「どの Lambda が、どのレイヤーの、どのバージョンを現在使用しているのか」を正確に把握するのは、AWS コンソール上での手作業では限界がありました。

Lambda レイヤーの一覧画面では最新バージョンは確認できても、古いバージョンを利用している Lambda 関数も存在する可能性があり、実際に各関数に紐付いているバージョンを一つ一つ追跡するのは時間と労力がかかりますし、ヒューマンエラーのリスクも伴います。

![Monosnap 9 | pillow_whitelist_demo | レイヤー | Lambda 2025-05-31 11-55-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524922/60cff7ba-8267-4de3-b52a-fe2623e3e0f5.png)

本記事では、この課題を解決するために、AWS CLI を活用して全ての Lambda 関数に紐づくレイヤーとそのバージョン情報を効率的かつ網羅的に取得する方法を具体的に紹介します。

## 2. 前提

本記事の手順は、以下の環境を前提としています。

aws コマンドが使用できること
AWS CLI 経由で Lambda と Lambda レイヤーの情報を取得する権限があること

## 3. 本題

AWS CLI を使用して、全ての Lambda 関数に紐づくレイヤーとそのバージョンを効率的に特定する方法を説明します。

### 3-1. Lambda レイヤーが存在することを確認する

このコマンドで、存在するすべてのレイヤー名やその最新バージョンの ARN などを確認できます。

```sh
# 作業用ディレクトリと環境名を定義
dir="lambda_layer"
stage="prod" # ご自身の環境に合わせて適宜変更してください
mkdir -p "./$dir/$stage/lambdas"

# Lambda Layer の一覧をJSON形式で取得
aws lambda list-layers > "./$dir/$stage/all_lambda_layers_list.json"
```

出力される Lambda レイヤーの情報は以下のような形です。

```json:all_lambda_layers_list.json
{
    "Layers": [
            {
            "LayerName": "sample_layer",
            "LayerArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:sample_layer",
            "LatestMatchingVersion": {
                "LayerVersionArn": "arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:sample_layer:9",
                "Version": 9,
                "Description": "sample_layer",
                "CreatedDate": "2025-05-31T12:25:43.753+0000",
                "CompatibleRuntimes": [
                    "python3.8"
                ]
            }
        },
        ...省略...
    ]
}
```

名前のみ取得できれば良い場合は以下のようにテキスト形式での出力も可能

```bash
# Lambda Layer の名前一覧をテキスト形式で取得
aws lambda list-layers --query "Layers[].LayerName" --output text > "./$dir/$stage/lambda_layer_names.txt"

# 出力結果
# sample_layer	sample_layer2	sample_layer3	...省略...
```

### 3-2. 各 Lambda 関数のレイヤー情報を取得する

次に、各 Lambda 関数がどのレイヤー（どのバージョンかを含む ARN）を使用しているかを取得します。
以下のシェルスクリプトを作成し、実行します。

```sh:get_function_configuration.sh
dir="lambda_layer"
stage="prod"

# Lambda関数の一覧を取得し、それぞれのLayer情報をテキストファイルに出力する
function_list=$(aws lambda list-functions --query "Functions[*].FunctionName" --output text)

for function_name in $function_list; do
  # 各Lambda関数の設定からレイヤー情報(ARN)をテキスト形式で取得
  aws lambda get-function-configuration --function-name "$function_name" --query "Layers[*].Arn" --output text > "./$dir/$stage/lambdas/${function_name}_layers.txt"
done
```

このスクリプトは、`./$dir/$stage/lambdas/` ディレクトリ以下に、各 Lambda 関数名のファイル（例: MyFunctionName_layers.txt）を作成し、その関数が使用しているレイヤーの ARN を記録します。レイヤーの ARN にはバージョン情報が含まれています。 (例: arn:aws:lambda:{region}:{account-id}:layer:{layer-name}:version)
レイヤーが紐づいていない場合は `None` が入っています。

### 3-3. 特定の Lambda レイヤーで使用されているバージョンを確認する

Lambda レイヤー名を指定して使用されているバージョンの一覧をテキストファイルに出力する。

```sh:
dir=("lambda_layer")
stage=("prod")
lambdaLayer=("sample_layer")
region=("us-west-2" "ap-northeast-1")

# 出力ファイル名を変更し、初期化します
output_file="./lambda_layer_version.txt"
: > "./$dir/$stage/$output_file"


# 指定された各レイヤー名に対してループ
for target_layer_name in "${lambdaLayer[@]}"; do
  echo $target_layer_name >> "./$dir/$stage/$output_file"
  # 指定された各リージョンに対してループ
  for target_region in "${region[@]}"; do
    echo $target_region >> "./$dir/$stage/$output_file"
    # 1. リージョン内の全Lambda関数名を取得
    #    --max-items で取得件数を調整可能 (多数ある場合、ページネーションが必要になることも)
    function_names=$(aws lambda list-functions --region "$target_region" --query "Functions[*].FunctionName" --output text)

    if [ -z "$function_names" ]; then
      echo " No Lambda functions found in region $target_region." | tee -a "./$dir/$stage/$output_file"
      continue # 次のリージョンへ
    fi

    found_in_region=false
    # 2. 各Lambda関数についてループ
    for function_name in $function_names; do
      # 3. 関数の設定情報を取得し、使用しているレイヤーのARNリストを取得
      #    ARNにはレイヤー名とバージョンが含まれます (例: arn:aws:lambda:region:account-id:layer:name:version)
      layer_arns_used_by_function=$(aws lambda get-function-configuration --function-name "$function_name" --region "$target_region" --query "Layers[*].Arn" --output text 2>/dev/null)

      # 4. 関数が使用している各レイヤーARNについてループ
      for layer_arn in $layer_arns_used_by_function; do
        # ARNからレイヤー名を抽出 (ARNの7番目の要素がレイヤー名)
        layer_name_from_arn=$(echo "$layer_arn" | cut -d':' -f7)

        # 5. 抽出したレイヤー名が対象のレイヤー名と一致するか確認
        if [ "$layer_name_from_arn" == "$target_layer_name" ]; then
          # 6. 一致した場合、関数名と、その関数が使用している対象レイヤーのARN（バージョン情報含む）を出力
          echo " Function: $function_name" | tee -a "./$dir/$stage/$output_file"
          echo " Uses Layer ARN: $layer_arn" | tee -a "./$dir/$stage/$output_file"
          found_in_region=true
        fi
      done
    done
    if [ "$found_in_region" = false ]; then
        echo " No functions found using layer '$target_layer_name' in region $target_region." | tee -a "./$dir/$stage/$output_file"
    fi
  done
done
```

出力結果は以下のとおりです。
関数ごとに指定のレイヤーのどのバージョンを使用しているかを確認することができます。

```
sample_layer
us-west-2
 No functions found using layer 'sample_layer' in region us-west-2.
ap-northeast-1
 Function: sample_lambda
 Uses Layer ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:sample_layer:4
 Function: sample_lambda_2
 Uses Layer ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:sample_layer:4
 Function: sample_lambda_3
 Uses Layer ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:layer:sample_layer:4
```

## 4. まとめ

本記事では、AWS CLI を活用して、これらの情報を効率的に収集し、一覧化する方法を紹介しました。

AWS Lambda のバージョンアップや棚卸しにおいて、多数の Lambda 関数がどのレイヤーのどのバージョンを使用しているかを把握するのは大変な作業です。特に、手動作成されたレイヤーと CDK などで管理されたレイヤーが混在している環境では、その複雑性が増します。

これらの手法により、手作業による確認の時間を大幅に削減し、Lambda レイヤーの整理やアップデート計画を進めることが可能になります。少しでも参考になれば幸いです。

## 5. 参考

https://qiita.com/N_H_tennis/items/d8bdf8e0310c53a2a9ba

https://docs.aws.amazon.com/cli/latest/reference/lambda/list-functions.html

https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function-configuration.html

https://docs.aws.amazon.com/cli/latest/reference/lambda/list-layers.html

https://docs.aws.amazon.com/cli/latest/reference/lambda/list-layer-versions.html