API Gateway のステージ変数で Lambda のエイリアスを切り替える方法 ── 1 つの API で dev と prod を分ける
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| Lambda 関数 | dva-stage-fn | Python 3.13。環境変数 BUILD = release-1.0。context.invoked_function_arn の末尾(エイリアス)、context.function_version、BUILD の値を JSON で返す | AWS Lambda で関数を作成しイベント駆動で実行する |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Lambda のバージョン | 1、2 | 本番用と開発用のスナップショット |
| Lambda のエイリアス | prod(→ 1)、dev(→ 2) | ステージから呼ぶ名前 |
| REST API | dva-stage-api | dev と prod で共通の API |
| ステージ | dev、prod | ステージ変数 lambdaAlias を持つ |
手順 1: バージョンとエイリアスを作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに Lambda と入力し、「Lambda」を選択して dva-stage-fn を開きます。
「バージョン」タブで「新しいバージョンを発行」をクリックし、説明に release-1.0 と入力して「発行」をクリックします。バージョン 1 ができます。
関数の画面に戻り、「設定」タブ →「環境変数」で「編集」をクリックし、BUILD の値を dev-2.0 に変えて保存します。もう一度「バージョン」タブで「新しいバージョンを発行」をクリックし、説明に dev-2.0 と入力して発行します。バージョン 2 ができます。
「エイリアス」タブで「エイリアスを作成」をクリックし、名前 prod・バージョン 1 で作成します。同じように、名前 dev・バージョン 2 のエイリアスを作成します。
手順 2: REST API を作り、統合先にステージ変数を使う
上部の検索バーに API Gateway と入力し、「API Gateway」を選択します。「API を作成」→「REST API」の「構築」をクリックし、「新しい API」で API 名に dva-stage-api と入力して「API を作成」をクリックします。
「リソースを作成」でリソース名 stage-info のリソースを作ります。/stage-info を選択して「メソッドを作成」をクリックし、以下を設定します。
- メソッドタイプ:
GET - 統合タイプ: 「Lambda 関数」
- Lambda プロキシ統合: オン(デフォルトはオフなので、トグルをオンにします)
- Lambda 関数:
arn:aws:lambda:ap-northeast-1:<アカウントID>:function:dva-stage-fn:${stageVariables.lambdaAlias}
Lambda 関数にステージ変数を入れると、入力欄の下に「Lambda 関数をステージ変数として定義しました」という警告が表示されます。「許可の追加コマンド」を開くと、API Gateway に呼び出しの許可を追加するための aws lambda add-permission のコマンドが確認できます。「メソッドを作成」をクリックします。
手順 3: エイリアスごとに呼び出しの許可を追加する
コンソール上部の CloudShell のアイコンから CloudShell を開き、表示されたコマンドの ${stageVariables.lambdaAlias} の部分を dev と prod に置き換えて、2 回実行します。<api-id> は API の一覧の「ID」で確認できます。
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
for ALIAS in dev prod; do
aws lambda add-permission \
--function-name "arn:aws:lambda:ap-northeast-1:$ACCOUNT:function:dva-stage-fn:$ALIAS" \
--source-arn "arn:aws:execute-api:ap-northeast-1:$ACCOUNT:<api-id>/*/GET/stage-info" \
--principal apigateway.amazonaws.com \
--statement-id "apigw-$ALIAS" \
--action lambda:InvokeFunction
done
手順 4: 2 つのステージにデプロイし、ステージ変数を設定する
API Gateway のコンソールに戻り、「API をデプロイ」をクリックします。ステージで「新しいステージ」を選び、ステージ名に dev と入力して「デプロイ」をクリックします。
dev ステージの画面で「ステージ変数」タブを選択し、「ステージ変数を管理」→「ステージ変数を追加」で、名前 lambdaAlias・値 dev を追加して保存します。
同じように「API をデプロイ」で新しいステージ prod にデプロイし、ステージ変数 lambdaAlias = prod を追加します。ステージ変数は保存してから反映されるまで少しかかるので、次の手順は 30 秒ほど待ってから試します(反映前に呼ぶと、エイリアスが空のまま関数名の検証エラーが返ります)。
手順 5: ステージごとに呼び出して確かめる
CloudShell で、2 つのステージの URL を呼び出します。
curl -s https://<api-id>.execute-api.ap-northeast-1.amazonaws.com/dev/stage-info; echo
curl -s https://<api-id>.execute-api.ap-northeast-1.amazonaws.com/prod/stage-info; echo
/dev は {"alias": "dev", "version": "2", "build": "dev-2.0", "stage": "dev"}、/prod は {"alias": "prod", "version": "1", "build": "release-1.0", "stage": "prod"} を返します。API は 1 つのまま、ステージ変数によって別のエイリアス・バージョンが呼ばれています。