まえがき
Api GatewayとLambdaで構成されているサーバーレス環境の話。
Api Gatewayの複数のエンドポイントと同じLambda関数を紐付けることができます。
たとえばdev環境とprod環境があってLambda関数がひとつである場合、dev環境への変更がprod環境へも反映されることになります。
dev環境で行った変更をテストした上でprod環境へ反映させたい場合、Api Gatewayのステージ変数とLambdaのエイリアスが役に立ちます。
ネット上にやり方は書いてありましたが、図解が見つけられなかったため、ここに備忘として残したいと思います。
細かい設定値や設定方法はネット上に多く存在したため省きます。
図解
いきなり結論ですが、Api Gatewayのステージ変数とLambda関数のエイリアスのつながりは以下のようになります。
Lambda側ではエイリアス名を設定し、Api Gateway側ではステージ変数を設定することで、連携できるようになります。
ここでの設定値
Lambda
変更前(v1)のコード
import base64
def lambda_handler(event, context):
str_html = '''
<!DOCTYPE html>
<html lang="ja">
<head>
<title>Version Test</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>Version 1</h1>
</body>
</html>'''
bytes_html = bytes(str_html, 'utf-8')
result = base64.b64encode(bytes_html)
return result
新しいバージョンの作成
変更後($latest)のコード
Version 1
をVersion 2
に変えただけです。
import base64
def lambda_handler(event, context):
str_html = '''
<!DOCTYPE html>
<html lang="ja">
<head>
<title>Version Test</title>
<meta charset="utf-8"/>
</head>
<body>
<h1>Version 2</h1>
</body>
</html>'''
bytes_html = bytes(str_html, 'utf-8')
result = base64.b64encode(bytes_html)
return result
エイリアスの作成
$latest
バージョンに紐づくdev
エイリアスと、v1
バージョンに紐づくprod
エイリアスを作成しました。
Api Gateway
Api Gatewayの作成
Api Gatewayの作成は省きます。前回の記事で作成したものと同一なので、リンクを貼っておきます。
Pythonコードの中に記載されたHTMLテキストをブラウザで表示する(Api Gateway,Lambda)
Lambda関数をステージ変数を加えて指定
ここでのLambda関数名は「versionTestFunc」です。
ステージ変数を使用してLambda関数をバージョン指定で呼び出すには、[Lambda関数名]:${stageVariables.[ステージ変数]}
という形で指定します。
※ここではversionTestFunc:${stageVariables.alias}
権限の付与
上でチェックマークをクリックすると、下記の画面が表示されます。権限を付与する必要があるため、コマンドが表示されています。
表示されているコマンドにおいて、[Lambda関数名]:${stageVariables.[ステージ変数]}
の[ステージ変数]
の部分のみ、自分の環境に置き換えてaws cliで実行します。
今回はdev
とprod
のふたつのステージ変数を使用しているため、2回コマンドを実行しました。
% aws lambda add-permission --function-name "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:versionTestFunc:dev" --source-arn "arn:aws:execute-api:us-east-1:XXXXXXXXXXXX:xxxxxxxxxx/*/GET/" --principal apigateway.amazonaws.com --statement-id 868420a5-d63c-497c-a54d-1c68f0e2030d --action lambda:InvokeFunction
{
"Statement": "{\"Sid\":\"868420a5-d63c-497c-a54d-1c68f0e2030d\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:versionTestFunc:dev\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-1:XXXXXXXXXXXX:xxxxxxxxxx/*/GET/\"}}}"
}
% aws lambda add-permission --function-name "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:versionTestFunc:prod" --source-arn "arn:aws:execute-api:us-east-1:XXXXXXXXXXXX:xxxxxxxxxx/*/GET/" --principal apigateway.amazonaws.com --statement-id 868420a5-d63c-497c-a54d-1c68f0e2030d --action lambda:InvokeFunction
{
"Statement": "{\"Sid\":\"868420a5-d63c-497c-a54d-1c68f0e2030d\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:versionTestFunc:prod\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-1:XXXXXXXXXXXX:xxxxxxxxxx/*/GET/\"}}}"
}
Apiのデプロイ
dev
とprod
という名前でデプロイしました。
このままだとステージ変数を設定していないため、エンドポイントにアクセスすると下記のエラーが発生します。
ステージ変数の設定
devステージにはalias
変数にdev
という値を設定しました。
prodステージにはalias
変数にprod
という値を設定しました。
動作確認
devのエンドポイントにアクセスすると、$latest
のLambda関数に紐付いているため、Version 2が返されました。
prodのエンドポイントにアクセスすると、v1
のLambda関数に紐付いているため、Version 1が返されました。
さいごに
ステージ変数を使用してLambda関数をバージョン指定で呼び出すには、Api Gatewayで${stageVariables.[ステージ変数]}
という形で指定する必要があることが、ポイントだと思いました。
参考サイト