공통 개념, 기타 작업에 해당하는 글 3

[Firebase] 예약 함수 (Schedule functions) 사용법

공통 개념, 기타 작업|2022. 4. 29. 20:47

Firebase cloudFunctions 관련 내용은 몇 번 봤는데, schedule functions 관련은 자료를 많이 찾지 못해서 겸사겸사 기록용으로...

참고한 건 firebase 공식 문서.

 

함수 예약  |  Firebase Documentation

Join Firebase at Google I/O online May 11-12, 2022. Register now 의견 보내기 함수 예약 지정된 시간에 함수를 실행하도록 예약하려면 functions.pubsub.schedule().onRun()을 사용하세요. 이 간편한 메서드는 Pub/Sub 주제

firebase.google.com

문서에 따르면, 예약 함수(Schedule functions)란 사용자가 정한 일정에 따라 실행되도록 만든 함수를 말한다고 한다. 매일 정오에 함수가 실행되게 한다든지, 매분 실행되게 한다든지, 매달 특정 날짜에 실행되게 한다든지... 등의 작업을 할 수 있다.

이하 Firebase Functions 작업을 위한 기본 환경이 갖춰져 있다는 전제 하에 작성한다.

 

1. 환경 설정

특별히 해줄 환경 설정은 없다. 배포 방법도 Firebase Functions 배포하던 방법대로 하면 되고, 작성 역시 다른 functions와 함께 index.js에 작성하면 된다.

 

2. 함수 format

firebase 공식 문서에 적힌 그대로 사용해도 문제는 없겠지만, 그렇게 작성하면 설정 변경으로 번거로워질 여지가 있어서...

exports.test = functions.region('asia-northeast3')
    .runWith({ timeoutSeconds: 300 }) // timeout
    .pubsub
    .schedule('0 1 * * *') // 실행 주기
    .timeZone('Asia/Seoul') // timezone
    .onRun((context) => {
        console.log('Hello world');
        return null;
});

pubsub를 제외하면 차례대로 Region, Timeout 설정, Schedule(실행 주기), TimeZone 설정이다.

  • Timeout: 설정된 시간이 지나도록 함수가 종료되지 않으면, Firebase 차원에서 강제로 종료시킨다. 설정해두지 않으면 기본으로 1분이 적용되며, 최대 9분(540초)까지 설정할 수 있다.
  • Schedule: 함수를 실행시킬 작업 일정. 정해진 시간이 되면 onRun에 작성한 함수가 실행된다. 문서 예시대로 every 5 minutes, every 1 hours 등으로도 적을 수 있지만 보다 정확한 시각을 정하려면 아래 링크의 양식을 참고한다. 위 코드에서 정한 작업 일정은 매일 새벽 1시가 된다.
 

크론 작업 일정 구성  |  Cloud Scheduler 문서  |  Google Cloud

의견 보내기 크론 작업 일정 구성 이 페이지에서는 일정 설명을 위해 unix-cron 형식 사용에 대해 간단히 설명합니다. 또한 기존 App Engine 크론 구문을 사용하여 일정을 설명할 수 있습니다. 작업 일

cloud.google.com

 

3. 배포 및 디버그

  • 디버깅은 현재 function ignored because the pubsub emulator does not exist or is not running.에러와 함께 계속 실패하기만 해서 패스...
  • 대신 함수를 배포해가며 테스트했다.
firebase deploy --only functions
firebase hosting:channel:deploy test
firebase deploy --only functions:test,functions:test2

 

4. Google Cloud console

  • 배포한 함수는 Firebase Functions 탭에서 확인할 수 있는데, 예약 함수가 아닌 다른 함수들과 마찬가지로 Google Cloud console의 Cloud Functions 탭에서도 확인할 수 있다.

'공통 개념, 기타 작업' 카테고리의 다른 글

loop break  (0) 2022.03.17
[AWS lamda] response 양식 및 encoding 문제  (0) 2022.03.17

댓글()

loop break

공통 개념, 기타 작업|2022. 3. 17. 13:38

return을 사용할 수 없는 상황에서 이중(혹은 그 이상) for문을 돌릴 때 안쪽 for문 안에서 완전히 멈추고 싶은데 코드가 지저분해지기 싫을 때...

keyword:
for(var i = 0; i < length; i++){
	for(var j = 0; j < length; j++){
		if(j == 1) break keyword;
	}
}

이렇게 keyword를 사용하면 된다. 원하는 keyword를 하나 설정해서 끝낼 for문에 지정하고 break문에 지정한 키워드를 함께 사용하는 방법.

댓글()

[AWS lamda] response 양식 및 encoding 문제

공통 개념, 기타 작업|2022. 3. 17. 13:31

AWS lamda로 api를 작성하는 도중 인코딩 관련 이슈가 생겨 겸사겸사 정리해보았다.

 

1. response 전달 방식

- return JSON;

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

lamda 첫 생성시 샘플용으로 나오는 코드. 말 그대로 JSON 형식의 response를 return 해주어 전달한다.

 

- context 내 함수

exports.handler = async (event, context) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    context.succeed(response);
};

context.succeed(response), context.fail(error), context.done(error, response)이 있다. succeed는 성공, fail은 실패, done은 어떤 경우에서든 사용이 가능하다.

 

- callback();

exports.handler = async (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    callback(null, response);
};

callback()을 사용하는 방법. context.callbackWaitsForEmptyEventLoop를 false로 설정해주지 않으면 함수가 종료되지 않고 계속 실행중인 느낌이므로 반드시 꺼준다. 자세한 건 공식 문서를 찾아보자.

 

 

AWS Lambda 컨텍스트 객체(Node.js) - AWS Lambda

AWS Lambda 컨텍스트 객체(Node.js) Lambda는 함수를 실행할 때 컨텍스트 객체를 핸들러에 전달합니다. 이 객체는 호출, 함수 및 실행 환경에 관한 정보를 제공하는 메서드 및 속성들을 제공합니다. 컨

docs.aws.amazon.com

 

 

AWS Lambda 함수 핸들러(Node.js) - AWS Lambda

AWS Lambda 함수 핸들러(Node.js) Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 핸들러가 존재하거나 응답을 반환할 때,

docs.aws.amazon.com

 

2. encoding issue

lambda api에서 찍힌 로그에는 인코딩이 제대로 적용되어 나오는데, response를 받은 후의 로그에는 인코딩이 적용되지 않아 깨지는 issue가 있었다. response 양식을 제대로 지키지 않아 생긴 문제로 추측된다.

encoding 이슈가 생겼을 때 전달한 response는 아래와 같았고,

const response = (code, data) => ({ code: code, data: data });

이후 제대로 동작한 response는 아래와 같았다.

const response = (statuseCode, body) => ({
    statusCode: statusCode,
    body: body
});

다음부터는 샘플 코드를 좀 더 신경 쓰는 걸로...

'공통 개념, 기타 작업' 카테고리의 다른 글

[Firebase] 예약 함수 (Schedule functions) 사용법  (0) 2022.04.29
loop break  (0) 2022.03.17

댓글()