메모
2023 년 2 월 22 일 현재 Vercel은 공식적으로 서버리스 및 에지 기능을 트리거하기 위해 내장 CRON 작업을 제공하고 있습니다. 자세한 내용은 문서를 읽으십시오. 이 기능은 베타 단계에서만 무료라는 점을 명심하십시오. 일반 가용성에 대한 유료 기능이므로 GitHub 조치 경로는 완전한 무료 옵션과 관련이 있습니다.
vercel ▲에서 github 조치가있는 Cron 작업 ▲
Vercel 플랫폼은 이벤트 중심이므로 실행중인 서버를 유지 관리하지 않으므로 Next.js 응용 프로그램에서 API 경로 또는 서버리스 기능에서 전화를 예약 할 수 없습니다. 예정된 CRON 작업을 제공하는 많은 기존 서비스가 있지만 궁극적으로 GitHub Actions가 GitHub에 살고있는 모든 프로젝트와 잘 통합되기 때문에 완전 무료입니다.
모든 github 동작은 리포지토리의 디렉토리 .github/workflows/ 에 존재하며 Yaml로 작성됩니다.
.github/workflows/starter.yaml 작업을 시작하는 데 도움이되는 가장 기본적인 워크 플로입니다.
예정된 이벤트를 사용하면 지정된 간격으로 작업을 실행할 수 있습니다. 예를 들어, 제공된 워크 플로 .github/workflows/scheduled.yaml 60 분마다 CURL로 HTTP 요청을 실행합니다.
name : Hourly cron job
on :
schedule :
- cron : ' */60 * * * * '
jobs :
cron :
runs-on : ubuntu-latest
steps :
- name : Hourly cron job
run : |
curl --request POST
--url 'https://example.com/api/task'
--header 'Authorization: Bearer ${{ secrets.ACTION_KEY }}'Cron Schedule Expressions를 작성하는 데 어려움이 있다면 Crontab Guru를 살펴보십시오.
API 경로 및 서버리스 기능은 vercel에서 Next.js를 사용하여 API를 구축하기위한 간단한 솔루션을 제공합니다. 폴더 pages/api 내부의 모든 파일은 /api/* 에 매핑되며 page 대신 API 엔드 포인트로 처리됩니다.
런타임에 관계없이 Serverless 함수를 사용하는 경우 파일을 프로젝트 루트의 /api/ 디렉토리에 넣어야합니다.
GitHub 작업으로 API 경로 및 서버리스 기능을 안전하게 트리거하려면 API Call의 헤더에 권한 부여 키를 제공해야합니다.이 호출은 다음에 다음.js 응용 프로그램의 해당 키와 비교됩니다.
GitHub 저장소에 암호화 된 비밀을 추가하고 이전 코드 스 니펫과 같이 HTTP 요청의 헤더와 함께 전달하여이를 달성 할 수 있습니다. GitHub 리포지토리에 키를 추가하는 것과 함께 다음.js 응용 프로그램, 바람직하게는 환경 변수를 통해 액세스해야합니다.
예제 pages/api/example.js 이 권한 부여 흐름을 구현합니다.
export default function handler ( req , res ) {
const { APP_KEY } = process . env ;
const { ACTION_KEY } = req . headers . authorization . split ( " " ) [ 1 ] ;
try {
if ( ACTION_KEY === APP_KEY ) {
// Process the POST request
res . status ( 200 ) . json ( { success : 'true' } )
} else {
res . status ( 401 )
}
} catch ( err ) {
res . status ( 500 )
}
} TypeScript에 pages/api/example.ts 사용하십시오.
import type { NextApiRequest , NextApiResponse } from 'next'
export default function handler ( req : NextApiRequest , res : NextApiResponse ) {
const { APP_KEY } = process . env ;
const { ACTION_KEY } = req . headers . authorization . split ( " " ) [ 1 ] ;
try {
if ( ACTION_KEY === APP_KEY ) {
// Process the POST request
res . status ( 200 ) . json ( { success : 'true' } )
} else {
res . status ( 401 )
}
} catch ( err ) {
res . status ( 500 )
}
}