チュートリアル: API Gateway で Lambda を使用する - AWS Lambda

チュートリアル: API Gateway で Lambda を使用する

このチュートリアルでは、Amazon API Gateway を使用して REST API とリソース(DynamoDBManager) を作成します。リソースで 1 つのメソッド (POST) を定義し、POST メソッドをバックアップする Lambda 関数 (LambdaFunctionOverHttps) を作成します。こうすると、HTTPS エンドポイントから API を呼び出したときに API Gateway が Lambda 関数を呼び出します。

DynamoDBManager リソースで定義する POST メソッドでは、以下の Amazon DynamoDB オペレーションがサポートされます。

  • 項目を作成、更新、削除する。

  • 項目を読み取る。

  • 項目をスキャンする。

  • テストに使用できる、DynamoDB に関連していないその他のオペレーション (echo、ping)。

API Gateway で Lambda を使用すると、次のような高度な機能も使用できます。

  • フルリクエストパススルー – Lambda プロキシ (AWS_PROXY) 統合タイプを使用して、Lambda 関数で (リクエストボディだけでなく) HTTP リクエスト全体を受信し、(レスポンスボディだけでなく) HTTP レスポンスを設定できます。

  • キャッチオールメソッドANY キャッチオールメソッドを使用して、API リソースのすべてのメソッドを単一のマッピングで単一の Lambda 関数にマッピングできます。

  • キャッチオールリソース - greedy パス変数 ({proxy+}) を使用して、リソースのすべてのサブパスを Lambda 関数にマッピングできます。追加設定は必要ありません。

これらの API Gateway の機能の詳細については、API Gateway デベロッパーガイドの「プロキシリソースとのプロキシ統合を設定する」を参照してください。

前提条件

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。初めての方は、コンソールで Lambda の関数の作成 の手順に従って最初の Lambda 関数を作成してください。

次のステップを完了するには、コマンドを実行するコマンドラインターミナルまたはシェルが必要です。コマンドと予想される出力は、別々のブロックにリストされます。

aws --version

次のような出力が表示されます。

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\) が使用されます。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

実行ロールを作成する

実行ロールを作成します。この AWS Identity and Access Management (IAM) ロールは、カスタムポリシーを使用して、必要な AWS リソースにアクセスするためのアクセス許可を Lambda 関数に付与します。最初にポリシーを作成してから、実行ロールを作成する必要があります。

カスタムポリシーを作成するには

  1. IAM コンソールの [Policies (ポリシー)] ページを開きます。

  2. [Create Policy (ポリシーの作成)] を選択します。

  3. [JSON] タブを選択して、次のカスタムポリシーを JSON エディタに貼り付けます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ] }

    このポリシーには、関数が DynamoDB と Amazon CloudWatch Logs にアクセスするためのアクセス許可が含まれます。

  4. [Next: Tags (次へ: タグ)] を選択します。

  5. [次へ: レビュー] を選択します。

  6. [ポリシーの確認] でポリシーの [名前] に「lambda-apigateway-policy」と入力します。

  7. [Create policy] を選択します。

実行ロールを作成する

  1. IAM コンソールの [ロール] ページを開きます。

  2. [ロールの作成] を選択します。

  3. [信頼されたエンティティの種類を選択] で、[AWS サービス] を選択します。

  4. ユースケースに [Lambda] を選択します。

  5. [Next: Permissions (次へ: アクセス許可)] を選択します。

  6. ポリシー検索ボックスに、「lambda-apigateway-policy」と入力します。

  7. 検索結果で、作成したポリシー (lambda-apigateway-policy) を選択し、[次のステップ: タグ] を選択します。

  8. 次へ: レビューを選択します。

  9. [確認] の [ロール名] に「lambda-apigateway-role」と入力します。

  10. [ロールの作成] を選択します。

  11. [ロール] ページで、作成したロールの名前 (lambda-apigateway-role) を選択します。

  12. [概要] ページで、[ロール ARN] をコピーします。これは、このチュートリアルの後半で必要になります。

関数を作成する

以下のコード例では、API Gateway イベント入力を受け取り、その入力に含まれるメッセージを処理します。例示のため、このコードでは受信イベントデータの一部を CloudWatch Logs に書き込みます。

Node.js

例 index.js

console.log('Loading function'); var AWS = require('aws-sdk'); var dynamo = new AWS.DynamoDB.DocumentClient(); /** * Provide an event that contains the following keys: * * - operation: one of the operations in the switch statement below * - tableName: required for operations that interact with DynamoDB * - payload: a parameter to pass to the operation being performed */ exports.handler = function(event, context, callback) { //console.log('Received event:', JSON.stringify(event, null, 2)); var operation = event.operation; if (event.tableName) { event.payload.TableName = event.tableName; } switch (operation) { case 'create': dynamo.put(event.payload, callback); break; case 'read': dynamo.get(event.payload, callback); break; case 'update': dynamo.update(event.payload, callback); break; case 'delete': dynamo.delete(event.payload, callback); break; case 'list': dynamo.scan(event.payload, callback); break; case 'echo': callback(null, "Success"); break; case 'ping': callback(null, "pong"); break; default: callback(`Unknown operation: ${operation}`); } };

関数を作成するには

  1. サンプルコードを index.js のファイル名で保存します。

  2. デプロイパッケージを作成します。

    zip function.zip index.js
  3. create-function AWS Command Line Interface (AWS CLI) コマンドを使用して Lambda 関数を作成します。role パラメータに、以前にコピーした実行ロールの Amazon リソースネーム (ARN) を入力します。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Python 3

例 LambdaFunctionOverHttps.py

from __future__ import print_function import boto3 import json print('Loading function') def handler(event, context): '''Provide an event that contains the following keys: - operation: one of the operations in the operations dict below - tableName: required for operations that interact with DynamoDB - payload: a parameter to pass to the operation being performed ''' #print("Received event: " + json.dumps(event, indent=2)) operation = event['operation'] if 'tableName' in event: dynamo = boto3.resource('dynamodb').Table(event['tableName']) operations = { 'create': lambda x: dynamo.put_item(**x), 'read': lambda x: dynamo.get_item(**x), 'update': lambda x: dynamo.update_item(**x), 'delete': lambda x: dynamo.delete_item(**x), 'list': lambda x: dynamo.scan(**x), 'echo': lambda x: x, 'ping': lambda x: 'pong' } if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))

関数を作成するには

  1. サンプルコードを LambdaFunctionOverHttps.py のファイル名で保存します。

  2. デプロイパッケージを作成します。

    zip function.zip LambdaFunctionOverHttps.py
  3. create-function AWS Command Line Interface (AWS CLI) コマンドを使用して Lambda 関数を作成します。role パラメータに、以前にコピーした実行ロールの Amazon リソースネーム (ARN) を入力します。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler LambdaFunctionOverHttps.handler --runtime python3.8 \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Go

例 LambdaFunctionOverHttps.go

package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/events" runtime "github.com/aws/aws-lambda-go/lambda" ) func main() { runtime.Start(handleRequest) } func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { fmt.Printf("Processing request data for request %s.\n", request.RequestContext.RequestID) fmt.Printf("Body size = %d.\n", len(request.Body)) fmt.Println("Headers:") for key, value := range request.Headers { fmt.Printf(" %s: %s\n", key, value) } return events.APIGatewayProxyResponse{Body: request.Body, StatusCode: 200}, nil }

関数を作成するには

  1. サンプルコードを LambdaFunctionOverHttps.go のファイル名で保存します。

  2. 実行可能ファイルをコンパイルします。

    GOOS=linux go build LambdaFunctionOverHttps.go
  3. デプロイパッケージを作成します。

    zip function.zip LambdaFunctionOverHttps
  4. create-function AWS Command Line Interface (AWS CLI) コマンドを使用して Lambda 関数を作成します。role パラメータに、以前にコピーした実行ロールの Amazon リソースネーム (ARN) を入力します。

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler LambdaFunctionOverHttps --runtime go1.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role

関数をテストする

次のサンプルイベントデータを使用して、手動で Lambda 関数をテストします。関数は、invoke AWS CLI コマンドまたは Lambda コンソールを使用して呼び出すことができます。

Lambda 関数をテストするには (AWS CLI)

  1. 次の JSON を input.txt のファイル名で保存します。

    { "operation": "echo", "payload": { "somekey1": "somevalue1", "somekey2": "somevalue2" } }
  2. 以下の invoke AWS CLI コマンドを実行します。

    aws lambda invoke --function-name LambdaFunctionOverHttps \ --payload file://input.txt outputfile.txt

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションが必要です。このオプションは、AWS CLI 設定ファイルで設定することもできます。

  3. outputfile.txt ファイルで出力を確認します。

API Gateway を使用して REST API を作成する

このセクションでは、1つのリソース (DynamoDBManager) と 1 つのメソッド (POST) を含む API Gateway REST API (DynamoDBOperations) を作成します。POST メソッドを Lambda 関数に関連付けます。次に、設定をテストします。

API メソッドが HHTTP リクエストを受け取ると、API Gateway は Lambda 関数を呼び出します。

API を作成する

以下の手順では、API Gateway コンソールを使用して DynamoDBOperations REST API を作成します。

API を作成するには

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

  2. [Create API] を選択します。

  3. [REST API] ボックスで、[構築] を選択します。

  4. [Create new API (新しい API の作成)] で、[New API (新しい API)] を選択します。

  5. [設定] で、次のいずれかを実行します。

    1. [API 名] に「DynamoDBOperations」と入力します。

    2. [エンドポイントタイプ] で、[リージョン] を選択します。

  6. API の作成 を選択します。

API でリソースを作成する

以下のステップでは、DynamoDBManager という名前のリソースを REST API に作成します。

リソースを作成するには

  1. API Gateway コンソール] の API の [リソース] ツリーでルート (/) レベルが強調表示されていることを確認します。[アクション] メニューで、[リソースの作成] を選択します。

  2. [新しい子リソース] で、次の作業を行います。

    1. [Resource Name (リソース名)] に DynamoDBManager と入力します。

    2. [リソースパス] は /dynamodbmanager のままにします。

  3. [リソースの作成] を選択します。

リソースに POST メソッドを作成する

以下のステップでは、前のセクションで作成した DynamoDBManager リソースに POST メソッドを作成します。

メソッドを作成するには

  1. API Gateway コンソール] の API の [リソース] ツリーで /dynamodbmanager が強調表示されていることを確認します。[アクション]、[メソッドの作成] の順に選択します。

  2. /dynamodbmanager の下に表示される小さなドロップダウンメニューで [POST] を選択し、チェックマークアイコンを選択します。

  3. メソッドの[セットアップ] ペインで、次の操作を行います。

    1. [Integration type (統合タイプ)] で、[Lambda Function (Lambda 関数)] を選択します。

    2. [Lambda リージョン]で、Lambda 関数と同じ AWS リージョンを選択します。

    3. [Lambda 関数] に関数の名前 (LambdaFunctionOverHttps) を入力します。

    4. [デフォルトのイムアウトの使用] を選択します。

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

  4. [Lambda 関数に権限を追加する] ダイアログボックスで、[OK] を選択します。

DynamoDB テーブルの作成

Lambda 関数が使用する DynamoDB テーブルを作成します。

DynamoDB テーブルを作成するには

  1. DynamoDB コンソールで [Tables (テーブル)] ページを開きます。

  2. [Create table] (テーブルの作成) を選択します。

  3. [テーブルの詳細] で、次の操作を行います。

    1. [テーブル名] に「lambda-apigateway」と入力します。

    2. [パーティションキー] に「id」と入力し、データ型を [文字列] のままにします。

  4. [設定] は [デフォルト設定] のままにします。

  5. [Create table] (テーブルの作成) を選択します。

セットアップをテストする

これで設定をテストする準備ができました。リクエストは、API Gateway コンソールから POST メソッドに直接送信できます。このステップでは、create オペレーションの後に updateオペレーションを使用します。

DynamoDB テーブルに項目を作成するには

Lambda 関数では、create オペレーションを使用して DynamoDB テーブル内に項目を作成できます。

  1. API Gateway コンソールで、REST API の名前 (DynamoDBOperations) を選択します。

  2. [リソース] ツリーで、/dynamodbmanager の下の POST メソッドを選択します。

  3. [メソッドの実行] ペインの [クライアント] ボックスで、[テスト] を選択します。

  4. [メソッドテスト] ペインで、[クエリ文字列] と [ヘッダー] を空のままにします。[リクエスト本文] に以下の JSON を貼り付けます。

    { "operation": "create", "tableName": "lambda-apigateway", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
  5. [Test] (テスト) を選択します。

テスト結果に create オペレーションが成功したことを示すステータス (200) が表示されます。DynamoDB テーブルに "id": "1234ABCD""number": "5" を含む項目が含まれていることを確認します。

DynamoDB テーブルの項目を更新するには

update オペレーションを使用してテーブル内の項目を更新することもできます。

  1. API Gateway コンソールで POST メソッドの [メソッドテスト] ペインに戻ります。

  2. [メソッドテスト] ペインで、[クエリ文字列] と [ヘッダー] を空のままにします。[リクエスト本文] に以下の JSON を貼り付けます。

    { "operation": "update", "tableName": "lambda-apigateway", "payload": { "Key": { "id": "1234ABCD" }, "AttributeUpdates": { "number": { "Value": 10 } } } }
  3. [Test] (テスト) を選択します。

テスト結果に update オペレーションが成功したことを示すステータス (200) が表示されます。かくにDynamoDB テーブルに "id": "1234ABCD""number": "10" を含む更新済みの項目が含まれていることを確認します。

リソースのクリーンアップ

このチュートリアル用に作成したリソースは、保持を希望しない場合、すぐに削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。

Lambda 関数を削除するには

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] を選択してから、[削除] をクリックします。

  4. [削除] を選択します。

実行ロールを削除するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 作成した実行ロールを選択します。

  3. [ロールの削除] を選択します。

  4. [はい、削除します] を選択します。

API を削除するには

  1. API Gateway コンソールで API のページを開きます。

  2. 作成した API を選択します。

  3. [ Actions] で、[Delete ] を選択します。

  4. [削除] を選択します。

DynamoDB テーブルを削除するには

  1. DynamoDB コンソールで [Tables (テーブル)] ページを開きます。

  2. 作成したテーブルを選択します。

  3. [削除] を選択します。

  4. テキストボックスに「delete」と入力します。

  5. [削除] を選択します。