LoginSignup
1
0

API Gateway Lambdaプロキシ統合を有効にしてエイリアスごとに通信する方法

Posted at

はじめに

Lambdaプロキシ統合が以下の資料だとオフの状態の資料しかないので、Lambdaプロキシ統合をオンにした状態でもうまくいくのかについて確認します。

c. [Lambda プロキシ統合] はオフのままにしておきます。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/amazon-api-gateway-using-stage-variables.html

アーキテクチャ

今回のシナリオとして、あるAPIを公開中であり、Version2のbeta版の検証も実施するという想定になります。
バージョンについては、

  • v1というAPIバージョンを現行版として公開中。
  • v2betaを現在開発中でプレリリース版として公開中。

というシナリオで開発をすすめるという想定とします。

image.png

セットアップ

API Gateway

リソース

以下のように、① Lambda プロキシ統合をTrue に設定し、② Lambda関数を関数名:${stageVariables.ステージ変数}に設定する必要があります。
上記のステージ変数部分は各ステージの「ステージ変数」で定義します。(詳細は後ほど。)
今回はAliasというステージ変数を定義しますので${stageVariables.Alias}となります。

image.png

ステージ

ステージをv1、v2betaといったバージョンごとに作成します。
ステージ変数をAliasとして、各ステージごとにバージョンの値を入力します。
v1の結果は以下の通りとなりますのでv2betaも同様の手順で作成します。

image.png

ステージ変数による具体的な設定内容は以下の通り。
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/aws-api-gateway-stage-variables-reference.html

カスタムドメイン名

設定する必要はないですが、カスタムドメイン名もついでに設定。
URIは以下のようにhttps://example.com/<バージョン>/<リソース名>とします。
image.png

Lambda

エイリアス

エイリアス名はAPI Gatewayのステージ変数で定義した値と同じエイリアス名を作成することで以下のがぞうのようになります。

v1は明示的にバージョンを指定し、v2betaは$Latestを定義します。
image.png

バージョン

バージョンは以下の通り。
image.png

以下はバージョンごとのLambdaになります。
v1のコードでは「prd」と出力されるだけの結果になります。

lambda_function.py
# version 1
import json

import logging

logger = logging.getLogger()
logger.setLevel("INFO")

def lambda_handler(event, context):

    return {
        'statusCode': 200,
        'body': json.dumps('prd')
    }

v2のコードでは「latest」と出力されるだけの結果になります。

lambda_function.py
# version 1
import json

import logging

logger = logging.getLogger()
logger.setLevel("INFO")

def lambda_handler(event, context):

    return {
        'statusCode': 200,
        'body': json.dumps('latest')
    }

パーミッション

API Gatewayのコンソール上で、[API名 > リソース > 統合リクエストを編集]上で関数を入力すると、Lambdaパーミッションを追加する以下のようなコマンドが出力されます。
image.png

上記のコマンドをLambdaのエイリアス分だけ実行します。今回はv1, v2betaとLambdaエイリアスを作成したので以下のコマンドをそれぞれ実行します。

# v1
aws lambda add-permission \
--function-name "arn:aws:lambda:<リージョン>:<アカウントID>:function:<関数名>:v1" \
--source-arn "arn:aws:execute-api:<リージョン>:<アカウントID>:<API ID>/*/GET/demo_momento" \
--principal apigateway.amazonaws.com \
--statement-id <任意の文字列> \
--action lambda:InvokeFunction

# v2beta

aws lambda add-permission \
--function-name "arn:aws:lambda:<リージョン>:<アカウントID>:function:<関数名>:v2beta" \
--source-arn "arn:aws:execute-api:<リージョン>:<アカウントID>:<API ID>/*/GET/demo_momento" \
--principal apigateway.amazonaws.com \
--statement-id <任意の文字列> \
--action lambda:InvokeFunction

上記のコマンドを実行し、Lambdaコンソールから [エイリアス > トリガー]と遷移することでトリガーが作成されていることが確認できます。
設定すると何故かエラーが発生していますが問題なく接続はできます。エラーはありますがひとまず無視で次に進みます。
image.png

** テスト
v1の結果は以下のようになります。
Lambdaもv1エイリアスの値が反映されていることがわかります。
image.png

v2betaの結果は以下のようになります。
v2betaのエイリアスの値が反映されていることがわかります。

image.png

各エイリアスごとにAPIコールをすることは成功です。

終わりに

以上のようにLambda プロキシ統合を有効にしている場合でも、各エイリアスごとにAPIコールすることができました。

とはいえ、エラーの画面が出ているのはこれは如何に、、
(ステージ変数として機能していない?)
image.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0