AWS SDK for JavaScript V3 APIリファレンスガイドでは、バージョン 3 (V3) のすべてのAPIオペレーション AWS SDK for JavaScript について詳しく説明します。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Lambda関数を実行するためのスケジュールされたイベントを作成する
Amazon イベントを使用して、 AWS Lambda関数を呼び出すスケジュールされた CloudWatch イベントを作成できます。cron 式を使用して Lambda 関数が呼び出されるタイミングをスケジュールするように CloudWatch イベントを設定できます。例えば、Lambda 関数を毎日呼び出すように CloudWatch イベントをスケジュールできます。
AWS Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。Lambda 関数は、さまざまなプログラミング言語で作成できます。AWS Lambdaの詳細については、とはAWS Lambdaを参照してください。
このチュートリアルでは、Lambda ランタイム API を使用して Lambda JavaScript 関数を作成します。この例では、特定のユースケースを実行する異なる AWS サービスを呼び出します。例えば、次の図に示すように、組織が 1 周年記念日に従業員を祝福するモバイルテキストメッセージを送信するとします。
このチュートリアルは完了までに約 20 分かかります。
このチュートリアルでは、 JavaScript ロジックを使用して、このユースケースを実行するソリューションを作成する方法を示します。例えば、データベースを読み取り、1 年記念日に達した従業員を特定する方法、データを処理する方法、Lambda 関数を使用してテキストメッセージを送信する方法について説明します。次に、cron 式を使用して Lambda 関数を毎日平日に呼び出す方法を説明します。
このAWSチュートリアルでは、これらのフィールドを含む従業員という Amazon DynamoDB 表を使用します。
id - 表のプライマリキー。
名前 - 従業員のファーストネーム。
電話 - 従業員の電話番号。
開始日 - 従業員の入社日。
重要
完了するためのコスト、このドキュメントに含まれる AWSサービスは、 AWSFree Tier(無料利用枠)に含まれます。ただし、このチュートリアルを完了した後は、必ずすべてのリソースを終了して料金が発生しないようにしてください。
アプリケーションを構築するには、
前提条件タスク
この例をセットアップして実行するには、まず次のタスクを完了する必要があります。
-
これらの Node.js TypeScript の例を実行するようにプロジェクト環境を設定し、必要な AWS SDK for JavaScriptおよびサードパーティーモジュールをインストールします。「」の手順に従います GitHub
。 -
ユーザーの認証情報を使用して、共有設定ファイルを作成します。共有認証情報ファイルの提供の詳細については、「AWS SDK とツールのリファレンスガイド」の「共有設定ファイルおよび認証情報ファイル」を参照してください。
AWS リソースを作成します
このチュートリアルでは、以下のリソースが必要です。
-
Idという名前のキーと前の図に示されているフィールドを持つEmployeeという「Amazon Dyn[oDB」(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 テンプレートは、 でAWS CDK入手可能な を使用して生成されました。 GitHub
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 User Guide」 (ユーザーガイド)を参照してください。AWS CloudFormationダッシュボードでスタックを開き、Resources(リソース)タブを選択して、コンソールにリソースのリストを表示します。チュートリアルにはこれらが必要です。
スタックが作成されたら、DynamoDB 表にデータを入力します。で説明されているように、AWS SDK for JavaScriptを使用してDynamoDB表にデータを入力します。
DynamoDB 表にデータを入力します。
テーブルにデータを入力するには、まず 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 DynamoDB 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. 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 の設定
まず、必要なAWS SDK for JavaScript(v3) モジュールとコマンド、DynamoDBClient
と DynamoDBScanCommand
およびSNSClient
とAmazon SNS PublishCommand
コマンドをインポートします。REGION
をAWS地域に置き換えます。次に、今日の日付を計算し、パラメータに割り当てます。次に、ScanCommand
パラメータを作成します。TABLE_NAME
を、この例のAWS リソースを作成します セクションで作成したテーブルの名に置き換えます。
以下のコードスニペットは、このステップを示しています (詳細な例については、Lambda 関数をバンドルします を参照してください)。
"use strict"; // Load the required clients and commands. const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns"); //Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // 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 the the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "TABLE_NAME", };
DynamoDB テーブルをスキャンします
まず、Amazon SNS PublishCommand
を使用してテキストメッセージを公開するために sendText
と呼ばれる非同期/待機関数を作成します。次に、今日が勤務記念日である従業員の DynamoDB テーブルをスキャンし、sendText
関数を呼び出してこれらの従業員にテキストメッセージを送信する try
ブロックパターンを追加します。エラーが発生した場合は、catch
ブロックされます。
以下のコードスニペットは、このステップを示しています (詳細な例については、Lambda 関数をバンドルします を参照してください)。
exports.handler = async (event, context, callback) => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { const data = await snsclient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to check identify employees with work anniversary today. const data = await dbclient.send(new ScanCommand(params)); data.Items.forEach(function (element, index, array) { 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.js
と必要な AWS SDK for JavaScript のモジュールを index.js
いうバンドルファイルにバンドルする方法について説明します。
まだの場合は、この例の前提条件タスクに従ってwebpackをインストールしてください。
注記
Webpack の詳細については、Webpack でアプリケーションをバンドルする を参照してください。
コマンドラインで以下を実行して、この例 JavaScript の を
<index.js>
というファイルにバンドルします。webpack mylamdbafunction.js --mode development --target node --devtool false --output-library-target umd -o index.js
重要
出力の名前が
index.js
であることに注意してください。Lambda関数が機能するにはindex.js
ハンドラーが必要です。バンドルされた出力ファイル
index.js
を、my-lambda-function.zip
という名前の ZIP ファイルに圧縮します。このチュートリアルのAWS リソースを作成します トピックで作成したAmazonS3バケットに
mylambdafunction.zip
をアップロードします。
これはmylambdafunction.js
の完全なブラウザスクリプトコードです。
"use strict"; // Load the required clients and commands. const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns"); //Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // 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 the the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "TABLE_NAME", }; // Create the client service objects. const dbclient = new DynamoDBClient({ region: REGION }); const snsclient = new SNSClient({ region: REGION }); exports.handler = async (event, context, callback) => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { const data = await snsclient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to check identify employees with work anniversary today. const data = await dbclient.send(new ScanCommand(params)); data.Items.forEach(function (element, index, array) { 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 関数をデプロイします
プロジェクトのルートで、lambda-function-setup.js
ファイルを作成し、それに以下の内容をペーストします。
BUCKET_NAME
を Lambda 関数の ZIP バージョンをアップロードした Amazon S3 バケットの名前に置き換えます。ZIP_FILE_NAME
(ZIPファイル名)を、Lambda関数のZIPバージョンの名前に置き換えます。IAM_ROLE_ARN
を、このチュートリアルのAWS リソースを作成します のトピックで作成したIAMロールのAmazonリソース番号(ARN)に置き換えます。LAMBDA_FUNCTION_NAME
(Lambdaファンクション名)をLambda関数の名前に置き換えます。
// Load the required Lambda client and commands. const { CreateFunctionCommand, } = require("@aws-sdk/client-lambda"); const { lambdaClient } = require("..libs/lambdaClient.js"); // Instantiate an Lambda client service object. const lambda = new LambdaClient({ region: REGION }); // 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 the each anniversary of their start-date.", }; const run = async () => { try { const data = await lambda.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.js
このコード例は、 で GitHub
Lambda 関数を呼び出す CloudWatch ように を設定する
Lambda 関数を呼び出す CloudWatch ように を設定するには:
-
Lambda コンソールで [Functions (関数)] ページを開きます。
-
Lambda 関数を選択します。
-
[Designer] で、[Add trigger] を選択します。
-
トリガータイプを CloudWatch Events/EventBridge に設定します。
-
ルールで、 Create a new rule(新規ルールの作成)を選択します。
-
ルール名とルールの説明を入力します。
-
ルールタイプで、 Schedule expression(スケジュール式)を選びます。
-
Schedule expression(スケジュール式)フィールドには、cron 式を入力します。例えば、cron(0 12 ? * MON-FRI *)(cron (0 12? * 月-金 *))。
-
[追加] を選択します。
注記
詳細については、「 CloudWatch イベントで Lambda を使用する」を参照してください。
リソースを削除します
お疲れ様でした。を使用して、Amazon CloudWatch のスケジュールされたイベントを通じて Lambda 関数を呼び出しましたAWS SDK for JavaScript。このチュートリアルの冒頭で説明したように、このチュートリアルを進めたうえで、作成したすべてのリソースを終了して、料金が発生しないようにしてください。これを行うには、このチュートリアルの AWS リソースを作成します トピックで作成した AWS CloudFormation スタックを以下のように削除します。
-
AWS CloudFormation コンソール
を開きます。 「スタック」ページで、スタックを選択します。
[削除] をクリックします。