환경 세팅
먼저 lambda 함수를 만든 과정이다.
함수생성 버튼을 누른다.
블루프린트를 사용하면 기존에 개발자들이 만들어놓은 툴을 가져올 수 있다.
난 새로작성 클릭~
아 그리고 권한은 일단 기본 권한을 주었다. 현재
AccessDeniedException:
에러 때문에 고생하고 있는데 아마 권한 관련돼서 생긴 에러같다... IAM권한에 대해 더 공부해 봐야 겠다.
다음으로 axios 라이브러리를 가져오기 위해 라이브러리 zip파일을 올려주자.
zip파일의 구조는 nodejs/nodemodules 여야 aws에서 파일을 읽을 수 있다. 원래 layer를 생성해서 하는 방식을 시도했는데 계속 오류가 나서 그냥 function파일 안에 라이브러리를 올려버렸다.
다음과 같이 파일이 생긴것을 볼 수 있다.
이제 lambda function 역할을 할 파일을 만들어줘야 하는데 '런타임 설정'에 있는 handler이름과 일치시킨다.
다음과 같이 생성한다.
삽질 과정
AWS lambda[1] 글에서 봤듯이 원래 계획은 이랬다.
함수 A는 pos 서버를 키거나 점주가 autoEndTime을 수정하면 trigger된다. 함수 A는 pos 서버로부터 모든 store의 autoEndTime정보를 받아온다. 그리고 각 autoEndTime별로 eventBridge trigger와 lambda function을 동기적으로 생성한다.
원래 계획은 이랬는데 생각해보니 여러 lambda function을 만들면 db에서 store정보 탐색하는 시간을 줄일 수는 있겠지만 저번 getAllStore 알고리즘 issue에서 깨달았듯이 10만개정도의 data를 탐색하는 것으로는 latency가 발생하지않는다. 따라서 lambda function을 괜히 많이 만들게 되어 관리만 힘들어지는 것이다.
바꾼 방법은 lambda function은 setEndTime, autoEndStore 두개만 둔다. 위에서의 함수 A역할을 setEndTime이 한다. 차이점은autoEndStore에 eventBridge 를 동기적으로 연결해주기만 하고lambda function을 생성하지는 않는다는 것이다.
함수 autoEndStore는 pos 서버의 autoEndStore API를 호출한다. autoEndStore API는 현재 시간이 autoEndTime으로 설정되어 있는 모든 store을 db에서 불러오고 마감이 안된 store가 있으면 마감처리를 하는 API 이다. 그런데 아래와 같은 ERROR가 발생했다.
{
"statusCode": 200,
"body": "\"Hello aaaa Lambda!\""
}
Function Logs
START RequestId: c170d9ff-6a87-4bbc-8e8f-42ce364d9857 Version: $LATEST
2022-05-16T12:02:13.950Z c170d9ff-6a87-4bbc-8e8f-42ce364d9857 INFO ihihihihihi
2022-05-16T12:02:14.090Z c170d9ff-6a87-4bbc-8e8f-42ce364d9857 INFO fdsfsdfsdfsdfsdfsds
2022-05-16T12:02:14.390Z c170d9ff-6a87-4bbc-8e8f-42ce364d9857 INFO AccessDeniedException: User: arn:aws:sts::640446638768:assumed-role/setEndTimes-role-xk43v9u6/setEndTimes is not authorized to perform: events:PutRule on resource: arn:aws:events:us-west-1:640446638768:rule/rule0200 because no identity-based policy allows the events:PutRule action
문제 해결
"Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ]
policy생성할 때 JSON에 위에 코드 붙여 놓으면 fullAccess권한을 줄 수 있다. 해당 policy로 role 생성해서 lambda 함수에 붙이니까 권한 문제가 해결되고 트리거가 정상적으로 만들어졌다.