BBH
-Biz Branding Hub-
投稿日 : 
2020/05/05
更新日 : 
2020/05/05

【AWS】APIGatewayのLambda統合で引数を受け取るチュートリアル

APIGatewayのLambda統合で引数を受け取るサンプルを紹介します。
引数の値によってLambdaの返却値を動的にします。

以下が今回作成するAPIの概略図です。

概略図

固定値を返すAPIを作成

まずは固定値を返すAPIを作成します。
以下の記事を参照ください。

APIGatewayの設定

固定値を返すAPIを作成したら、動的値を返却できるように変更を加えていきます。

メソッドを選択し、「メソッドリクエスト」を選択します。

「クエリ文字列の追加」からクエリパラメタ「param」を追加します。
この設定によってAPIGatewayでクエリパラメタを受け取ることができます。

次に「統合リクエスト」を選択します。

「Lambdaプロキシ統合の使用」にチェックを入れます。
これにより、APIGatewayで受け取ったパラメータをLambdaに渡すことができます。

これでAPIGatewayでパラメ―タを受け取る設定が完了しました。

Lambda関数の作成

次にパラメータを受けて動的な返却値を返すLambdaを作成します。
APIGatewayから渡されたパラメータは以下のような形式でLambdaに渡されます。

APIGatewayからLambdaに渡されるペイロード

{
  'resource': '/',
  'path': '/',
  'httpMethod': 'GET',
  'headers': None,
  'multiValueHeaders': None,
  'queryStringParameters': {'param': '1'},
  'multiValueQueryStringParameters': {'param': ['1']},
  'pathParameters': None,
  'stageVariables': None,
  'requestContext': 
  {
    'resourceId': 'xxxxxxxxxxx',
    'resourcePath': '/',
    'httpMethod': 'GET',
    'extendedRequestId': 'MDc-2HgEtjMFiCQ=',
    'requestTime': '05/May/2020:10:37:44 +0000',
    'path': '/',
    'accountId': 'xxxxxxxxxxxxxxxxxxxxx',
    'protocol': 'HTTP/1.1',
    'stage': 'test-invoke-stage',
    'domainPrefix': 'testPrefix',
    'requestTimeEpoch': 1588675064508,
    'requestId': 'xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx',
    'identity': 
    {
      'cognitoIdentityPoolId': None,
      'cognitoIdentityId': None,
      'apiKey': 'test-invoke-api-key',
      'principalOrgId': None,
      'cognitoAuthenticationType': None,
      'userArn': 'arn:aws:iam::xxxxxxxxxxxxxxxx:user/xxxxx',
      'apiKeyId': 'test-invoke-api-key-id',
      'userAgent': 'aws-internal/3 aws-sdk-java/1.11.749 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.242-b08 java/1.8.0_242 vendor/Oracle_Corporation',
      'accountId': 'xxxxxxxxxxxxx',
      'caller': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      'sourceIp': 'test-invoke-source-ip',
      'accessKey': 'xxxxxxxxxxxxxxxxxxxx',
      'cognitoAuthenticationProvider': None,
      'user': 'xxxxxxxxxxxxxxxxxxxxxxx'
    },
    'domainName': 'testPrefix.testDomainName',
    'apiId': 'xxxxxxxxxxxxxxxx'
  },
  'body': None,
  'isBase64Encoded': False
}

この中に「queryStringParameters」という値があります。
この中にAPIGatewayが受け取ったパラメータが格納されています。

queryStringParameters

  'queryStringParameters': {'param': '1'},

Lambdaでこの値を取得するには以下のように処理を記述すればよいです。

APIGatewayからのパラメータを受け取るLambda

import json

def lambda_handler(event, context):
    # ペイロードからクエリパラメタを取得
    body = 'param is ' + event['queryStringParameters']['param']
    
    res = {
        "statusCode" : 200,
        "headers" : {"Access-Control-Allow-Origin" : '*'},
        "body" : body
    }
    return res

Lambdaを作成したら「新しいバージョンの発行」をしておきましょう。

APIGatewayにLambdaを設定する

最後に作成したLambdaをAPIGatewayに統合します。
既にAPIを作成してしまっている場合は、Lambdaを変更することはできないので、新たにAPIメソッドを作成する必要があります。
Lambdaを設定したらデプロイを実行し、外部ネットワークから呼び出せるようにしましょう。

ブラウザから以下のURLにアクセスすることで、動的なレスポンスが返ってくることがわかります。

// APIにパラメータ付きリクエスト
https://[YOUR_API_URL]?param=[value]

// 動的な値が返ってくる
param is [value]

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend