상권's

AWS 람다 함수로 특정 시간만 api 호출하기 본문

~2022 작성 글/TIL

AWS 람다 함수로 특정 시간만 api 호출하기

라마치 2022. 9. 18. 15:43

현재 진행 중인 프로젝트에서 nft를 staking하면 매일 12시에 포인트를 지급해주는 기능이 있어 AWS 람다를 이용해서 해당 시간에 특정 api를 호출하는 기능을 만들어 보았습니다.

 

먼저 AWS 콘솔에 로그인 후 lambda를 검색합니다.

람다로 이동 후 테스트용 함수를 생성하기 위해 함수 생성로 이동합니다.

함수 이름을 입력하고, 런타임을 설정합니다. 저는 node를 사용하기에 아래와 같이 설정해보았습니다.

함수를 생성하면 아래와 같은 화면이 나타납니다. 아래에 있는 코드 소스가 해당 람다 함수가 호출될 때 사용되는 코드입니다.

먼저 프로젝트에서 사용하는 api는 특정 값을 파라미터로 넣어야하기 때문에 코드에서 사용하기 위해 환경 변수를 추가해보겠습니다. 아래와 같이 구성 탭으로 이동 후 환경 변수를 추가해줍니다.

testEnv 키에 process.envTest라는 값을 할당해주었습니다.

환경 변수 저장 후 코드 소스를 위와 같이 수정해서 함수가 잘 실행되는 지, 환경 변수가 잘 출력되는 지 확인해보겠습니다.

 

코드 수정 후 꼭 deploy를 해야 변경된 코드로 테스트가 가능하기 때문에 deploy합니다. 

test하기 위해서는 테스트 이벤트를 만들어야 합니다. 별도의 기능이 필요하지 않기 때문에 이름만 설정하고 테스트 이벤트를 생성합니다.

테스트 이벤트 생성 후 Test를 실행하면 위와 같이 test 결과를 확인할 수 있습니다.

 

단, test를 하게 되면 코드가 실제로 실행되기 때문에 api 호출 시 유의해야 합니다.

그리고 코드 수정 후 deploy할 때, deploy가 정상적으로 완료되었다는 안내가 뜨기 전에 test하게 되면 이전의 코드로 test 되기 때문에 짧은 시간이지만 함수가 정상적으로 업데이트 된 후 하셔야 합니다.

 

코드가 정상적으로 돌아가는 것을 확인했으니, 특정 시간마다 해당 코드를 실행할 수 있도록 트리거를 생성해보겠습니다.

 

함수 개요에서 트리거 추가 클릭하면 아래와 같은 화면이 나오는 데, 특정 시간 마다 함수를 실행시키기 위해서 EventBridge로 트리거를 만들겠습니다.

 

규칙 이름을 입력하고, 예약 표현식을 작성합니다. 

 

테스트로 매 3분마다 실행시키기 위해서 cron(0/3 * * * ? *)을 입력해주었습니다.

트리거 추가를 마치면 위와 같이 함수 개요가 변경되는 것을 확인할 수 있으며, 트리거 탭에서 규칙을 클릭하면 다음 실행 예정 시간을 확인할 수 있습니다.

이렇게 람다 함수와 트리거를 만들면 cloudWatch를 통해서 트리거에 의해 함수가 실행된 결과를 확인할 수 있습니다.

 

먼저, 모니터링 탭으로 이동 후 cloudWatch에서 로그 보기를 클릭하면 아래와 같이 로그가 확인됩니다.

로그 스트림을 보면 코드 소스가 실행된 시간이 14시54분, 14시57분으로 3분 마다 실행됨을 확인할 수 있습니다.

 

저는 특정 api를 호출해야되기 때문에 다음과 같은 코드 소스를 작성해주었습니다.

const https = require('https');
const { KEY } = process.env;

function request() {
  const options = {
    hostname: 'api.blahblah.com',
    path: `/blah//${KEY}`,
    method: 'POST',
  };

  return new Promise((resolve, reject) => {
    const req = https.request(options, res => {
	..중략..
  });
}

exports.handler = async event => {
  try {
    const result = await request();
    console.log('result : ️', result);
  } catch (error) {
    console.log('Error : ️', error);
  }
};

 

 

현재 가동 중인 서비스에서 해당 기능들이 추가되었고, 추가 이후 실행되는 과정에서 추가적으로 고려한 사항들에 대해서 알려드리겠습니다.

 

먼저, 람다 함수는 지정된 시간을 초과해서 함수가 실행될 경우, 함수를 중단 시키고 재가동 시킵니다.

저의 경우, 테스트하고 배포할 당시에만 해도 시간이 오래 걸리질 않아 이 부분을 인지하지 못하고 있었고, 함수가 처리할 데이터 양이 많아져서 두 번 실행되는 문제가 발생해 알게 되었습니다.

 

함수 실행 제한 시간이 기본값으로는 3초인데, 처리 시간이 오래 걸릴 경우 아래와 같이 일반 구성에서 제한 시간을 수정해 주어야 합니다.

이 제한 시간에 걸릴 경우 다음과 같이 task time out이 발생하며, 저는 1분 이후에 다시 함수가 동작했습니다.

2022-09-18T03:00:10.923Z 7@#$^&#ac-012c-4$%8-a*&3-d%$^#^$%#^04 Task timed out 
after 3.01 seconds

이 경우, 람다가 호출한 함수의 error나 결과를 리턴하지 않고 time out이 됩니다.

 

비동기 함수가 error나 time out의 경우 재시도 횟수를 설정할 수 있습니다. 구성에서 비동기식 호출을 이용해서 재시도 횟수를 설정하면 됩니다.

현재 프로젝트를 맡으면서 처음으로 lambda함수를 사용해봤는데, 처음 학습할 때 제한 시간이나 재시도 횟수 등 설정값과 에러, test 등에 대해서 숙지했다면 시간 초과로 인한 두 번 호출, deploy 후 test, test 시 실제 코드 동작 등을 알 수 있었을 텐데 아쉬움이 많습니다.

 

이번 상황을 토대로 새로운 것을 학습할 때 단순히 동작에만 관심을 가지지 않고, 세세한 부분까지 학습해 보겠습니다.

Comments