🎉

Lambda エイリアス と API Gateway の連携について

2023/09/10に公開

概要

先日、API Gateway から Lambdaを(エイリアスを指定しつつ)呼び出す方法について調査する機会がありました。

公式ドキュメントや 参考文献を読み、API Gateway のステージ変数を使用することは理解したのですが、これらがLambda関数のエイリアス機能とどのように連携しているのか、いまいちつかめませんでした。

他のAWS クライアントツールでのLambdaエイリアス指定方法から、API Gatewayのステージ変数とLambdaエイリアスの関連を探ってみました。

まとめ

API Gateway で Lambda関数のエイリアスを指定する場合、 SDKやCLIと同じように、以下のように指定するものと思われる。

<lambda関数名>:<エイリアス名>

:<エイリアス名>部分を設定するために、 ステージ変数を使用している。

つまり、API Gatewayの機能を使って、頑張って <lambda関数名>:<エイリアス名>という形へ組み立てているもの ... と思われる。

(「思われる」という表現が多いのは、公式ドキュメントに、仮説を確信できるような記述を発見できなかったため)

前提知識 : エイリアスを指定した Lambda 関数呼び出し

基本的には、以下のように記述することで、エイリアスを指定しつつLambda関数を呼び出すことが出来る。

<lambda関数名>:<エイリアス名>

SDKの場合

AWS SDKにて、エイリアスを指定しつつ Lambda関数を呼び出す場合、以下のように記述する。

<lambda関数名>:<エイリアス名>

以下はサンプルコード。

◆ Lambda dev エイリアス

export const handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('version 2'),
  };
  return response;
};

◆ Lambda prod エイリアス

export const handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('version 1'), // ここが違うだけ
  };
  return response;
};

◆呼び出し側

import boto3
import json

def main(function_name):
    client = boto3.client('lambda')
    response_str = client.invoke(
            FunctionName=function_name,
            InvocationType='RequestResponse'
            )['Payload'].read().decode('utf-8')

    return json.loads(response_str)['body']

# `alias-test` lambda関数の `dev` エイリアスを指定
# => "version 2" 
print(main('alias-test:dev'))

# `alias-test` lambda関数の `prod` エイリアスを指定
# => "version 1" 
print(main('alias-test:prod'))

CLIの場合

--function-name にて関数名を指定するときに、以下のようにエイリアス名を指定できる。

$ aws lambda invoke --function-name <lambda関数名>:<エイリアス名> <レスポンスの出力先>

API Gateway での Lambdaエイリアス指定方法

公式ドキュメントに記載の通り、ステージ変数を使用してエイリアスを指定する。

ステージ変数は、次の例に示すように、 Lambda 関数名またはバージョン/エイリアスの代わりに使用できます。

API Gateway 側の関数指定部分を以下のように設定したとする。

Lambda関数: samplefunction:${stageVariables.alias}

更に、ステージ変数 alias を以下のように定義したとする。

name : alias
value : prod

この時、関数名指定部分は、以下のように展開される。

Lambda関数: samplefunction:prod //${stageVariables.alias} => prod

この結果から、 API Gateway では、SDKやCLIと同じように <lambda関数名>:<エイリアス名>という形を組み立てているものと思われる。

余談

API Gateway の エイリアス名を指定する部分に、以下のように直接エイリアス名を指定したところ、「ARN形式が不正」といった旨のエラーが表示された。

Lambda関数: samplefunction:prod

恐らく、裏側では ARNを組み立てていると思われる。

ARNはキーワードを :で区切っている。
関数名部分に :を使用することで、 :の数が、 ARNが規定する :の数よりも多くなってしまい、状況エラーメッセージにつながったと思われる。

なら、以下のような API Gateway の ステージ変数指定部分はどう解釈するんだ?と疑問に思ったが、そこまでは分からなかった。

samplefunction:${stageVariables.alias} // ここでも `:` を使用しているが、こっちはエラーにならない

参考文献

Discussion