AWS lamda + api gateway + step function
1. 하고 싶은 것
- 클라이언트 요청 -> (1) 무조건 성공값을 반환 -> (2) 실제 계산, DB 입출력 등
- 이유 : 실제로 하고 싶은 연산이 꽤 오래 걸리고 사용자는 그 결과를 바로 볼 필요가 없음
2. 1차시도 : API gateway -> Lambda1 -> Lambda2
1) lambda2를 실행시키고 바로 "ok"를 반환하는 lambda1 함수를 만듦(둘 다 node.js 8.1)
2) API gateway를 만들고 method로 Post를 추가, CORS 설정, lambda1을 end point로 설정.
-> CORS 설정했는데 테스트하니 안됨.
-> lambda1에서 CORS 헤더를 설정해서 이런식으로 return해야 함
return {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*"
}
}
3) CORS 문제는 발생하지 않으나 lambda2에 진입하지 않음
-> handler에서 return 하는 순간 함수가 종료되고 실행중인 연산을 종료해서 발생하는 문제.
-> callback() 사용.
4) lambda2에서 실제로는 10초 정도면 끝나는 연산을 lambda1에서 설정한 대기시간(30초였음)만큼 기다림
-> lambda1의 대기시간을 10초로 줄였더니 lambda2에서 10초 이상 걸리는 경우 마지막까지 수행하지 못함.
(기나긴 삽질의 시간)
3. 2차시도 : API gateway -> Step function(Lambda1 -> Lambda2)
1) Step function(state machine과 비슷하다고 느꼈다)을 사용하면 될 것 같아서 API gateway가 step function을 호출, step function에서
시작 -> lambda1 -> 끝
-> lambda2
처럼 구성하였으나 lambda1이 바로 리턴하지 못하고 lambda2가 끝날 때까지 기다리는 문제 발생.
(기나긴 삽질의 시간)
4. 3차 시도 : API gateway -> Lambda1 -> Step function(Lambda2)
1) lambda1에서 step function을 호출, step function에서 시작 -> lambda2 -> 끝하는 순서로 구성하니 원하는 대로 나옴. (lambda2에서는 그대로 callback()을 사용). 그러나 한 번 호출 시 총 4번의 request가 발생해 비용면에서 비효율적.
5. 결론 : API gateway -> Step function(lambda2)
1) API gateway의 end point를 step function으로 하나 작업을 정확하기 지정하지 않고, request parameter에 step function arn을 같이 보내주면 그 step function이 실행된다.
post("api url", {
stateMachineArn: "[ARN]",
input: String({CUSTOM PARAMETERS})
})
- 클라이언트 요청 -> (1) 무조건 성공값을 반환 -> (2) 실제 계산, DB 입출력 등
- 이유 : 실제로 하고 싶은 연산이 꽤 오래 걸리고 사용자는 그 결과를 바로 볼 필요가 없음
2. 1차시도 : API gateway -> Lambda1 -> Lambda2
1) lambda2를 실행시키고 바로 "ok"를 반환하는 lambda1 함수를 만듦(둘 다 node.js 8.1)
2) API gateway를 만들고 method로 Post를 추가, CORS 설정, lambda1을 end point로 설정.
-> CORS 설정했는데 테스트하니 안됨.
-> lambda1에서 CORS 헤더를 설정해서 이런식으로 return해야 함
return {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*"
}
}
3) CORS 문제는 발생하지 않으나 lambda2에 진입하지 않음
-> handler에서 return 하는 순간 함수가 종료되고 실행중인 연산을 종료해서 발생하는 문제.
-> callback() 사용.
4) lambda2에서 실제로는 10초 정도면 끝나는 연산을 lambda1에서 설정한 대기시간(30초였음)만큼 기다림
-> lambda1의 대기시간을 10초로 줄였더니 lambda2에서 10초 이상 걸리는 경우 마지막까지 수행하지 못함.
(기나긴 삽질의 시간)
3. 2차시도 : API gateway -> Step function(Lambda1 -> Lambda2)
1) Step function(state machine과 비슷하다고 느꼈다)을 사용하면 될 것 같아서 API gateway가 step function을 호출, step function에서
시작 -> lambda1 -> 끝
-> lambda2
처럼 구성하였으나 lambda1이 바로 리턴하지 못하고 lambda2가 끝날 때까지 기다리는 문제 발생.
(기나긴 삽질의 시간)
4. 3차 시도 : API gateway -> Lambda1 -> Step function(Lambda2)
1) lambda1에서 step function을 호출, step function에서 시작 -> lambda2 -> 끝하는 순서로 구성하니 원하는 대로 나옴. (lambda2에서는 그대로 callback()을 사용). 그러나 한 번 호출 시 총 4번의 request가 발생해 비용면에서 비효율적.
5. 결론 : API gateway -> Step function(lambda2)
1) API gateway의 end point를 step function으로 하나 작업을 정확하기 지정하지 않고, request parameter에 step function arn을 같이 보내주면 그 step function이 실행된다.
post("api url", {
stateMachineArn: "[ARN]",
input: String({CUSTOM PARAMETERS})
})