API Gateway를 사용해 RESTful API 를 생성하고, 이를 배포하여 만들어진 URL에 대해 aws의 lambda로 호출을 기록하고자 한다.
lambda의 기능! 호출이 들어올때만 실행되는 함수임을 기억하면 이런 일도 가능하구나...! 싶다.
먼저 이전 내용은 중구난방이었기에 다시한번 API Gateway와 lambda를 연결해보도록 하자.
AWS 서비스를 사용하는데 권한을 부여할 역활을 생성해야 한다. 이거 중요,, 개거생 했당!
IAM ??
IAM 역할은 신뢰하는 개체에 권한을 부여하는 안전한 방법이다.
내가 사용할 서비스는 API Gateway와 lambda이다. lambda의 트리거로 API Gateway를 연결할 것인데 이때 lambda를 동작하는 역활에게 API Gateway에 대한 여러 권한을 부여해 주어야 한다.
lambda를 사용하면서 API Gateway에 대한 권한을 가진 역활을 생성한다. 이때 어떤 API Gateway권한을 허용할 것인지 검색하면 4가지 옵션이 나온다.
- AmazonAPIGatewayAdministrator
- AmazonAPIGatewayInvokeFullAccess
- AmazonAPIGatewayPushToCloudWatchLogs
- AmazonAugmentedAIIntegratedAPIAccess
이중에서 AmazonAPIGatewayPushToCloudWatchLogs 정책을 연결해줄것...!!!!!!!!
역할 이름은 lambda_main_iam
이라고 지었다. (역할이 14개라 헷갈려서...)
함수이름은 favorite_fruit
라고 지었다!
그리고 나는 lambda함수를 python
으로 작성할 것이고, 버전은 3.7
이기 때문에 해당하는 언어를 선택했다.
그리고 중요한 기본 실행 역할 변경 아까 만든 IAM을 지정해 준다.
함수를 생성하면 내가 지정한 함수이름으로 만들어진 폴더 안에 lambda_function.py
라는 파일이 만들어져 있고 그 안에 예제 lambda코드가 작성되어 있다.
먼저 이 내용을 건드리지 말고 API Gateway와 연결 후 테스트 해 보도록 하자!
REST API를 생성할것이기 때문에 해당 옵션을 선택해 생성하도록 하자! (사실 다른건 잘 모른다)
엔드포인트 유형도 3가지가 있는데 일단 지역
으로 선택...! 최적화된 에지도 해봤는데 사실 엄청 간단하게만 작동해봐서 다른점은 아직 모르게따
그리고 나서 URL경로를 만들어 준다.!
간단하게 /fruit/{fruit_name} 으로 fruit_name
의 값을 path parameter로 받는 형태로 작성하였고, method는 GET만 작성하였다.
그리고 나서 method의 통합 포인트
로 아까 만든 lambda함수를 연결하도록 한다. (lambda함수의 arn주소를 복붙하면 자동으로 lambda함수 이름으로 작성된다.)
내용을 저장한다고 하면 이처럼 해당 API Gateway에 lambda함수에 대한 권한을 추가한다고 알람이 뜬다!
lambda함수로 들어온 내용을 가공없이 그대로 출력하게 하기 위해 다음과 같이 설정하도록 한다.!
먼저 메소드 화면에서 통합 요청
을 들어간다. 그리고 content/type으로 application/json
을 선택하고 메소드 요청 패스스루
를 선택하면 다음의 코드가 자동을 작성된다. 저장만 하면 끝!
다시 lambda 함수 내용을 보면 트리거로 방금 생성한 API Gateway가 지정되어있는걸 확인할 수 있다.
먼저 API Gateway에서 제공하는 테스트를 사용해 보자!
아직 lambda함수 코드가 예제코드이기 때문에 큰 에러없이 "Hello from Lambda!" 가 출력될 것이다.
이를 lambda기능의 모니터링을 통해 CloudWatch에서 로그를 확인해 보자!
print문이 없기 때문에 log에도 별다른 출력문이 찍히지 않는다!
이제 path parameter
에 대한 값이 출력되도록 코드를 수정해 보자. 이를 위해선 lambda_handler의 parameter값인 event의 활용이 필요하다.
먼저 event라는 값에는 어떤것이 담기는지 확인해 보자
헐 아무것도 없다. 있어야되는데 없다. 정책 연결을 제대로 안해주었기 때문이다!!!!!!!
앞전에 IAM 만들때 API Gateway에 대한 정책을 하나만 연결했다. 그것만 하면 되는줄알았다. 그치만 event가 제대로 찍히지 않으니 다른 정책도 연결해 주어야 하나보다!! 이때 계속해서 event에 key가 없어 event속의 정보를 얻어내려 할때마다 KeyError
가 나더라..........
하나씩 추가해보자
결과 : event 안찍힘
결과 : 안찍힘
결과 : 안찍힘
lambda에 대한 정책도 추가로 연결해보자
결과 : 안찍힘
왜 또 안되...!
되야하는데 안되는것 같아 일단 다시 만들어보기로 했다.
방금 여러 정책이 추가된 역할을 사용해서 lambda와 api gateway를 다시 만들어보자!
먼저 lambda는 re_fruit
라는 이름으로 다시 만들었고, API Gateway의 경우 아까 만든 API에서 리소스만 새로 추가하여 만들었다
그리고 나서 lambda함수에서 event를 출력하도록 코드를 수정하고 test를 진행해 보았다.
path parameter
입력 후
이 외에도 IP주소를 출력하게 할수도 있고 등등 다양한 값을 출력할 수 있다! 어떤 attribute가 있는지는 aws 문서에 나와있다!
예를들어 두가지 케이스에 대해 각각 log가 잘 찍히는지 확인하고 싶다고 가정하자.
그러면 배포된 API의 URL을 어딘가에 입력하고, 입력된 곳을 load되면 log가 기록될 것이다. 이때 그 log가 case1의 것인지, case2의 것인지 바로 판별하고 싶을때!!! 를 위해서 path parameter를 지정해 준 것이다.
https://@주소~~.ap-northeast-2.amazonaws.com/dev/fruit/apple
https://@주소~~.ap-northeast-2.amazonaws.com/dev/fruit/banana
간단하게 POSTMAN으로 확인해 보자!!
lambda의 함수를 다음과 같이 작성하였다.
def lambda_handler(event, context):
print ("fruit name :", event['parmas']['path']['fruit'])
return event['parmas']['path']['fruit']
여기서 print문은 log에 기록될 것이고 return값은 postman의 response에 띄워질 것이다.
API Gateway로 RESTful API를 생성하고, 이를 배포하여 lambda와 연동해 해당 url이 load될때마다 lambda가 실행되는것을 확인할 수 있었다.!!
아직도 너무나 어려운 정책 설정... 다양한 케이스로 사용해보고 얼른 익혀야겠다.!