API Gateway REST API を介してバックエンド Lambda 関数または HTTP エンドポイントにデータを渡すにはどうすればよいですか?

所要時間3分
0

Amazon API Gateway REST API で、バックエンド AWS Lambda 関数と HTTP エンドポイントにデータを渡したいです。どうすればそれができますか?

簡単な説明

データをバックエンド Lambda 関数に渡すように REST API を設定するには、Lambda カスタム統合を使用します。

クエリ文字列パラメータを HTTP エンドポイントに渡すには、HTTP カスタム統合を使用します。

重要: 入力データが統合リクエストペイロードとして提供されていることを確認してください。ベストプラクティスとして、マッピングテンプレートを使用してペイロードを提供することが推奨されます。詳細については、「メソッドリクエストデータを統合リクエストパラメータにマッピングする」を参照してください。

解決方法

API Gateway API からのカスタムヘッダーを処理する Lambda 関数を作成する

1.    Lambda コンソールを開きます。

2.    [Create function (関数を作成)] を選択します。[Create function (関数を作成)] ページが開き、選択した [ Author from scratch (最初から作成)] オプションが表示されます。

3.    [Basic information] (基本情報) ペインで、次の操作を行います。[Function name] (関数名) に、関数の目的を説明する名前を入力します。例: MapTemplate。[Runtime] (ランタイム) には [Python 3.9] を選択します。

4.    [Permissions] (アクセス許可) で [Change default execution role (デフォルト実行ロールを変更)] を選択します。

5.    [Use an existing role (既存のロールを使用する)] を選択します。[Existing roles (既存のロール)] ドロップダウンリストが表示されます。

6.    前に作成した Lambda 実行ロールを [Existing role (既存のロール)] で選択します。

7.    [Create function (関数を作成)] を選択します。

8.    [Code] (コード) タブの [Code source] (コードソース) で、lambda_function.py のコードを次のように置き換えます。

import json

def lambda_handler(event, context):
    print(event)
    return {
        'statusCode': 200,
        'body': json.dumps(event) # returning the data sent to backend lambda function as API response.
    }

9.    [Deploy] (デプロイ) を選択します。

詳細については、Python による Lambda 関数のビルドをご参照ください。

バックエンド Lambda 関数または HTTP エンドポイントにデータを渡す

1.    API Gateway Console にログインします。

2.    [Create API (API の作成)] を選択します。

  • または -

(初めて API Gateway を使用する場合) サービスの特徴を紹介するページが表示されます。[REST API] で [Build (ビルド)] を選択します。[Create Example API (サンプル API の作成)] ポップアップが表示されたら [OK] を選択します。

3.    [REST API] ペインの [Choose an API type (API タイプを選択)] で [Build (ビルド)] を選択します。

4.    [新しい API の作成] で、[新規 API] を選択します。

5.    [Settings (設定)] で、次の操作を行います。[API name (API 名)] に、API の目的を説明する名前を入力します。例: MappingTemplateTutorial。(オプション) [Description (説明)] に API の目的を表す短い説明を入力します。たとえば、バックエンド Lambda 関数/HTTP エンドポイントにデータを送信します。[Endpoint Type (エンドポイントタイプ)] で [Resional (リージョン)] を選択します。

6.    [Create API (API の作成)] を選択します。

API のリソース、統合ポイントとボディマッピングテンプレートを設定する

1.    前のステップで作成した API の名前を API Gateway console (API Gateway コンソール)で選択します。API の [Resources (リソース)] ページが開きます。

2.    [Resources (リソース)] ページで [Actions (アクション)] を選択します。[Create Resource (リソースの作成)] を選択します。

3.    [New Child Resource (新しい子リソース)] ペインの [Configure as proxy resource (プロキシリソースとして設定)] で、チェックマークアイコンを選択し、[Create Resource (リソースの作成)] を選択します。

4.    /{proxy+} - ANY - Setup ページで、次の操作を行います。

  • [Integration type (統合タイプ)] で、[Lambda Function Proxy (Lambda 関数 プロキシ)] を選択します。
  • [Lambda Region (Lambda リージョン)] で関数のホストになる AWS リージョンを選択します。
  • [Lambda Function (Lambda 関数)] には、関数の名前 MappingTemplateTutorial を入力します。

[Save] を選択します。[Add Permission to Lambda Function (Lambda 関数にアクセス許可を追加する)] ポップアップが表示されたら、[OK] を選択します。

7.    / {proxy+} - ANY - メソッドの実行ページで、[Integration Request (統合リクエスト)] を選択します。

8.    / {proxy+} - ANY - 統合リクエストページで、次の操作を行います。

  • [Lambda Proxy integration (Lambda プロキシ統合の使用)] アイコンボックスのチェックを外します。[Switch to Lambda integration (Lambda 統合に切り替え)] ポップアップが表示されます。
  • ポップアップで [OK] を選択します。 [Add Permission to Lambda Function (Lambda 関数にアクセス許可を追加する)] ポップアップが表示されます。ポップアップで [OK] を選択します。
  • [Mapping Templates (マッピングテンプレート)] を展開します。
  • [リクエストボディのパススルー] で[テンプレートが定義されていない場合 (推奨)]を選択します。

[Add mapping template (マッピングテンプレートの追加)] を選択します。Content-Type には、application/json と入力します。チェックマークアイコンを選択します。

9.    [Generate template (テンプレートを生成)] ドロップダウンリストを選択し、[Method Request passthrough (メソッドリクエストパススルー)] を選択します。

10.    マッピングテンプレートエディタで、次のように入力します。

##  See http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
#set($allParams = $input.params())
{
"method" : "$context.httpMethod", ## API method
"authcontext" : "$context.authorizer.stringkey", ## Optional output from Lambda Authorizers
## passthrough body
"body-json" : $input.json('$'),
## passthrough headers, querystrings and path parameters
"params" : {
#foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
"$type" : {
    #foreach($paramName in $params.keySet())
    "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
        #if($foreach.hasNext),#end
    #end
}
    #if($foreach.hasNext),#end
#end
}
}

11.    [Save] を選択します。

12.    [Method Execution (メソッドの実行)] を選択して、 / {proxy+} - ANY - メソッドの実行ページに戻ります。

13.    有効なメソッド応答を設定するには、[Method Response (メソッド応答)] を選択します。

14.    /{proxy+} - ANY - メソッドレスポンスページで、[Add Response (レスポンスを追加)] を選択します。

15.    HTTP ステータスコードには、200 と入力します。チェックマークアイコンを選択します。

16.    [Actions (アクション)] を選択して API をステージにデプロイします

新しいステージに API をデプロイします。

1.    「REST API をステージにデプロイする」の手順に従います。詳細については、「API Gateway コンソールを使用したステージのセットアップ」を参照してください。

2.    [Stage Editor (ステージエディタ)] ペインで [URL の呼び出し] をクリップボードにコピーします。

REST API 呼び出し URL の例

https://1a2bc3d456.execute-api.us-east-1.amazonaws.com/stage

設定をテストする

すべてのデータが API によってバックエンド Lambda 関数または HTTP エンドポイントに渡されていることを確認するには、次の curl コマンドを実行します。

重要: https://restApiId.execute-api.region.amazonaws.com/stageName を API の 呼び出し URL に置き換えます。

curl -i --location --request POST 'https://1a2bc3d456.execute-api.us-east-1.amazonaws.com/stage/path1/path2?query1=querystring1&query2=querystring2' --header 'header1: value1' --header 'header2: value2' --header 'Content-Type: application/json' --data-raw '{"keybody":"valuebody"}'

コマンド出力には、バックエンド Lambda 関数がクライアントに受信したすべてのデータが含まれます。お使いの環境の出力メッセージを更新できます。

注記: Windows に curl をインストールするには、Git ウェブサイトでダウンロードを参照してください。curl の詳細については、curl プロジェクトのウェブサイトをご覧ください。


関連情報

チュートリアル: Lambda 非プロキシ統合を使用した API Gateway REST API の構築

REST API のデータ変換の設定

カスタム Lambda 統合を使用して、API Gateway経由でカスタムヘッダーを Lambda 関数に渡すにはどうすればよいですか?

コメントはありません

関連するコンテンツ