LoginSignup
6
5

More than 1 year has passed since last update.

【備忘】Api Gatewayのステージ変数とLambdaのエイリアスが繋がることを理解する

Last updated at Posted at 2023-01-31

まえがき

Api GatewayとLambdaで構成されているサーバーレス環境の話。
Api Gatewayの複数のエンドポイントと同じLambda関数を紐付けることができます。
たとえばdev環境とprod環境があってLambda関数がひとつである場合、dev環境への変更がprod環境へも反映されることになります。
dev環境で行った変更をテストした上でprod環境へ反映させたい場合、Api Gatewayのステージ変数とLambdaのエイリアスが役に立ちます。
ネット上にやり方は書いてありましたが、図解が見つけられなかったため、ここに備忘として残したいと思います。
細かい設定値や設定方法はネット上に多く存在したため省きます。

図解

いきなり結論ですが、Api Gatewayのステージ変数とLambda関数のエイリアスのつながりは以下のようになります。
Lambda側ではエイリアス名を設定し、Api Gateway側ではステージ変数を設定することで、連携できるようになります。
image.png

ここでの設定値

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

新しいバージョンの作成

image.png

変更後($latest)のコード

Version 1Version 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エイリアスを作成しました。
image.png

Api Gateway

Api Gatewayの作成

Api Gatewayの作成は省きます。前回の記事で作成したものと同一なので、リンクを貼っておきます。
Pythonコードの中に記載されたHTMLテキストをブラウザで表示する(Api Gateway,Lambda)

Lambda関数をステージ変数を加えて指定

ここでのLambda関数名は「versionTestFunc」です。
ステージ変数を使用してLambda関数をバージョン指定で呼び出すには、[Lambda関数名]:${stageVariables.[ステージ変数]}という形で指定します。
※ここではversionTestFunc:${stageVariables.alias}
image.png

権限の付与

上でチェックマークをクリックすると、下記の画面が表示されます。権限を付与する必要があるため、コマンドが表示されています。
image.png
表示されているコマンドにおいて、[Lambda関数名]:${stageVariables.[ステージ変数]}[ステージ変数]の部分のみ、自分の環境に置き換えてaws cliで実行します。
今回はdevprodのふたつのステージ変数を使用しているため、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のデプロイ

devprodという名前でデプロイしました。
image.png
このままだとステージ変数を設定していないため、エンドポイントにアクセスすると下記のエラーが発生します。
image.png

ステージ変数の設定

devステージにはalias変数にdevという値を設定しました。
image.png

prodステージにはalias変数にprodという値を設定しました。
image.png

動作確認

devのエンドポイントにアクセスすると、$latestのLambda関数に紐付いているため、Version 2が返されました。
image.png

prodのエンドポイントにアクセスすると、v1のLambda関数に紐付いているため、Version 1が返されました。
image.png

さいごに

ステージ変数を使用してLambda関数をバージョン指定で呼び出すには、Api Gatewayで${stageVariables.[ステージ変数]}という形で指定する必要があることが、ポイントだと思いました。

参考サイト

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5