AWS SDK for JavaScript V3 API リファレンスガイドでは、AWS SDK for JavaScript バージョン3 (V3) のすべての API オペレーションについて詳しく説明します。
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 バケット。
このリソースは手動でも作成できますが、このチュートリアルで説明するように CloudFormation を使用して、これらのリソースをプロビジョニングすることをお勧めします。
CloudFormationを使用してAWSリソースを作成します
CloudFormationは、AWSインフラストラクチャデプロイを予想可能および繰り返し作成し、プロビジョニングすることができます。CloudFormation については、「AWS CloudFormation User Guide」を参照してください。
AWS CLI を使用して CloudFormation スタックを作成するには:
「AWS CLI ユーザーガイド」の手順に従って AWS CLI をインストールして設定します。
プロジェクトフォルダのルートディレクトリで、
setup.yamlという名前のファイルを作成し、それにこの GitHubにコンテンツをコピーします。 注記
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_IAMcreate-stackコマンドパラメータの詳細については、 AWS CLI Command Reference guide (コマンドリファレンスガイド)および「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 関数をバンドルします を参照してください)。
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)); for (const element of data.Items) { 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と入力します。[保存] を選択します。
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 リソースを作成します トピックで作成した CloudFormation スタックを以下のように削除します。
「スタック」ページを開き、スタックを選択します。
[Delete] (削除) をクリックします。