AWSサーバレス商用構築 本番・開発環境切替方法


AWS API Gateway + Lambda + DynamoDBでWebAPIを構築する際に、本番環境と開発環境をどのようにして分けるのが良いのか調べてみた。

やらないといけない事をざっと整理すると以下となる。
詳細は後述。

①DynamoDBのテーブルをprod/devでそれぞれ同じもの作成する
②API Gatewayの各ステージ(prod/dev)のステージ変数にaliasを追加する
③API GatewayメソッドターゲットのLambda関数にalias値を付与する
④Lambda関数にprod/devのaliasを付ける
⑤API GatewayからLambda関数へ渡されるeventからstageVariablesが取得できるのでprod/devを判定して接続先のTableを切り替える

DynamoDB

①の部分。
単純にprod/dev用にそれぞれ同じテーブルを作るだけ。これ以外に良い方法があれば教えてほしい。

API Gateway

②の部分。
まず、APIをprod / devのように2つのステージにデプロイする。
そうすることで、ステージメニューのステージ変数タブで、ステージ固有の変数を設定できる。
これは、このままLambda関数にも渡されるので、以下のようにステージ変数を設定することで、Lambda側でどちらのAPIが使用されたかが判定できるようになる。

画像1

③の部分。
このステージ変数はAPI Gatewayでも使用でき、リソースメニューの統合リクエストカードで設定できるLambda関数名を以下のように設定することで、④で設定するLambda側のaliasのバージョンが呼び出されるようになる。

(Lambda関数名):${stageVariables.alias}

画像2

Lambda関数

④の部分。
まず、本番環境で使用する関数コードにバージョンを付ける。

アクション→新しいバージョンの発行

エイリアス prodを作成し、↑で付けたバージョンを設定する。

アクション→新しいエイリアスの作成

これで、prodステージのURLでは、LATESTではなくprodエイリアスを付けたバージョンのLambda関数が呼び出されるので、LATESTの変更が本番運用に影響しないようになる。

続いて⑤の部分。
prod/devによるDynamoDBの切り替えはコードで行う。
以下のようにeventからAPI Gatewayで設定したステージ変数が取得できるので、①で作成したテーブルの切り替えを行う。

def lambda_handler(event, context):
   variables = event['stageVariables']
   if variables is not None and 'alias' in variables:
       alias = variables['alias']
       if alias == 'prod':
           # prodのテーブルを使用する

実際にはhandlerではなくレイヤーに共通クラスとして置いておくのが良いだろう。

この記事が気に入ったらサポートをしてみませんか?