API Gateway – Lambda 構成のバージョン管理について教えてください

2021.10.23

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

困っていた内容

API Gateway のトリガーに Lambda 関数を設定した構成でバージョン管理を行いたいです。

現在は Lambda のエイリアス、バージョンともに発行していない状態です。

API Gateway / Lambda のバージョン管理について教えてください。
また、バージョン変更後のコードに不具合があった場合に戻す方法も教えてください。

API Gateway、 Lambda 関数のバージョン管理について

API Gateway と Lambda 関数のバージョンは別々に管理されています。
両方のサービスに 2 つのバージョンに関するキーワードがあります。

API Gateway、Lambda のバージョンに関するキーワード

API Gateway

  • デプロイ
  • ステージ

Lambda 関数

  • バージョン
  • エイリアス

それぞれ簡単に説明すると以下の通りです。

API Gateway - デプロイ

デプロイは API Gateway の変更の単位です。

API Gateway の変更を反映するにはデプロイが必要になります。 API Gateway の設定を変更したにもかかわらず、反映されていないように見える場合は未デプロイ状態である可能性が高いです。

デプロイにはステージ名の指定が必要ですが、デプロイ時に新しいステージを作ることもできます。
デプロイにはオプションで説明が追加できます。

API Gateway - ステージ

ステージはデプロイに対する名前付きのリファレンスであり、API のスナップショットです。

API Gateway エンドポイント URL の末尾はステージ名が入ります。

ステージ名を「v1」にした場合のエンドポイント例
https://abcde12345.execute-api.ap-northeast-1.amazonaws.com/v1

ステージにはスロットリングや環境変数など多くの設定ができます。

同じステージ名に対してデプロイを繰り返すことができます。
ステージ毎にどのデプロイバージョンで応答するか設定でき、作成後の変更もできます。

Lambda 関数 - バージョン

特定時点の設定などを含む関数の状態を保存するのが Lambda 関数のバージョンです。

Lambda 関数も API Gateway と同様に、変更を反映するにはデプロイが必要になります。
まだデプロイを行っていない変更中のコードは、未公開バージョンとなります。

過去のバージョンの Lambda 関数コードはほとんどの設定がロックされます。
そのため、あらかじめ Lambda によって用意された$LATEST(サービスで予約されたバージョン)を対象に変更を加えます。

Lambda 関数を呼び出す際に明示的にバージョンを指定しなければ暗黙的に$LATESTが実行されますので、バージョンを意識しない場合は常に$LATESTを更新し、実行することになります。

バージョンは「発行」と「削除」しかできず、発行時に付けられる説明もオプションとなっており、設定自体は非常にシンプルです。
バージョン名は自動で数字の連番(1, 2, 3...)になります。

Lambda 関数 - エイリアス

Lambda 関数のエイリアスは特定の関数バージョンを指すポインタのようなものです。

エイリアスは名前、説明(オプション)、バージョン($LATESTも可)が指定できます。
バージョンは 2 つまで指定でき、加重エイリアスによって重み付けします。(バージョン「1」: 50%、バージョン「2」: 50% など)

エイリアス毎にどの関数バージョンを実行するか設定でき、作成後の変更もできます。

バージョン変更後に不具合があった場合に戻す方法

前提として、下記ブログのように API Gateway の統合リクエストで Lambda 関数のエイリアスを含む設定が正しく行われているものとします。

上述のとおり、Lambda 関数のエイリアスで実行コードのバージョンが設定されています。

エイリアスで指定したバージョンを変更すると実行される Lambda 関数コードも変更されますので、エイリアスの編集から正常に動作したバージョンへ戻してください。

エイリアス test が指すバージョン「3」で問題のある関数コードであり、バージョン「2」へ戻す例

運用観点でのワンポイント

Lambda 関数を CloudFormation(SAM)や Terraform などのコードで管理している場合、Lambda 関数のバージョンは使わずに、Lambda 関数を古いコードで作り直します。

その場合、基本的にはテンプレートのバージョンが Git などで管理されているはずです。
Git のバージョンを戻してリモートリポジトリへ push すれば CI/CD で古い Lambda の環境が作り直されます。(CI/CD がなければ手動デプロイが必要)

Lambda 関数のバージョンが見当たらないときは、どのようにコードを管理しているか調べると解決に繋がるかもしれません。

参考資料