Docs Menu
Docs Home
/ /
Atlas App Services
/

予定されたTriggers

項目一覧

  • 予定されたトリガーの作成
  • 構成
  • CRON 式
  • 式の構文
  • 形式
  • フィールド値
  • パフォーマンスの最適化
  • その他の例

スケジュールされた Triggers を使用すると、定義した定期的なスケジュールでサーバー側のロジックを実行できます。スケジュールされた Triggers を使用して、毎分ごとのドキュメント更新、夜間レポートの生成、または毎週ごとのメールニュースレターの自動送信など、定期的に発生する作業を行うことができます。

Atlas App Services UI で予定されたトリガーを作成するには:

  1. 左側のナビゲーション メニュー内の Build の下の [Triggers] をクリックします。

  2. Create a Triggerをクリックしてトリガー設定ページを開きます。

  3. Trigger TypeScheduledを選択します。

App Services UI での Trigger の作成。
クリックして拡大します

App Services CLIを使用して予定されたトリガーを作成するには次のようにします。

  1. スケジュールされたトリガー構成ファイルを、ローカル アプリケーション ディレクトリの triggers サブディレクトリに追加します。

    注意

    App Services CLI を使用して、 Basicスケジュールで実行されるトリガーを作成することはできません。インポートされたすべてのスケジュールされたトリガー構成では、CRON 式を指定する必要があります。

    予定されたトリガーの構成ファイルの形式は次のとおりです。

    /triggers/<triggers name>.json
    {
    "type": "SCHEDULED",
    "name": "<Trigger Name>",
    "function_name": "<Trigger Function Name>",
    "config": {
    "schedule": "<CRON expression>"
    },
    "disabled": <boolean>
    }
  2. triggerを配置する

    appservices push

スケジュールされた Triggers には、次の構成オプションがあります。

フィールド
説明
Trigger Type
type: <string>
Scheduled を選択します。
Schedule Type
config.schedule: <string>

必須。[ Basic ] または [ Advanced ] を選択できます。基本スケジュールでは、設定した間隔に基づいてトリガーが定期的に実行されます。たとえば、「5 分ごと」、「毎週月曜日」などです。

高度なスケジュールでは、定義したカスタム CRON 式に基づいてトリガーが実行されます。

Skip Events on Re-Enable
skip_catchup_event: <boolean>
デフォルトで無効です。有効にすると、この trigger が無効になっている間に発生した変更イベントは処理されません。
Event Type
function_name: <string>

Event Type セクションで、trigger が起動したときに実行されるアクションを選択します。関数を実行するか、AWS EventBridge を使用するかを選択できます。

注意

予定されたトリガーは、リンク先の関数に引数を渡しません。

Trigger Name
name: <string>
triggerの名前。

CRON 式は標準の cron ジョブ構文を使用し予定されたトリガーをいつ実行するかを定義するユーザー定義の文字列です。 App Services は UTC 時間 に基づいてTrigger CRON式を実行します。 CRON式のすべてのフィールドが現在の日付と時刻と一致するたびに、App Services は式に関連付けられているトリガーを起動します。

CRON 式は、スペースで区切られた 5 つのフィールドで構成される文字列です。各フィールドは、関連付けられたトリガーが実行されるスケジュールの詳細な部分を定義します。

* * * * *
│ │ │ │ └── weekday...........[0 (SUN) - 6 (SAT)]
│ │ │ └──── month.............[1 (JAN) - 12 (DEC)]
│ │ └────── dayOfMonth........[1 - 31]
│ └──────── hour..............[0 - 23]
└────────── minute............[0 - 59]
フィールド
Valid Values
説明
minute
[0 - 59]

1 時間以内の 1 分以上を表します。

CRON 式のminuteフィールドの値が10の場合、フィールドは毎時10分後の任意の時間に一致します(例:9:10 AM)。

hour
[0 - 23]

24 時間制で 1 日のうちの 1 時間以上を表します。

CRON 式の hour フィールドの値が 15の場合、そのフィールドは 3:00 PM から 3:59 PMまでの任意の時間と一致します。

dayOfMonth
[1 - 31]

1 か月内の 1 日以上を表します。

CRON 式のdayOfMonthフィールドの値が3の場合、フィールドは毎月 3 日の任意の時刻に一致します。

month
1 (JAN) 7 (JUL)
2 (FEB) 8 (AUG)
3 (MAR) 9 (SEP)
4 (APR) 10 (OCT)
5 (MAY) 11 (NOV)
6 (JUN) 12 (DEC)

1 年のうちの 1 つ以上の月を表します。

月は数字(例:2 2 月)または 3 文字の文字列(例:4月は APR)で表すことができます。

CRON 式の month フィールドの値が 9 の場合、このフィールドは 9 月のいずれの時間にも一致します。

weekday
0 (SUN)
1 (MON)
2 (TUE)
3 (WED)
4 (THU)
5 (FRI)
6 (SAT)

1 週間内の 1 日以上を表します。

曜日は、数字(例:火曜日の場合は 2)または 3 文字の文字列(例:木曜日の場合 THU)のどちらかで表すことができます。

CRON 式の weekday フィールドの値が 3 の場合、このフィールドは水曜日いずれの時間にも一致します。

CRON 式の各フィールドには、特定の値、または値の 1 セットとして評価される式を含めることができます。次の表では、有効なフィールド値と式について説明します。

式のタイプ
説明
All Values
(*)

あらゆるフィールド値と一致します。

すべての式フィールドで使用できます。

次の CRON 式は、トリガーを毎日 1 分ごとに実行するように設定します。

* * * * *
Specific Value
(<Value>)

特定のフィールド値に一致します。weekday および month 以外のフィールドの場合、この値は常に整数になります。weekday または month フィールドは、整数または 3 文字の文字列(例: TUE または AUG)のどちらでも構いません。

すべての式フィールドで使用できます。

次の CRON 式は、トリガーを毎日午前 11:00(UTC)に実行するように設定します。

0 11 * * *
List of Values
(<Expression1>,<Expression2>,...)

2 つ以上のフィールド式または特定の値のリストに一致します。

すべての式フィールドで使用できます。

以下の CRON 式は、1 月、3 月、7 月の毎日午前 11:00(UTC)にトリガーを実行するように設定します。

0 11 * 1,3,7 *
Range of Values
(<Start Value>-<End Value>)

2 つの特定のフィールド値の間にあり、かつそれらの値を含む、連続した範囲のフィールド値に一致します。

すべての式フィールドで使用できます。

以下の CRON 式は、1 月 1 日から 4 月末までの毎日午前 11:00(UTC)にトリガーを実行するように設定します。

0 11 * 1-4 *
Modular Time Step
(<Field Expression>/<Step Value>)

ステップ値がフィールド値を余りなしで均等に分割できる任意の時間(つまり Value % Step == 0 の場合)に一致します。

minute および hour 式フィールドで使用できます。

次の CRON 式は、毎時 0 分、25 分、50 分にトリガーを実行するように設定します。

*/25 * * * *

あるオンラインショップが、前日の全売上の日次レポートを作成したいと考えています。彼らはすべての注文を store.orders コレクションに、次のようなドキュメントとして記録します。

{
_id: ObjectId("59cf1860a95168b8f685e378"),
customerId: ObjectId("59cf17e1a95168b8f685e377"),
orderDate: ISODate("2018-06-26T16:20:42.313Z"),
shipDate: ISODate("2018-06-27T08:20:23.311Z"),
orderContents: [
{ qty: 1, name: "Earl Grey Tea Bags - 100ct", price: Decimal128("10.99") }
],
shippingLocation: [
{ location: "Memphis", time: ISODate("2018-06-27T18:22:33.243Z") },
]
}

日次レポートを生成するために、このショップは毎日 7:00 AM UTC に発動するように予定されたトリガーを作成します。このトリガーが発動すると、これにリンクされた Atlas Function generateDailyReport が呼び出され、 store.orders コレクションに対して集計クエリが実行され、レポートが生成されます。そして、その関数は集計の結果を store.reports コレクションに格納します。

トリガーを構成する UI の例
trigger 構成
{
"type": "SCHEDULED",
"name": "reportDailyOrders",
"function_name": "generateDailyReport",
"config": {
"schedule": "0 7 * * *"
},
"disabled": false
}
generateDailyReport
exports = function() {
// Instantiate MongoDB collection handles
const mongodb = context.services.get("mongodb-atlas");
const orders = mongodb.db("store").collection("orders");
const reports = mongodb.db("store").collection("reports");
// Generate the daily report
return orders.aggregate([
// Only report on orders placed since yesterday morning
{ $match: {
orderDate: {
$gte: makeYesterdayMorningDate(),
$lt: makeThisMorningDate()
}
} },
// Add a boolean field that indicates if the order has already shipped
{ $addFields: {
orderHasShipped: {
$cond: {
if: "$shipDate", // if shipDate field exists
then: 1,
else: 0
}
}
} },
// Unwind individual items within each order
{ $unwind: {
path: "$orderContents"
} },
// Calculate summary metrics for yesterday's orders
{ $group: {
_id: "$orderDate",
orderIds: { $addToSet: "$_id" },
numSKUsOrdered: { $sum: 1 },
numItemsOrdered: { $sum: "$orderContents.qty" },
totalSales: { $sum: "$orderContents.price" },
averageOrderSales: { $avg: "$orderContents.price" },
numItemsShipped: { $sum: "$orderHasShipped" },
} },
// Add the total number of orders placed
{ $addFields: {
numOrders: { $size: "$orderIds" }
} }
]).next()
.then(dailyReport => {
reports.insertOne(dailyReport);
})
.catch(err => console.error("Failed to generate report:", err));
};
function makeThisMorningDate() {
return setTimeToMorning(new Date());
}
function makeYesterdayMorningDate() {
const thisMorning = makeThisMorningDate();
const yesterdayMorning = new Date(thisMorning);
yesterdayMorning.setDate(thisMorning.getDate() - 1);
return yesterdayMorning;
}
function setTimeToMorning(date) {
date.setHours(7);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
return date;
}

関数が調べるドキュメントの数を減らすには、$match 式と共に Query API を使用します。これにより関数のパフォーマンスが向上し、関数のメモリ制限に達しなくなります。

$match 式を使用する予定されたトリガーについては、「例」のセクションを参照してください。

App Services App に統合された Triggers の追加例については、 Github の Triggers の例を確認してください。

戻る

認証 Triggers