API Gateway+AWS Lambdaで開発・本番のバージョン管理

AWS

API Gatewayで本番・開発それぞれにエンドポイントを用意して
実行するAWS Lambda関数を切り替える方法です。

以下のように開発(dev)では常に最新バージョンを参照し、
本番(prod)では特定のバージョンを参照するような想定です。
https://xxx.execute-api.ap-northeast-1.amazonaws.com/prod/app/print
https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/app/print

サンプルAWS Lambda関数の作成

単純にバージョン番号を返すだけの関数を作成します。

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps("this function is version 1.")
    }

関数を作成しただけではバージョンは作成されないのでバージョンを発行します。
「バージョンタブ」 → 「新しいバージョンを発行」でバージョン1を発行します。
バージョン1のARNは以下のようになります。最後の「1」がバージョンです。
arn:aws:lambda:ap-northeast-1:xxx:function:funcname:1

AWS Lambdaのエイリアス作成

エイリアスを作成し、エンドポイントを切り替え可能にします。
devとprodの2つのエイリアスを作成し、バージョンを紐付けます。
devは最新バージョン、prodは「1」に紐付けます。

エイリアス名バージョン
dev$LATEST
prod1

API GatewayでAWS Lambdaエイリアスとの紐付け

Lambdaと関連付けているメソッドのページから「統合リクエスト」へ移動します。

「Lambda関数」の項目で鉛筆マークを押して編集します。
関数名の後ろに:${stageVariables.alias}を付けて保存します。
「stageVariables」はステージ変数となり、実際の設定はこの後に行います。

保存すると権限を追加するためのスクリプトが生成され、
ポップアップで表示されるのでスクリプトを控えておきます。

控えたスクリプトの中で${stageVariables.alias}の部分を
任意の値に置き換えてCLIで実行します。
今回の場合、dev, prodを用意するので、それぞれに置き換えて
2回CLIを実行します。

prodとdevのステージを作成し、デプロイを行います。
デプロイ後にステージ変数を追加します。
これで先程設定した${stageVariables.alias}の値が
設定した値で置き換わるようになります。

対象ステージステージ変数名ステージ変数の値
devaliasdev
prdaliasprod

テスト

Lambda関数の実装を以下のように更新してデプロイします。

import json

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': json.dumps("this function is version 2.")
    }

devとprodそれぞれのエンドポイントを叩いてレスポンスが変わることを確認。

curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/dev/app/print
curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/prod/app/print

参考

AWS Lambdaを新機能バージョニングとエイリアスでBlue-Green Deploymentする #reinvent

以上

タイトルとURLをコピーしました