Lambda エイリアス と API Gateway の連携について
概要
先日、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} // ここでも `:` を使用しているが、こっちはエラーにならない
参考文献
- https://docs.aws.amazon.com/cli/latest/reference/lambda/invoke.html
- https://dev.classmethod.jp/articles/version-management-with-api-gateway-and-lambda/
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/lambda/client/invoke.html
- https://docs.aws.amazon.com/cli/latest/reference/lambda/invoke.html
Discussion