티스토리 뷰

728x90
반응형

API Gateway, AWS Lambda REST API GET 요청 만들기(2가지)

AWS API Gateway, Lambda를 사용해서 GET 요청을 Lambda 함수 내부로 가져오는 예제를 해보자. GET 방식에서 파라미터를 넘길 때는 파라미터가 끝에 쿼리 스트링으로 있는 경우와 url 중간에 존재하는 경우 크게 2가지로 나눌 수 있다.

/cafes?latitude=x&longitude=x
카페의 위도, 경도를 쿼리 스트링으로 넘겨줌

/cafes/123142/reviews
숫자는 ID → cafe ID에 따라 까페의 리뷰들을 요청



url 맨끝에 쿼리 스트링으로 넘겨주는 경우

API Gateway 서비스로가서 API 생성 → REST API(프라이빗 x)로 간 뒤에 위에 화면처름 이름, 유형등을 적고 API를 생성한다.

나오자마자 뜨는 화면을 설명하면 메서드 생성은 GET, POST 같은 메서드를 생성하고, 리소스는 url 리소스를 만든다. 최종적으로 REST API url을 다 만들면 API 배포를 할 수 있다. 배포를 하면 스테이지가 생기고, 스테이지쪽으로 가서 url을 확인하는 등을 할 수 있다. 또 API 키를 헤더에 등록해 키 값이 있어야지만, 결과를 받을 수 있게끔 설정할 수도 있다. 이제 만들어보자.

cafes 리소스를 만들어준다. cors 활성화를 한다. 이젠 쿼리 스트링의 값을 간단하게 가져오는 람다 함수를 만들어보자.

Lambda 서비스로 가서 함수를 생성한다. 이름을 정하고 런타임 python3.8, 기본 람다 권한을 가진 새 역할 생성을 누르고 함수를 생성한다. 제대로 만들때는 IAM 역할에서 Lambda_Fullaccess 권한을 가진 역할을 만들어서 기존 역할 사용에서 그걸 넣어주는게 나중에 편하다.

import json

def lambda_handler(event, context):
    latitude = event['latitude']
    longitude = event['longitude']

    # TODO implement
    return {
        'success': True,
        'data': {
            'latitude': latitude,
            'longitude': longitude
        }
    }

Lambda의 첫 번째 인수 event 객체에 파라미터들이 json 형식으로 넘어온다(python dict형식). 참고

Deploy를 눌러주고, 다시 API Gateway로 가자.

아까 만든 cafes 리소스를 한번 누른뒤 작업 → 메서드 생성 GET을 만들어주면 오른쪽에 GET 설정이 뜬다. 통합유형 Lambda로 하고, 함수 이름을 아까만든 함수를 선택하면 된다. 권한 추가 확인.

메서드 요청으로 가서 URL 쿼리 문자열 파라미터에 GET 요청으로 들어온 쿼리 스트링 key를 모두 적어준다(이거 설정 안해도 잘 된다..매핑 템플릿만 해주면 잘됨).

{ 
    "latitude": "$input.params('latitude')",
    "longitude": "$input.params('longitude')"
}

통합 요청으로 가서 매핑 템플릿에 저런식으로 작성해준다. 그럼 람다 함수에서 event 파라미터에 쿼리 key, value들이 json(dict)형식으로 만들어져서 오게된다.

테스트를 해볼 수 있다. 이젠 실제로 REST API 배포를 해보자.

API 배포를 하면 스테이지 카테고리쪽에 url이 뜬다. url이랑 리소스, 파라미터까지해서 브라우저에 경로를 주게되면 람다 함수에 정의한 return 값 형식으로 나오는 것을 확인할 수 있다. url에 리소스를 꼭 붙여줘야 된다.



파라미터가 url 중간에 있는 경우

위쪽 이미지 참고하면서 진행.

cafes 밑에 리소스를 하나 더 생성한다. 리소스 이름을 {}로 덮어서 파라미터임을 표시해주면 이 값을 람다함수에서 활용할 수 있다. 리소스 이름, 리소스 경로 전부 직접 {}를 덮어서 입력해준다. CORS 활성화도 해준다.

import json

def lambda_handler(event, context):
    cafe_id = event['params']['path']['cafe_id']


    # TODO implement
    return {
        'success': True,
        'data': {
            'cafe_id': cafe_id
        }
    }

위쪽에서 했던 것처럼 GET 메서드를 만들고 바로 통합요청쪽으로 온다(메서드 요청 안해도 된다). 위 코드는 이 때의 람다함수이다.

URL 경로 파라미터에 cafe_id를 매핑해주고, 매핑 템플릿에서 정의된 템플릿이 없는 경우 → application/json → 템플릿 생성에 메서드 요청 패스 스루를 하고 저장한다.

(URL 경로 파라미터 안해주고, 매핑 템플릿만 해줘도 잘된다.)

첫번째처럼 API 배포를 해주면 잘되는 것을 볼 수 있다.



결과(참고)

메서드 실행쪽의 URL 쿼리 문자열 파라미터나 통합 요청쪽의 URL 경로 파라미터, URL 쿼리 문자열 파라미터를 기입안하고 통합 요청쪽에 매핑 템플릿만 잘 작성하면 람다함수에서 key, value가 잘 넘어간다.

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
링크