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


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
prod 1

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

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

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

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

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

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

対象ステージ ステージ変数名 ステージ変数の値
dev alias dev
prod alias prod

テスト

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

以上