AWS Lambda関数を実行するためのスケジュールされたイベントを作成する - AWS SDK for JavaScript

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 周年記念日に従業員を祝福するモバイルテキストメッセージを送信するとします。

DynamoDB テーブル

このチュートリアルは完了までに約 20 分かかります。

このチュートリアルでは、 JavaScript ロジックを使用して、このユースケースを実行するソリューションを作成する方法を示します。例えば、データベースを読み取り、1 年記念日に達した従業員を特定する方法、データを処理する方法、Lambda 関数を使用してテキストメッセージを送信する方法について説明します。次に、cron 式を使用して Lambda 関数を毎日平日に呼び出す方法を説明します。

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

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

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

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

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

DynamoDB テーブル
重要

完了するためのコスト、このドキュメントに含まれる 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 スタックを作成するには:

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

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

    注記

    AWS CloudFormation テンプレートは、 でAWS CDK入手可能な を使用して生成されました。 GitHubAWS 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 User Guide」 (ユーザーガイド)を参照してください。

    AWS CloudFormationダッシュボードでスタックを開き、Resources(リソース)タブを選択して、コンソールにリソースのリストを表示します。チュートリアルにはこれらが必要です。

  4. スタックが作成されたら、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に という名前のファイルを作成し、そこにコンテンツをコピー 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. 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 いうバンドルファイルにバンドルする方法について説明します。

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

    注記

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

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

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

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

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

  4. このチュートリアルの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 ように を設定するには:

  1. Lambda コンソールで [Functions (関数)] ページを開きます。

  2. Lambda 関数を選択します。

  3. [Designer] で、[Add trigger] を選択します。

  4. トリガータイプを CloudWatch Events/EventBridge に設定します。

  5. ルールで、 Create a new rule(新規ルールの作成)を選択します。

  6. ルール名とルールの説明を入力します。

  7. ルールタイプで、 Schedule expression(スケジュール式)を選びます。

  8. Schedule expression(スケジュール式)フィールドには、cron 式を入力します。例えば、cron(0 12 ? * MON-FRI *)(cron (0 12? * 月-金 *))。

  9. [追加] を選択します。

    注記

    詳細については、「 CloudWatch イベントで Lambda を使用する」を参照してください。

リソースを削除します

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

  1. AWS CloudFormation コンソールを開きます。

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

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