APIGatewayのステージごとにエイリアスで指定したLambdaを紐づけハンズオン


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

はじめに

API Gatewayのステージと、Lambdaにおけるバージョン及びエイリアスを利用した紐付けを調査した際の構築メモとなります。

参考:APIGateway+Lambdaによるアプリサーバをバージョン管理する

構成イメージ

APIGatewayのステージとLambdaのエイリアスを紐づける事で、呼び出すLambdaを変更する事でステージごとに挙動を変えることが可能となります。
そして、これが構築できることでLambda内のエイリアスの重みづけによる切り替えも可能になります(ここの記載は掲載してません)

ハンズオン

Lambdaの作成

Lambdaの画面から構築

Lambdaのコード修正

変化をわかりやすくするため『’Hello from Lambda version 1!』とコードを修正します

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda version 1!')
    }

バージョンを発行

バージョンの番号を入力

バージョン作成完了画面

※左上のパンクズリストから前のページに戻ることが可能です

バージョン作成後の画面

再度バージョンを確認すると、v1が登録されています

エイリアスの作成

エイリアスの設定

v1をエイリアスと紐付けます

エイリアス作成後の画面

再度バージョンが変わった事を確認するようにLambdaのコードを変更する

変化をわかりやすくするため『’Hello from Lambda version 2!』とコードを修正します

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda version 2!')
    }

最新デプロイバージョンのエイリアスを作成

先ほどとは異なりバージョンで指定するのではなく、$LATESTを選択してdevというエイリアスを作成します
※Lambdaの最新状態が反映されるエイリアスとなります

API Gatewayの作成

REST API で構築

API Gatewayの作成画面からREST APIを作成します

作成したAPIのリソースを設定する

作成したAPI Gatewayを選択して、左ペインのリソースをクリックして、アクションを押下、メソッドの作成で(今回の確認では)メソッドの作成で"GET"を選択する

LambdaとAPIGatewayを紐づける


※保存後表示される、Lambdaに対しての呼び出しを許可する事で、先ほど作成したLambdaに対してリソースベースのポリシーが付与される。
Lambda > 設定 > アクセス制限 > リソースベースポリシー でアタッチされていることが確認できる

【Lambdaでの画面】

左ペイン『リソース』で画面にある『統合リクエスト』を選択

統合リクエストの”Lambda関数”を修正

Lambda関数の末尾に:${stageVariables.alias}を追記する
これによりLambdaのエイリアス込みで呼び出すことが可能となる

追記した際に表示されるコマンドを、赤枠部分をステージ名に変更して、CLIでコマンドを叩く

末尾に追記することで、Lambdaをエイリアス込みで呼び出すことは可能となりましたが、権限がないため下記コマンドをターミナル又はプロンプトなどで入力する

※今回はLambdaで作成した”dev” と ”prod”で作成していきます(下記コマンドは例として”dev”のみなので、prodも入力ください。)
※この時点ではAPI Gatewayは”dev”も”prod”もステージは作成されていませんが、権限は作成可能です。

aws lambda add-permission   
--function-name "arn:aws:lambda:ap-northeast-1:XXXXXXXX:function:tetutetu-lambda:dev"   
--source-arn "arn:aws:execute-api:ap-northeast-1:XXXXXXXX:XXXXX/*/GET/"   
--principal apigateway.amazonaws.com   
--statement-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
--action lambda:InvokeFunction

APIのデプロイを選択

devステージ作成

ステージ変数の入力

左ペイン『ステージ』を選択して、『ステージ変数』画面で”alias”と”dev”を入力することで、Lambdaのエイリアスが紐づきます

ステージ画面上部の ”URLの呼び出し”をクリック

画面が表示される

devは最新バージョンが反映されるので下記画面が表示される

prodステージ作成

ステージ変数の入力する

誤ってdev(既に手順ではステージ変数が入力されているので間違えないかとは思いますが)のステージに入力すると画面表示は失敗しますので注意ください

ステージ画面上部の ”URLの呼び出し”をクリック

画面が表示される

prodはバージョン1が反映されるので下記画面が表示される

まとめ

この紐付けができることで、Lambdaでバージョン管理・エイリアスでの切り戻が可能となりました。
ターミナル画面で権限を追加させる部分ですが、Lambdaのエイリアスを見境なく(prod-2など)作成すると、その度にターミナルで権限を付与しないといけないので、そこいらは明確なルールでの運用が必要かと思いました。
次はAPI GatewayのCanaryとか使って同じことができないか調査したいと。

Last modified: 2022-07-09

Author