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 周年記念日に従業員を祝福するモバイルテキストメッセージを送信するとします。
この例は完了までに約 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 - 表のプライマリキー。
名前 - 従業員のファーストネーム。
電話 - 従業員の電話番号。
開始日 - 従業員の入社日。
重要
完了するためのコスト:このドキュメントに含まれる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 スタックを作成するには:
「AWS CLI ユーザーガイド」の手順に従って AWS CLI をインストールして設定します。
プロジェクトフォルダのルートディレクトリで、
setup.yaml
という名前のファイルを作成し、それにこの GitHubにコンテンツをコピーします。 注記
AWS CloudFormation テンプレートは、この GitHub
で公開されている AWS CDK を使用して生成されました。AWS CDKの詳細については、AWS Cloud Development Kit (AWS CDK)デベロッパーガイドを参照してください。 コマンドラインから以下のコマンドを実行し、「
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 ユーザーガイド」を参照してください。-
次に、表に入力します の手順に従ってテーブルに入力します。
表に入力します
テーブルにデータを入力するには、まず 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
というファイルをプロジェクトフォルダのルートディレクトリに作成し、この GitHubphone
のプロパティの値を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.js
と lambdaClient.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
いうバンドルファイルにバンドルする方法について説明します。
まだの場合は、この例の前提条件タスクに従ってwebpackをインストールしてください。
注記
Webpack の詳細については、「Webpack でアプリケーションをバンドルする」を参照してください。
コマンドラインで以下を実行して、この例の JavaScript を
<index.js>
というファイルにバンドルします。webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
重要
出力の名前が
index.js
であることに注意してください。Lambda関数が機能するにはindex.js
ハンドラーが必要です。バンドルされた出力ファイル
index.js
を、mylambdafunction.zip
という名前の ZIP ファイルに圧縮します。このチュートリアルの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 関数を呼び出すことができます。
[ Amazon API Gateway console ]
( Amazon API Gateway コンソール )にサインインします。 REST APIで、 [ Build ]( 構築 )を選択します。
[ New API ]( 新規API )を選択します。
[ Employee ]をAPI 名として指定し、説明を入力します。
API の作成 を選択します。
Employeeセクションの[Resources]を選択します。
名前フィールドの employeesを指定します。
[Create Resources] (リソースの作成) を選択します。
[ Actions ] ( アクション )のドロップダウンから [ Create Resource ] ( リソースの作成 )を選択します。
[ /employees ]を選択し、[Create Method] から[Actions]を選択し、[GET]を[/employees]下のドロップダウンメニューから選択します。チェックマークアイコンを選択します。
Lambda functionを選択し、Lambda 関数名としてmylambdafunctionと入力します。[Save (保存)] を選択します。
API Gateway メソッドをテストする
チュートリアルのこの時点で、mylambdafunctionのLambda 関数を呼び出す API Gateway メソッドをテストできます。メソッドをテストするには、次の図に示す[ Test ]を選びます。
Lambda 関数が呼び出されると、ログファイルを表示して成功したメッセージを表示できます。
API Gateway メソッドをデプロイする
テストが成功したら、 Amazon API Gateway コンソール
[ GET ]( 取得する )を選択します。
[ Actions ] (アクション)ドロップダウンから[ Deploy API ]( デプロイAPI )を選択します。
[ Deploy API ]フォームに入力し、[ Deploy ]を選択します。
[Save changes] (変更の保存) をクリックします。
Getをもう一度選択し、URL が変更されることに注意します。これは、Lambda 関数の呼び出しに使用できるURLです。
リソースを削除します
お疲れ様でした。AWS SDK for JavaScriptを使用してAmazon API Gateway を介しLambda 関数を呼び出します。このチュートリアルの冒頭で説明したように、このチュートリアルを進めるうえで作成したすべてのリソースを終了して、料金が発生しないようにしてください。これを行うには、このチュートリアルの AWS リソースを作成します トピックで作成した AWS CloudFormation スタックを以下のように削除します。
「スタック」ページを開き、スタックを選択します。
[Delete] (削除) をクリックします。