[アップデート] AWS Lambda関数の実行環境がどのAZで動作しているかを取得できるメタデータエンドポイントが追加されました

[アップデート] AWS Lambda関数の実行環境がどのAZで動作しているかを取得できるメタデータエンドポイントが追加されました

AWS Lambda関数内から、今回追加されたメタデータエンドポイントにHTTPリクエストを送れば、AZ IDを取得できます。
2026.03.20

はじめに

おのやんです。

AWS Lambdaで、関数の実行環境がどのAZで動作しているかを取得できるメタデータエンドポイントが追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/03/lambda-availability-zone-metadata/

これまでLambda関数では、自身がどのAZで実行されていたかを直接確認する方法がありませんでした。今回のアップデートにより、関数内からHTTPリクエスト1回でAZ IDを取得できます。

今回取得できるようになったのは、AZ名(ap-northeast-1a)ではなくAZ IDapne1-az1)の方です。AZ名は、裏側ではアカウントごとに異なる物理AZにマッピングされる場合がありますが、AZ IDは全AWSアカウントで同じ物理AZを指します。

EC2インスタンスでは、インスタンスメタデータサービスを使ってcurl http://169.254.169.254/latest/meta-data/placement/availability-zone-idのようにAZ IDを取得できます。ECSやEKSでもコンテナメタデータやNode Labelsから(変換は必要ですが)AZ情報を取得する手段がありました。

しかしLambda関数には、EC2のインスタンスメタデータサービスに相当する仕組みがなく、AZ情報を取得する公式な手段がありませんでした。日本語・英語ともに反映されていないのか、記事執筆時点のAWSホワイトペーパーに、Lambda関数のAZを推定するために以下のような手順が紹介されていました。

Lambda — アベイラビリティーゾーンは関数に直接公開されません。これを見つけるには、いくつかのステップを完了する必要があります。そのために、リクエスタの IP アドレスを返すプライベート API ゲートウェイ REST エンドポイントを構築する必要があります。これにより、関数が使用している Elastic Network Interface に割り当てられたプライベート IP が識別されます。

  • Lambda GetFunction API を呼び出して、関数の VPC ID を見つけます。
  • API Gateway サービスを呼び出して、関数の IP を取得します。
  • IP と VPC ID を使用して、関連するネットワークインターフェイスを見つけ、アベイラビリティーゾーンを抽出します

https://docs.aws.amazon.com/whitepapers/latest/advanced-multi-az-resilience-patterns/appendix-a-getting-the-availability-zone-id.html

それが、今回のアップデートによりAZ IDを直接取得できるようになっています。

具体的には、Lambda実行環境に新たに2つの環境変数が自動設定されています。

環境変数 概要
AWS_LAMBDA_METADATA_API メタデータサーバーのアドレス({ipv4}:{port}形式)
AWS_LAMBDA_METADATA_TOKEN 実行環境ごとに固有の認証トークン

このようなHTTPリクエストでAZ IDを取得できます。

GET http://${AWS_LAMBDA_METADATA_API}/2026-01-15/metadata/execution-environment

https://docs.aws.amazon.com/lambda/latest/dg/configuration-metadata-endpoint.html

やってみた

ということで、実際にLambda関数を作成し、メタデータエンドポイントからAZ IDを取得してみます。

まずはLambda関数を作成します。このような感じで、メタデータエンドポイントにHTTPリクエストを送信してAZ IDを取得します。

import json
import os
import urllib.request

def handler(event, context):
    metadata_api = os.environ.get("AWS_LAMBDA_METADATA_API")
    metadata_token = os.environ.get("AWS_LAMBDA_METADATA_TOKEN")

    if not metadata_api or not metadata_token:
        return {
            "statusCode": 500,
            "body": json.dumps({"error": "Metadata environment variables not available"})
        }

    url = f"http://{metadata_api}/2026-01-15/metadata/execution-environment"
    req = urllib.request.Request(
        url,
        headers={"Authorization": f"Bearer {metadata_token}"}
    )

    with urllib.request.urlopen(req) as response:
        metadata = json.loads(response.read().decode())

    return {
        "statusCode": 200,
        "body": json.dumps({
            "availability_zone_id": metadata.get("AvailabilityZoneID"),
            "function_name": context.function_name,
            "request_id": context.aws_request_id
        })
    }

デプロイしたLambda関数を実行したら、このようにAZ IDが返ってきました。availability_zone_idapne1-az1のようなAZ IDが返されていることを確認できます。

Lambdaのレスポンスに、AZ IDが表示されている様子

{
  "statusCode": 200,
  "body": "{\"availability_zone_id\": \"apne1-az1\", \"function_name\": \"aws-test-func-lambda-az-metadata\", \"request_id\": \"edfd209a-b926-4bff-a77e-8d75637c3225\"}"
}

数分後に再びLambdaを起動すると、別のAZ ID(apne1-az2)が記録されていました。

数分後に再びLambdaを起動すると、別のAZ IDが返ってきた

{
  "statusCode": 200,
  "body": "{\"availability_zone_id\": \"apne1-az2\", \"function_name\": \"aws-test-func-lambda-az-metadata\", \"request_id\": \"033cf4b2-d7ad-4816-a471-3c1c06fee826\"}"
}

Lambdaでは、コールドスタート時には実行環境を作成する物理AZが自動的に決定されます。この動きが、今回のメタデータエンドポイント追加で確認できたという形ですね。

Lambda は、複数のアベイラビリティーゾーンで関数を実行し、1 つのゾーンでサービスの中断が発生した場合にも、関数をイベントの処理に使用できることを保証します。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/security-resilience.html

AWS CLI経由でLambda関数を複数回実行して、異なる物理AZに配置されるか確認します。

for i in $(seq 1 10); do
  aws lambda invoke \
    --function-name "aws-test-func-lambda-az-metadata" \
    --region ap-northeast-1 \
    --payload '{}' \
    /dev/stdout 2>/dev/null | jq -r '.body' | jq -r '.availability_zone_id'
done

同じAZ IDが返りました。同一の実行環境が再利用されていますね(nullは、関数のレスポンスとinvokeのメタデータのうち、'.body'のないinvokeメタデータがjqに引っ掛からなかったための出力です)。

apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null
apne1-az2
null

まとめ

これまでLambda関数のAZ情報を取得するには、VPC接続や複数のAPI呼び出し、追加インフラという複雑な手順が必要でした。今回のアップデートにより、VPCの有無にかかわらず、HTTPリクエストでAZ IDを取得できるようになりました。

LambdaをAZ単位で監視したり、AZ障害テストを実施するなどのケースで役に立ちそうですね。では!

この記事をシェアする

FacebookHatena blogX

関連記事