API Gateway での Lambda の呼び出し - AWS SDK for JavaScript

AWS SDK for JavaScript V3 APIリファレンスガイドでは、バージョン 3 (V3) のすべてのAPIオペレーション AWS SDK for JavaScript について詳しく説明します。

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

API Gateway での Lambda の呼び出し

Lambda 関数を呼び出すには、Amazon API Gateway を使用します。これは、REST、、および WebSocket APIs を大規模に作成、公開、維持、モニタリングHTTP、保護するための AWS サービスです。API デベロッパーは、APIsそのアクセス AWS または他のウェブサービス、および AWS クラウドに保存されているデータを作成できます。API Gateway デベロッパーは、独自のクライアントアプリケーションでAPIs使用するために を作成できます。詳細については、「Amazon API Gateway とは」を参照してください。

AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行できるようにするコンピューティングサービスです。Lambda 関数は、さまざまなプログラミング言語で作成できます。の詳細については AWS Lambda、「 とは AWS Lambda」を参照してください。

この例では、Lambda JavaScript ランタイム を使用して Lambda 関数を作成しますAPI。この例では、さまざまな AWS サービスを呼び出して、特定のユースケースを実行します。例えば、次の図に示すように、組織が 1 周年記念日に従業員を祝福するモバイルテキストメッセージを送信するとします。

DynamoDB テーブル

この例は完了までに約 20 分かかります。

この例では、 JavaScript ロジックを使用して、このユースケースを実行するソリューションを作成する方法を示しています。例えば、データベースを読み取り、1 年記念日に達した従業員を特定する方法、データを処理する方法、Lambda 関数を使用してテキストメッセージを送信する方法について説明します。次に、APIGateway を使用して Rest エンドポイントを使用してこの AWS Lambda 関数を呼び出す方法について説明します。例えば、この curl コマンドを使用して Lambda 関数を呼び出すことができます。:

curl -XGET "https://xxxxqjko1o3.execute-api.us-east-1.amazonaws.com/cronstage/employee"

この AWS チュートリアルでは、これらのフィールドを含む Employee という名前の Amazon DynamoDB テーブルを使用します。

  • id - 表のプライマリキー。

  • firstName - 従業員の名。

  • 電話 - 従業員の電話番号。

  • startDate - 従業員の開始日。

DynamoDB テーブル
重要

完了コスト: このドキュメントに含まれる AWS サービスは、 AWS 無料利用枠に含まれています。ただし、この例を完了したら必ずすべてのリソースを終了して料金が発生しないようにしてください。

前提条件タスク

この例をセットアップして実行するには、まず次のタスクを完了する必要があります。

AWS リソースを作成する

このチュートリアルでは、以下のリソースが必要です。

  • Id という名前のキーと前の図に示されているフィールドを持つ Employee という Amazon DynamoDB テーブル。このユースケースでテストする有効な携帯番号を含め、正しいデータを入力してください。詳細については、テーブルの作成を参照してください。

  • Lambda 関数を実行するためのアクセス許可がアタッチされたIAMロール。

  • Lambda 関数をホストするAmazon S3 バケット。

これらのリソースは手動で作成できますが、このチュートリアルで説明されている AWS CloudFormation ように、 を使用してこれらのリソースをプロビジョニングすることをお勧めします。

を使用して AWS リソースを作成する AWS CloudFormation

AWS CloudFormation では、 AWS インフラストラクチャのデプロイを予測可能かつ繰り返し作成およびプロビジョニングできます。の詳細については AWS CloudFormation、AWS CloudFormation 「 ユーザーガイド」を参照してください。

を使用して AWS CloudFormation スタックを作成するには AWS CLI:

  1. AWS CLI ユーザーガイドの AWS CLI 以下の手順をインストールして設定します。

  2. プロジェクトフォルダのルートディレクトリsetup.yamlに という名前のファイルを作成し、その上に GitHubコンテンツをコピーします。

    注記

    AWS CloudFormation テンプレートは、 AWS CDK で利用可能な GitHubを使用して生成されました。の詳細については AWS CDK、AWS Cloud Development Kit (AWS CDK) 「 デベロッパーガイド」を参照してください。

  3. コマンドラインから次のコマンドを実行し、STACK_NAME スタックの一意の名前。

    重要

    スタック名は、 AWS リージョンと AWS アカウント内で一意である必要があります。最大 128 文字まで指定でき、数字とハイフンを使用できます。

    aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM

    create-stack コマンドパラメータの詳細については、 AWS CLI Command Reference guide (コマンドリファレンスガイド)および「AWS CloudFormation ユーザーガイド」を参照してください。

  4. 次に、表に入力します の手順に従ってテーブルに入力します。

表に入力します

テーブルにデータを入力するには、まず libs という名前のディレクトリを作成し、そこに dynamoClient.js という名前のファイルを作成し、それに以下の内容を貼り付けます。

const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); // Set the AWS Region. const REGION = "REGION"; // e.g. "us-east-1" // Create an Amazon Lambda service client object. const dynamoClient = new DynamoDBClient({region:REGION}); module.exports = { dynamoClient };

このコードは、 で GitHub入手できます。

次に、プロジェクトフォルダのルートディレクトリpopulate-table.jsに という名前のファイルを作成し、その上に GitHubコンテンツをコピーします。項目の1つについて、phone のプロパティの値をE.164形式の有効な携帯電話番号に置き換え、startDate の値を今日の日付に置き換えます。

コマンドラインから、以下のコマンドを実行します。

node populate-table.js
const { BatchWriteItemCommand } = require ( "aws-sdk/client-dynamodb" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Set the parameters. export const params = { RequestItems: { Employees: [ { PutRequest: { Item: { id: { N: "1" }, firstName: { S: "Bob" }, phone: { N: "155555555555654" }, startDate: { S: "2019-12-20" }, }, }, }, { PutRequest: { Item: { id: { N: "2" }, firstName: { S: "Xing" }, phone: { N: "155555555555653" }, startDate: { S: "2019-12-17" }, }, }, }, { PutRequest: { Item: { id: { N: "55" }, firstName: { S: "Harriette" }, phone: { N: "155555555555652" }, startDate: { S: "2019-12-19" }, }, }, }, ], }, }; export const run = async () => { try { const data = await dbclient.send(new BatchWriteItemCommand(params)); console.log("Success", data); } catch (err) { console.log("Error", err); } }; run();

このコードは、 で GitHub入手できます。

AWS Lambda 関数の作成

の設定 SDK

libs のディレクトリで snsClient.jslambdaClient.js という名前のファイルを作成し、これらのファイルに以下の内容をそれぞれ貼り付けます。

const { SNSClient } = require("@aws-sdk/client-sns"); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon SNS service client object. const snsClient = new SNSClient({ region: REGION }); module.exports = { snsClient };

置換 REGION AWS リージョンを使用します。このコードは、 で GitHub入手できます。

const { LambdaClient } = require("@aws-sdk/client-lambda"); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon Lambda service client object. const lambdaClient = new LambdaClient({ region: REGION }); module.exports = { lambdaClient };

置換 REGION AWS リージョンを使用します。このコードは、 で GitHub入手できます。

まず、必要な AWS SDK for JavaScript (v3) モジュールとコマンドをインポートします。次に、今日の日付を計算し、パラメータに割り当てます。3 番目に、ScanCommand のパラメータを作成します。置換 TABLE_NAME この例の AWS リソースを作成する セクションで作成したテーブルの名前。

以下のコードスニペットは、このステップを示しています (詳細な例については、Lambda 関数をバンドルします を参照してください)。

"use strict"; const { ScanCommand } = require("@aws-sdk/client-dynamodb"); const { PublishCommand } = require("@aws-sdk/client-sns"); const { snsClient } = require("./libs/snsClient"); const { dynamoClient } = require("./libs/dynamoClient"); // Get today's date. const today = new Date(); const dd = String(today.getDate()).padStart(2, "0"); const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0! const yyyy = today.getFullYear(); const date = yyyy + "-" + mm + "-" + dd; // Set the parameters for the ScanCommand method. const params = { // Specify which items in the results are returned. FilterExpression: "startDate = :topic", // Define the expression attribute value, which are substitutes for the values you want to compare. ExpressionAttributeValues: { ":topic": { S: date }, }, // Set the projection expression, which are the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "Employees", };

DynamoDB テーブルをスキャンします

まず、 という非同期/待機関数を作成してsendText、Amazon SNS を使用してテキストメッセージを発行しますPublishCommand。次に、今日が勤務記念日である従業員の DynamoDB テーブルをスキャンし、sendText 関数を呼び出してこれらの従業員にテキストメッセージを送信する try ブロックパターンを追加します。エラーが発生した場合は、catch ブロックされます。

以下のコードスニペットは、このステップを示しています (詳細な例については、Lambda 関数をバンドルします を参照してください)。

// Helper function to send message using Amazon SNS. exports.handler = async () => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { await snsClient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to identify employees with work anniversary today. const data = await dynamoClient.send(new ScanCommand(params)); data.Items.forEach(function (element) { const textParams = { PhoneNumber: element.phone.N, Message: "Hi " + element.firstName.S + "; congratulations on your work anniversary!", }; // Send message using Amazon SNS. sendText(textParams); }); } catch (err) { console.log("Error, could not scan table ", err); } };

Lambda 関数をバンドルします

このトピックでは、 mylambdafunction.tsと、この例に必要な AWS SDK for JavaScript モジュールを というバンドルされたファイルにバンドルする方法について説明しますindex.js

  1. まだの場合は、この例の前提条件タスクに従ってwebpackをインストールしてください。

    注記

    Webpack の詳細については、「Webpack でアプリケーションをバンドルする」を参照してください。

  2. コマンドラインで以下を実行して、この例 JavaScript の を <index.js> というファイルにバンドルします。

    webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
    重要

    出力の名前がindex.jsであることに注意してください。Lambda関数が機能するにはindex.jsハンドラーが必要です。

  3. バンドルされた出力ファイル index.jsを という名前のZIPファイルに圧縮しますmylambdafunction.zip

  4. このチュートリアルのAWS リソースを作成する トピックで作成したAmazonS3バケットにmylambdafunction.zipをアップロードします。

Lambda 関数をデプロイします

プロジェクトのルートで、lambda-function-setup.ts ファイルを作成し、それに以下の内容をペーストします。

置換 BUCKET_NAME Lambda 関数ZIPのバージョンをアップロードした Amazon S3 バケットの名前。置換 ZIP_FILE_NAME Lambda 関数ZIPのバージョンの名前。置換 ROLE このチュートリアルのAWS リソースを作成する トピックで作成したIAMロールの Amazon リソース番号 (ARN) を使用します。置換 LAMBDA_FUNCTION_NAME Lambda 関数の名前。

// Load the required Lambda client and commands. const { CreateFunctionCommand } = require ( "@aws-sdk/client-lambda" ); const { lambdaClient} = require ( "./libs/lambdaClient.js ); // Set the parameters. const params = { Code: { S3Bucket: "BUCKET_NAME", // BUCKET_NAME S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME }, FunctionName: "LAMBDA_FUNCTION_NAME", Handler: "index.handler", Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role Runtime: "nodejs12.x", Description: "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " + "send employees an email on each anniversary of their start-date.", }; const run = async () => { try { const data = await lambdaClient.send(new CreateFunctionCommand(params)); console.log("Success", data); // successful response } catch (err) { console.log("Error", err); // an error occurred } }; run();

コマンドラインで次を入力して、Lambda 関数をデプロイします。

node lambda-function-setup.ts

このコード例は、 で GitHub入手できます。

Lambda 関数を呼び出すように API Gateway を設定する

残りを作成する API

API Gateway コンソールを使用して、Lambda 関数の休止エンドポイントを作成できます。完了したら、restful 呼び出しを使用して Lambda 関数を呼び出すことができます。

  1. Amazon API Gateway コンソール にサインインします。

  2. Rest でAPI、Build を選択します。

  3. [新規]API を選択します。

    DynamoDB テーブル
  4. 従業員をAPI名前として指定し、説明を入力します。

    DynamoDB テーブル
  5. Create APIを選択します。

  6. Employeeセクションの[Resources]を選択します。

    DynamoDB テーブル
  7. 名前フィールドの employeesを指定します。

  8. [Create Resources] (リソースの作成) を選択します。

  9. [ Actions ] ( アクション )のドロップダウンから [ Create Resource ] ( リソースの作成 )を選択します。

    DynamoDB テーブル
  10. /employees を選択し、アクション からメソッドの作成 を選択し、以下のドロップダウンメニューGETから /employees を選択します。チェックマークアイコンを選択します。

    DynamoDB テーブル
  11. Lambda functionを選択し、Lambda 関数名としてmylambdafunctionと入力します。[Save] を選択します。

API Gateway メソッドをテストする

チュートリアルのこの時点で、mylambdafunction Lambda 関数を呼び出す API Gateway メソッドをテストできます。メソッドをテストするには、次の図に示す[ Test ]を選びます。

DynamoDB テーブル

Lambda 関数が呼び出されると、ログファイルを表示して成功したメッセージを表示できます。

Gateway APIメソッドをデプロイする

テストが成功したら、Amazon API Gateway コンソール から メソッドをデプロイできます。

  1. [ GET ]( 取得する )を選択します。

    DynamoDB テーブル
  2. Actions ドロップダウンから、 をデプロイ APIを選択します。

    DynamoDB テーブル
  3. Deploy API フォームに入力し、Deploy を選択します。

    DynamoDB テーブル
  4. [Save Changes] を選択します。

  5. 再度取得 を選択し、 URL が変更されることに気づきます。これは、Lambda 関数の呼び出しURLに使用できる呼び出しです。

    DynamoDB テーブル

リソースを削除します

お疲れ様でした。を使用して Amazon API Gateway を介して Lambda 関数を呼び出しました AWS SDK for JavaScript。このチュートリアルの冒頭で説明したように、このチュートリアルを進めたうえで、作成したすべてのリソースを終了して、料金が発生しないようにしてください。これを行うには、このチュートリアルのAWS リソースを作成する トピックで作成した AWS CloudFormation スタックを次のように削除します。

  1. AWS CloudFormationAWS 管理コンソール で を開きます。

  2. スタック」ページを開き、スタックを選択します。

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