API Gateway에서 EC2의 application 호출

API Gateway에서 EC2의 application 호출

회사에서 보안문제로, 외부망을 호출할 수 없게하여 EC2 에 다른 포트에 서빙중이었던 서비스에 접근하지 못한다고 proxy 역할을 할 다른 서버를 구축하고자 했다.

그래서 API-Gateway 로 EC2 를 직접 호출하게 했다.

API Gateway를 REST API 유형으로 API 엔드포인트유형을 private으로 생성하기

대상 그룹 생성

EC2에 서비스를 배포해놓았기 때문에, 대상 유형은 인스턴스로 선택

대상 그룹 이름과 프로토콜, VPC 등을 선택한다.

대상은 일단 EC2 앱들을 선택한다.

대상 그룹은 아래와 같이 하는것으로 변경했다


둘 모두 같은 1번 ec2이며
80포트에는 fastapi-server로 /plugin/test 요청 보내면 success를 돌려주는 api가
8002포트에는 /chat?input=hi 이런식으로 보내면 llm 모델 응답을 보내주는 api가 올라가 있다

Network 로드 밸런서 생성

EC2에 가서, 로드밸런서 생성을 선택

기본구성을 해준다.

네트워크 매핑을 해준다, EC2가 있는 VPC를 선택해준다.

-> 주의사항 : 위 캡쳐처럼 app subnet으로 하는것이 아니라 elb를 선택해줘야 한다.

리스너 및 라우팅 설정을 해준다.

대상 그룹으로 연결해준다.

VPC 링크 생성

API Gateway 대시보드로 가서 VPC 링크를 생성한다.

API를 생성한다


VPC 링크 연동 방식으로 API를 생성한다.


-> 주의사항 : 여기서 URL은 NLB의 DNS를 넣어줘야 한다.

주의사항 - NLB의 보안 그룹

NLB의 보안그룹 편집에서, 보안설정 관련하여 PrivateLink 트래픽에 인바운드 규칙 허용을 선택하면 안된다.

메서드 생성 시 vpcLinkId와 vpcNLB 스테이지 변수 활용하기

배포 전 테스트

배포 후 테스트

스테이지에 배포 후 url을 이용하여 외부 접근 테스트를 진행한다

chat api

이번엔 EC2 8002번 포트에 /chat?input=hi 이런식으로 보내면 llm 응답을 돌려주는 api를 호출하도록 API Gateway에 새로운 메서드를 추가해보겠다.

앞의 다른 메서드와 유사하게 만들어준다.

/chat?input=hi 이런식으로 쿼리 문자열 파라미터가 필요하므로 추가해준다

대상 그룹 등록 여부에 따른 호출 결과

현재 8002포트의 /chat api는 에러가 있는데 대상그룹 등록여부에 따라 호출 결과가 다르다

대상 등록 시

대상 등록 취소 시

외부에서 호출

1
2
3
4
5
6
7
8
9
10
11
% curl --location 'https://wfz4ol6u28.execute-api.ap-northeast-2.amazonaws.com/dev/chat?input=baseball'
{"query":"baseball","answer":"\" baseball은 19세기 미국에서 발전한 야구 게임으로, 현재까지도 많은 사람들에게 사랑받고 있습니다. 그것은 미국에서 가장 인기 있는 스포츠 중 하나이며, 많은 선수들이 활동하고 있습니다.\"","ner":null}

% curl --location 'https://wfz4ol6u28.execute-api.ap-northeast-2.amazonaws.com/dev/chat?input=football'
{"query":"football","answer":"검색 결과가 없습니다.","ner":null}

% curl --location 'https://wfz4ol6u28.execute-api.ap-northeast-2.amazonaws.com/dev/chat?input=LA'
{"query":"LA","answer":"LA는 5G 서비스 이용약관 계약의 성립에 대한 고객의 제출 서류입니다.","ner":null}

% curl --location 'https://wfz4ol6u28.execute-api.ap-northeast-2.amazonaws.com/dev/chat?input=summary'
{"query":"summary","answer":"통화 기록을 요약한 결과를 제공합니다.\n\n summary = \"주말 점심 약속 조정\"\n summary_detail = \"\n - 오랜만에 연락하여 근황을 나눔\n - 주말 점심 약속 제안 및 시간 조정\n - 강남역 스타벅스에서 만나기로 장소 확정\"\n \"event\"={\n \"날짜\": \"2024년 06월 01일\",\n \"시간\": \"오후 1시\",\n \"장소\": \"강남역 스타벅스\",\n \"대상\": \"영수\"\n }","ner":null}

References
Amzzon API Gateway 기반 VPC Link 활용 방법
AWS API Gateway 에서 EC2 에 서빙중인 application HTTP 로 호출하기
EC2 Instance Connect Endpoint를 통해 private EC2 접속하기

Author

hamin

Posted on

2024-08-11

Updated on

2024-09-25

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.