API Gateway を使用した Lambdaを呼び出し - AWS SDK for JavaScript

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

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

API Gateway を使用した Lambdaを呼び出し

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

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

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

DynamoDB テーブル

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

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

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

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

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

  • 名前 - 従業員のファーストネーム。

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

  • 開始日 - 従業員の入社日。

DynamoDB テーブル
重要

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

前提条件タスク

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

  • これらの Node TypeScript の例を実行するようにプロジェクト環境を設定し、必要な AWS SDK for JavaScript とサードパーティーのモジュールをインストールします。「GitHub」の指示に従います。 

  • ユーザーの認証情報を使用して、共有設定ファイルを作成します。共有認証情報ファイルの提供の詳細については、「AWS SDK とツールのリファレンスガイド」の「共有設定ファイルおよび認証情報ファイル」を参照してください。

AWS リソースを作成します

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

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

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

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

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

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

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

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

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

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

    注記

    AWS CloudFormation テンプレートは、この GitHub で公開されている AWS CDK を使用して生成されました。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 テーブルをスキャンします

まず、Amazon SNS PublishCommand を使用してテキストメッセージを公開するために sendText と呼ばれる非同期/待機関数を作成します。次に、今日が勤務記念日である従業員の 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 を、mylambdafunction.zipという名前の 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を設定します

rest API を作成する

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

  1. [ Amazon API Gateway console ]( Amazon API Gateway コンソール )にサインインします。

  2. REST APIで、 [ Build ]( 構築 )を選択します。

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

    DynamoDB テーブル
  4. [ Employee ]をAPI 名として指定し、説明を入力します。

    DynamoDB テーブル
  5. API の作成 を選択します。

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

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

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

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

    DynamoDB テーブル
  10. [ /employees ]を選択し、[Create Method] から[Actions]を選択し、[GET][/employees]下のドロップダウンメニューから選択します。チェックマークアイコンを選択します。

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

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

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

DynamoDB テーブル

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

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

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

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

    DynamoDB テーブル
  2. [ Actions ] (アクション)ドロップダウンから[ Deploy API ]( デプロイAPI )を選択します。

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

    DynamoDB テーブル
  4. [Save changes] (変更の保存) をクリックします。

  5. Getをもう一度選択し、URL が変更されることに注意します。これは、Lambda 関数の呼び出しに使用できるURLです。

    DynamoDB テーブル

リソースを削除します

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

  1. AWS マネジメントコンソールで AWS CloudFormation を開きます。

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

  3. [Delete] (削除) をクリックします。