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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

このチュートリアルでは、HTTP リクエストを使用して Lambda 関数を呼び出す REST API を作成します。Lambda 関数は、DynamoDB テーブルで作成、読み取り、更新、および削除 (CRUD) 操作を実行します。このチュートリアルで提供される関数はデモ用ですが、任意の Lambda 関数を呼び出すことができる API Gateway REST API を設定する方法を学びます。


      このチュートリアルで使用されるサービスとリソース

API Gateway を使用することで、Lambda 関数を呼び出すためのセキュアな HTTP エンドポイントがユーザーに提供されるとともに、トラフィックのスロットリングと、API 呼び出しの自動的な検証と承認によって、関数に対する大量の呼び出しを管理するためにも役立ちます。API Gateway は、AWS Identity and Access Management (IAM) と Amazon Cognito を使用した柔軟なセキュリティコントロールも提供します。これは、アプリケーションへの呼び出しに事前承認が必要なユースケースに役立ちます。

このチュートリアルは、以下の段階を通じて完了します。

  1. DynamoDB テーブルで操作を実行するための Lambda 関数をPython または Node.js で作成し、設定する。

  2. API Gateway で、Lambda 関数に接続するための REST API を作成する。

  3. DynamoDB テーブルを作成し、コンソールで Lambda 関数を使用してテーブルをテストする。

  4. API をデプロイし、ターミナルで curl を使用してセットアップ全体をテストする。

これらの段階を完了することにより、あらゆる規模で Lambda 関数をセキュアに呼び出すことができる HTTP エンドポイントを作成するために API Gateway を使用する方法を学びます。また、API をデプロイする方法と、それをコンソールでテスト、およびターミナルを使用して HTTP リクエストを送信することでテストする方法も学びます。

前提条件

AWS アカウントがない場合は、以下のステップを実行して作成します。

AWS アカウント にサインアップするには
  1. https://portal.aws.amazon.com/billing/signup を開きます。

  2. オンラインの手順に従います。

    サインアップ手順の一環として、通話呼び出しを受け取り、電話のキーパッドを使用して検証コードを入力するように求められます。

    AWS アカウントにサインアップすると、AWS アカウントのルートユーザーが作成されます。ルートユーザーには、アカウントのすべての AWS のサービスとリソースへのアクセス権があります。セキュリティのベストプラクティスとして、管理ユーザーに管理アクセスを割り当てルートユーザーアクセスが必要なタスクを実行する場合にのみ、ルートユーザーを使用してください。

サインアップ処理が完了すると、AWS からユーザーに確認メールが送信されます。https://aws.amazon.com/[アカウント] をクリックして、いつでもアカウントの現在のアクティビティを表示し、アカウントを管理することができます。

AWS アカウント にサインアップしたら、AWS アカウントのルートユーザー をセキュリティで保護し、AWS IAM Identity Center を有効にして、管理ユーザーを作成します。これにより、日常的なタスクにルートユーザーを使用しないようにします。

AWS アカウントのルートユーザーをセキュリティで保護する
  1. [ルートユーザー] を選択し、AWS アカウント のメールアドレスを入力して、アカウント所有者として AWS Management Console にサインインします。次のページでパスワードを入力します。

    ルートユーザーを使用してサインインする方法については、「AWS サインイン User Guide」の「Signing in as the root user」を参照してください。

  2. ルートユーザーの多要素認証 (MFA) を有効にします。

    手順については、「IAM ユーザーガイド」の「AWS アカウント のルートユーザーの仮想 MFA デバイスを有効にする (コンソール)」を参照してください。

管理ユーザーを作成する
  1. IAM アイデンティティセンターを有効にします。

    手順については、「AWS IAM Identity Center ユーザーガイド」の「AWS IAM Identity Center の有効化」を参照してください。

  2. IAM アイデンティティセンターで、管理ユーザーに管理者アクセスを付与します。

    IAM アイデンティティセンターディレクトリ をアイデンティティソースとして使用するチュートリアルについては、「AWS IAM Identity Center ユーザーガイド」の「デフォルトの IAM アイデンティティセンターディレクトリ でユーザーアクセスを設定する」を参照してください。

管理ユーザーとしてサインインする
  • IAM アイデンティティセンターのユーザーとしてサインインするには、IAM アイデンティティセンターのユーザーの作成時に E メールアドレスに送信されたサインイン URL を使用します。

    IAM アイデンティティセンターのユーザーを使用してサインインする方法については、「AWS サインイン User Guide」の「Signing in to the AWS access portal」を参照してください。

AWS Command Line Interface をまだインストールしていない場合は、「最新バージョンの AWS CLI のインストールまたは更新」にある手順に従ってインストールしてください。

このチュートリアルでは、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要です。Linux および macOS では、任意のシェルとパッケージマネージャーを使用してください。

注記

Windows では、Lambda でよく使用される一部の Bash CLI コマンド (zip など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストールします。

許可ポリシーを作成する


        ステップ 1 許可ポリシーを作成する

Lambda 関数の実行ロールを作成する前に、必要な AWS リソースにアクセスするための許可を関数に付与する許可ポリシーを作成する必要があります。このチュートリアルでは、このポリシーにより、Lambda が DynamoDB テーブルに対して CRUD オペレーションを実行し、Amazon CloudWatch Logs に書き込むことができます。

ポリシーを作成するには
  1. IAM コンソールのポリシーページを開きます。

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

  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" } ] }
  4. [次へ: タグ] を選択します。

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

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

  7. [ポリシーの作成] を選択します。

実行ロールを作成する


        ステップ 2 実行ロールを作成する

実行ロールとは、AWS サービスとリソースにアクセスする許可を Lambda 関数に付与する AWS Identity and Access Management (IAM) ロールです。関数が DynamoDB テーブルで操作を実行できるようにするには、前のステップで作成した許可ポリシーをアタッチします。

実行ロールを作成して、カスタム許可ポリシーをアタッチする
  1. IAM コンソールのロールページを開きます。

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

  3. 信頼されたエンティティには、[AWS サービス] を選択し、ユースケースには [Lambda] を選択します。

  4. [次へ] をクリックします。

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

  6. 検索結果で作成したポリシー (lambda-apigateway-policy) を選択し、[次へ] を選択します。

  7. [Role details] (ロールの詳細)で [Role name] (ロール名) に lambda-apigateway-role を入力してから、[Create role] (ロールを作成) を選択します。

このチュートリアルの後半で、先ほど作成したロールの Amazon リソースネーム (ARN) が必要になります。IAM コンソールの [Roles] (ロール) ページでロール名 (lambda-apigateway-role) を選択し、[Summary] (概要) ページに表示されている [Role ARN] (ロールの ARN) をコピーします。

関数を作成する


        ステップ 3 関数を作成する

以下のコード例は、作成される DynamoDB テーブルで実行する操作と、いくつかのペイロードデータを指定する、API Gateway からのイベント入力を受け取ります。関数が受け取るパラメータが有効な場合、リクエストされた操作をテーブルで実行します。

Node.js
例 index.mjs
console.log('Loading function'); import { DynamoDBDocumentClient, PutCommand, GetCommand, UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; const ddbClient = new DynamoDBClient({ region: "us-west-2" }); const ddbDocClient = DynamoDBDocumentClient.from(ddbClient); // Define the name of the DDB table to perform the CRUD operations on const tablename = "lambda-apigateway"; /** * Provide an event that contains the following keys: * * - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo' * - payload: a JSON object containing the parameters for the table item * to perform the operation on */ export const handler = async (event, context) => { const operation = event.operation; if (operation == 'echo'){ return(event.payload); } else { event.payload.TableName = tablename; switch (operation) { case 'create': await ddbDocClient.send(new PutCommand(event.payload)); break; case 'read': var table_item = await ddbDocClient.send(new GetCommand(event.payload)); console.log(table_item); break; case 'update': await ddbDocClient.send(new UpdateCommand(event.payload)); break; case 'delete': await ddbDocClient.send(new DeleteCommand(event.payload)); break; default: return ('Unknown operation: ${operation}'); } } };
注記

この例では、DynamoDB テーブルの名前が関数コード内の変数として定義されます。実際のアプリケーションでは、このパラメータを環境変数として渡し、テーブル名をハードコーディングしないことがベストプラクティスです。詳細については、「AWS Lambda 環境変数の使用」を参照してください。

関数を作成する
  1. コード例を index.mjs という名前のファイルとして保存し、必要な場合は、コードで指定されている AWS リージョンを編集します。コード内で指定されているリージョンは、このチュートリアルの後半で DynamoDB テーブルを作成するリージョンと同じものにする必要があります。

  2. 以下の zip コマンドを使用して、デプロイパッケージを作成します。

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

    aws lambda create-function --function-name LambdaFunctionOverHttps \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::123456789012:role/service-role/lambda-apigateway-role
Python 3
例 LambdaFunctionOverHttps.py
import boto3 import json # define the DynamoDB table that Lambda will connect to tableName = "lambda-apigateway" # create the DynamoDB resource dynamo = boto3.resource('dynamodb').Table(tableName) 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 - payload: a JSON object containing parameters to pass to the operation being performed ''' # define the functions used to perform the CRUD operations def ddb_create(x): dynamo.put_item(**x) def ddb_read(x): dynamo.get_item(**x) def ddb_update(x): dynamo.update_item(**x) def ddb_delete(x): dynamo.delete_item(**x) def echo(x): return x operation = event['operation'] operations = { 'create': ddb_create, 'read': ddb_read, 'update': ddb_update, 'delete': ddb_delete, 'echo': echo, } if operation in operations: return operations[operation](event.get('payload')) else: raise ValueError('Unrecognized operation "{}"'.format(operation))
注記

この例では、DynamoDB テーブルの名前が関数コード内の変数として定義されます。実際のアプリケーションでは、このパラメータを環境変数として渡し、テーブル名をハードコーディングしないことがベストプラクティスです。詳細については、「AWS Lambda 環境変数の使用」を参照してください。

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

  2. 以下の zip コマンドを使用して、デプロイパッケージを作成します。

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

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

AWS CLI を使用して関数を呼び出す


        ステップ 4 AWS CLI を使用して関数を呼び出す

関数を API Gateway と統合する前に、関数が正常にデプロイされたことを確認します。API Gateway API が Lambda に送信するパラメータが含まれるテストイベントを作成し、AWS CLI invoke コマンドを使用して関数を実行します。

AWS CLI を使用して Lambda 関数を呼び出す
  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 --cli-binary-format raw-in-base64-out

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。これをデフォルト設定にするには、aws configure set cli-binary-format raw-in-base64-out を実行します。詳細については、バージョン 2 の AWS Command Line Interface ユーザーガイドの「AWS CLI でサポートされているグローバルコマンドラインオプション」を参照してください。

    以下のようなレスポンスが表示されます。

    { "StatusCode": 200, "ExecutedVersion": "LATEST" }
  3. JSON テストイベントで指定した echo 操作を関数が実行したことを確認します。outputfile.txt ファイルを調べて、以下が含まれていることを確認します。

    {"somekey1": "somevalue1", "somekey2": "somevalue2"}

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


        ステップ 5 API を作成する

このステップでは、Lambda 関数を呼び出すために使用する API Gateway REST API を作成します。

API を作成するには
  1. API Gateway コンソールを開きます。

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

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

  4. [API の詳細][新しい API] を選択したままにし、[API 名] には DynamoDBOperations と入力します。

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

REST API でリソースを作成する


        ステップ 6 API リソースを作成する

API に HTTP メソッドを追加するには、まずそのメソッドが操作を実行するリソースを作成する必要があります。ここでは、DynamoDB テーブルを管理するためのリソースを作成します。

リソースを作成する
  1. API Gateway コンソールの API の [リソース] ページで、[リソースの作成] をクリックします。

  2. [リソースの詳細][リソース名] に、DynamoDBManager と入力します。

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

HTTP POST メソッドを作成する


        ステップ 7 HTTP POST メソッドを作成する

このステップでは、DynamoDBManager リソースのためのメソッド (POST) を作成します。この POST メソッドを Lambda 関数にリンクして、メソッドが HHTTP リクエストを受け取るときに、API Gateway が Lambda 関数を呼び出すようにします。

注記

このチュートリアルの目的上、DynamoDB テーブルですべての操作を実行する単一の Lambda 関数を呼び出すために、1 つの HTTP メソッド (POST) が使用されます。実際のアプリケーションでは、操作ごとに異なる Lambda 関数と HTTP メソッドを使用することがベストプラクティスです。詳細については、Serverless Land の「Lambda モノリス」を参照してください。

POST メソッドを作成する
  1. API の [リソース] ページで、/DynamoDBManager リソースが強調表示されていることを確認します。次に、[メソッド] ペインで [メソッドの作成] をクリックします。

  2. [メソッドタイプ] で、[POST] を選択します。

  3. [統合タイプ] で、[Lambda 関数] を選択します。

  4. [Lambda 関数] で、使用する関数 (LambdaFunctionOverHttps) の Amazon リソースネーム (ARN)を選択します。

  5. [メソッドの作成] を選択します。

DynamoDB テーブルを作成する


        ステップ 8 DynamoDB テーブルを作成する

Lambda 関数が CRUD 操作を実行する空の DynamoDB テーブルを作成します。

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

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

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

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

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

  4. [Table settings] (テーブル設定) では、[Default settings] (デフォルト設定) をそのまま使用します。

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

API Gateway、Lambda、および DynamoDB の統合をテストする


        ステップ 9 API Gateway、Lambda、および DynamoDB の統合をテストする

これで、API Gateway API メソッドの Lambda 関数および DynamoDB テーブルとの統合をテストするための準備が整いました。API Gateway コンソールで、コンソールのテスト機能を使用して POST メソッドにリクエストを直接送信します。このステップでは、まず create 操作を使用して DynamoDB テーブルに新しい項目を追加し、次に update 操作を使用してその項目を変更します。

テスト 1 DynamoDB テーブルで新しい項目を作成する
  1. API Gateway コンソールで、API (DynamoDBOperations) を選択します。

  2. DynamoDBManager リソースで POST メソッドを選択します。

    
            DynamoDBManager リソースで POST メソッドを選択します。
  3. [テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

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

    { "operation": "create", "payload": { "Item": { "id": "1234ABCD", "number": 5 } } }
  5. [テスト] を選択します。

    テストが完了したときに表示される結果には、200 というステータスが表示されるはずです。このステータスコードは、create 操作が正常に実行されたことを示します。

    それを確認するため、DynamoDB テーブルに新しい項目が含まれていることをチェックします。

  6. DynamoDB コンソールで [Tables] (テーブル) ページを開き、lambda-apigateway テーブルを選択します。

  7. [Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id] 1234ABCD[number] (番号) 5 がある 1 つの項目が表示されるはずです。

テスト 2 DynamoDB テーブルの項目を更新する
  1. API Gateway コンソールで POST メソッドの [テスト] タブに戻ります。

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

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

    テストが完了したときに表示される結果には、200 というステータスが表示されるはずです。このステータスコードは、update 操作が正常に実行されたことを示します。

    それを確認するため、DynamoDB テーブルの項目が変更されていることをチェックします。

  4. DynamoDB コンソールで [Tables] (テーブル) ページを開き、lambda-apigateway テーブルを選択します。

  5. [Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id] 1234ABCD[number] (番号) 10 がある 1 つの項目が表示されるはずです。

API をデプロイする


        ステップ 10 API をデプロイする

クライアントが API を呼び出すには、デプロイと関連するステージを作成する必要があります。ステージは、メソッドと統合が含まれる API のスナップショットを表します。

API をデプロイする
  1. API Gateway コンソール[API] ページを開き、DynamoDBOperations API を選択します。

  2. API の [リソース] ページで [API のデプロイ] をクリックします。

  3. [ステージ][*新しいステージ*] をクリックし、[ステージ名] には test を入力します。

  4. デプロイを選択します。

  5. [ステージの詳細] ペインで [URL を呼び出す] をコピーします。これは、HTTP リクエストを使用して関数を呼び出すために、次のステップで使用します。

HTTP リクエストを使用して関数を呼び出すために curl を使用する


        ステップ 11 HTTP リクエストを使用して関数を呼び出す

これで、API に HTTP リクエストを発行することで Lambda 関数を呼び出せるようになりました。このステップでは、DynamoDB テーブルに新しい項目を作成してから、それを削除します。

curl を使用して Lambda 関数を呼び出す
  1. 前のステップでコピーした呼び出し URL を使用して、以下の curl コマンドを実行します。-d (data) オプションと共に curl を使用するときは、自動的に HTTP POST メソッドが使用されます。

    curl https://l8togsqxd8.execute-api.us-west-2.amazonaws.com/test/DynamoDBManager \ -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
  2. 作成操作が正常に実行されたことを確認するには、以下の手順を実行します。

    1. DynamoDB コンソールで [Tables] (テーブル) ページを開き、lambda-apigateway テーブルを選択します。

    2. [Explore table items] (テーブルアイテムの探索) を選択します。[Items returned] (返された項目) ペインに、[id] 5678EFGH[number] (番号) 15 がある項目が表示されるはずです。

  3. 以下の curl コマンドを実行して、先ほど作成した項目を削除します。独自の呼び出し URL を使用してください。

    curl https://l8togsqxd8.execute-api.us-west-2.amazonaws.com/test/DynamoDBManager \ -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
  4. 削除操作が正常に実行されたことを確認します。DynamoDB コンソールの [Explore items] (項目を探索) ページにある [Items returned] (返された項目) ペインで、id 5678EFGH がある項目がテーブル内にないことを確認します。

リソースをクリーンアップする (オプション)

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

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

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

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに delete と入力し、[削除] を選択します。

実行ロールを削除する
  1. IAM コンソールのロールページを開きます。

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

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

  4. テキスト入力フィールドにロールの名前を入力し、[Delete] (削除) を選択します。

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

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

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

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

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

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

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

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

  5. [テーブルの削除] を選択します。