Serverless Operations, inc

>_cd /blog/id_9e6of5401tzk

title

AWS LambdaがAvailability Zone metadataをサポートしました

2026年3月19日、AWSはAWS LambdaがアベイラビリティゾーンID(AZ ID)を取得できる新機能をリリースしました。

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

これまでLambdaは複数のAZに自動分散されて実行されるものの、関数自身がどのAZで動作しているかを知る手段がありませんでした。今回のアップデートにより、実行環境内のメタデータエンドポイントにHTTPリクエストを送るだけで、apne1-az1 のようなAZ IDを簡単に取得できるようになりました。

どういうときに使うか

まず今回のアップデートでは起動したLambda関数がどのAZで起動しているかを内部のメタデータとして取得することができます。どのAZでLambda関数を起動させるか?を指定するものではないことに注意してください。

ではどういうときに使うかと言えばクロスAZでの通信遅延を発生させないケースが考えられます。例えばElastiCacheやAmazon RDSなど、AZごとにエンドポイントを持つサービスに対して、Lambdaと同じAZのエンドポイントを選んで接続することで、クロスAZ通信によるレイテンシの増加やデータ転送コストを削減できます。

この機能はカスタムランタイムやコンテナイメージを含むすべてのLambdaランタイムで利用可能で、SnapStartやプロビジョニング済み同時実行にも対応しています。追加料金は不要で、Lambdaが提供されているすべての商用AWSリージョンで利用できます。

さっそくやってみる

一般的にはメタデータの呼び出しは [Powertools for AWS Lambda] を使います.

// npm install @aws-lambda-powertools/commons
import { getMetadata } from '@aws-lambda-powertools/commons/utils/metadata';

// モジュールレベルでキャッシュ(コールドスタート時に1回だけ取得)
const metadata = await getMetadata();

export const handler = async (event) => {
  const azId = metadata.AvailabilityZoneID; // e.g., "use1-az1"

  console.log(`Running in AZ: ${azId}`);

  return {
    statusCode: 200,
    body: JSON.stringify({ az_id: azId }),
  };
};

ただしこの場合パッケージをインストールしないといけないため、AWSのマネージメントコンソールからカジュアルにテストするには以下を使います。

let cachedAzId = null;

const getAzId = async () => {
  if (cachedAzId) return cachedAzId;

  const endpoint = `http://${process.env.AWS_LAMBDA_METADATA_API}/2026-01-15/metadata/execution-environment`;
  const token = process.env.AWS_LAMBDA_METADATA_TOKEN;

  const res = await fetch(endpoint, {
    headers: { Authorization: `Bearer ${token}` },
  });

  if (!res.ok) throw new Error(`Metadata fetch failed: ${res.status}`);

  const { AvailabilityZoneID } = await res.json();
  cachedAzId = AvailabilityZoneID;
  return cachedAzId;
};

export const handler = async (event) => {
  const azId = await getAzId();
  console.log(`Running in AZ: ${azId}`);
  return {
    statusCode: 200,
    body: JSON.stringify({ az_id: azId }),
  };
};

実行結果は以下の様になります。

{
  "statusCode": 200,
  "body": "{\"az_id\":\"apne1-az4\"}"
}

azId の値に応じて接続先を切り替えるよう実行すればクロスAZの通信をなくすことができます。

注意点:

この関数の初回実行時にメタデータの呼び出しを行うためコールドスタート時には`1500ms`以上のレイテンシが発生します。2回目以降のウォームスタートではメタデータの呼び出しは行われないため高速に動作しますが設計上注意が必要です。

Written by
編集部

亀田 治伸

Kameda Harunobu

  • Facebook->
  • X->
  • GitHub->

Share

Facebook->X->
Back
to list
<-