Docs Menu
Docs Home
/ /
Atlas App Services
/

예약된 트리거

이 페이지의 내용

  • 예약된 트리거 생성
  • 구성
  • CRON 표현식
  • 표현식 구문
  • 형식
  • 필드 값
  • 예시
  • 성능 최적화
  • 추가 예시

예약된 트리거를 사용하면 정의한 정기적 일정에 따라 서버 측 로직을 실행할 수 있습니다. 예정된 트리거를 사용하여 매분 문서 업데이트, 야간 보고서 생성, 자동화된 주간 이메일 뉴스레터 발송 등 주기적으로 발생하는 작업을 수행할 수 있습니다.

Atlas App Services UI에서 예정된 트리거를 만들려면,

  1. 왼쪽 탐색 메뉴에서 Build 아래의 Triggers 클릭합니다.

  2. Create a Trigger을 클릭하여 트리거 구성 페이지를 엽니다.

  3. Trigger Type 에 대해 Scheduled을 선택합니다.

앱 서비스 UI에서 트리거 생성
클릭하여 확대

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. 트리거를 배포합니다.

    appservices push

예약된 트리거에는 다음과 같은 구성 옵션이 있습니다.

필드
설명
Trigger Type
type: <string>
Scheduled0}을 선택합니다.
Schedule Type
config.schedule: <string>

필수 사항입니다. Basic 또는 Advanced를 선택할 수 있습니다. 기본 일정은 설정한 간격에 따라 주기적으로 트리거를 실행합니다(예: "5분마다" 또는 "매주 월요일").

고급 일정은 사용자가 정의한 CRON 표현식을 기반으로 트리거를 실행합니다.

Skip Events on Re-Enable
skip_catchup_event: <boolean>
기본적으로 비활성화되어 있습니다. 활성화하면 이 트리거가 비활성화된 동안 발생한 모든 변경 이벤트가 처리되지 않습니다.
Event Type
function_name: <string>

Event Type 섹션에서 트리거가 실행될 때 수행할 작업을 선택합니다. 함수를 실행하거나 AWS EventBridge를 사용하도록 선택할 수 있습니다.

참고

예약된 트리거는 연결된 함수에 인수를 전달하지 않습니다.

Trigger Name
name: <string>
트리거의 이름입니다.

CRON 표현식은 표준 크론 작업 구문을 사용하여 예정된 트리거 가 실행되어야 하는 시점을 정의하는 사용자 정의 문자열입니다. App Services 는 UTC 시간을 기준으로 Trigger CRON 표현식을 실행합니다. App Services 는 CRON 표현식 의 모든 필드가 현재 날짜 및 시간과 일치할 때마다 표현식 과 관련된 트리거하다 를 실행합니다.

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인 경우 해당 필드는 지정된 시간(예: 9:10 AM)에서 10분 후 어느 시점과도 일치합니다.

hour
[0 - 23]

24시간제 기준으로 하루 중 한 시간 이상을 나타냅니다.

예시

CRON 표현식의 hour 필드 값이 15인 경우 필드는 3:00 PM~3:59 PM인 어느 시점과도 일치합니다.

dayOfMonth
[1 - 31]

한 달 중 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년 중 한 달 이상을 나타냅니다.

월은 숫자(예: 2월의 경우 2) 또는 세 글자 문자열(예: 4월의 경우 APR)로 표시할 수 있습니다.

예시

CRON 표현식의 month 필드에 9 값이 있는 경우 해당 필드는 9월 중 어느 시점과도 일치합니다.

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

일주일 중 1일 이상의 날을 나타냅니다.

평일은 숫자(예: 화요일의 경우 2) 또는 세 글자로 된 문자열(예 목요일의 경우 THU)로 표시할 수 있습니다.

예시

CRON 표현식의 weekday 필드 값이 3인 경우 해당 필드는 수요일 언제든지 일치합니다.

CRON 표현식의 각 필드에는 특정 값이나 값 세트로 평가되는 표현식이 포함될 수 있습니다. 다음 표에서는 유효한 필드 값과 표현식에 대해 설명합니다:

표현식 유형
설명
All Values
(*)

가능한 모든 필드 값을 일치시킵니다.

모든 표현식 필드에서 사용할 수 있습니다.

예시

다음 CRON 표현식은 매일 매분에 한 번씩 트리거를 실행하도록 예약합니다.

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

특정 필드 값과 일치합니다. weekdaymonth 이외의 필드의 경우 이 값은 항상 정수가 됩니다. weekday 또는 month 필드는 정수 또는 세 글자 문자열(예: TUE 또는 AUG)일 수 있습니다.

모든 표현식 필드에서 사용할 수 있습니다.

예시

다음 CRON 표현식은 매일 오전 11시(UTC)에 한 번씩 트리거를 실행하도록 예약합니다.

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

특정 값이나 두 개 이상의 필드 표현식과 일치합니다.

모든 표현식 필드에서 사용할 수 있습니다.

예시

다음 CRON 표현식은 1월, 3월, 7월에 매일 오전 11시(UTC)에 한 번씩 트리거가 실행되도록 예약합니다.

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

두 특정 필드 값 사이의 연속된 필드 값 범위와 일치합니다.

모든 표현식 필드에서 사용할 수 있습니다.

예시

다음 CRON 표현식은 매일 1월 1일부터 4월 말까지 UTC 기준 오전 11시에 트리거를 실행하도록 예약합니다.

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 컬렉션에 대한 집계 쿼리를 실행하여 보고서를 생성합니다. 그런 다음 Function은 집계 결과를 store.reports 컬렉션에 저장합니다.

트리거를 구성하는 UI 예시
트리거 구성
{
"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 표현식을 포함한 쿼리 API를 사용하세요. 이렇게 하면 함수의 성능을 향상시키고 함수 메모리 한도에 도달하지 않도록 도와줍니다.

$match 표현식을 사용하는 예약된 트리거에 대한 예시 섹션을 참조하세요.

App Services 앱에 통합된 트리거의 추가 예를 보려면 Github의 트리거 예제를 확인하세요.

돌아가기

인증 트리거