[API GW] Private API Gateway 만들기와 접근하는 방법(VPC Endpoint, Lambda)
이번에 내부에서만 접근이 필요한... API가 필요해서 Private API Gateway를 만든 내용을 정리해보겠다...람쥐...,,
VPC Endpoint
일단 Private api gateway는 VPC 내부에서 접근해야하기 때문에 VPC Endpoint가 필요하다.
1. VPC 콘솔 > 엔드포인트 > 엔드포인트 생성에 접근한다.
2. 이름은 걍 아무거나 지정해준다.
3. 서비스 범주는 AWS 서비스이며, 서비스는 execute-api를 검색하여 선택한다.
4. VPC를 선택하고 서브넷은 Private Subnet을 선택한다.
5. 인바운드 규칙으로 HTTPS / 443이 오픈되어 있는 보안그룹을 선택한다.
6. [엔드포인트 생성]을 완료하고 상태가 ✅사용 가능이 될 때까지 기다린다.
Lambda
API Gateway를 테스트하기 위한 간단한 Lambda 함수를 생성한다.
1. Lambda 콘솔 > 함수 생성 선택
2. 함수 이름은 아무거나 지정하고 런타임만 맞춰서 기본으로 생성한다.
- 런타임 : Python 3.12
3. 다음 코드를 입력해준다. headers가 있는 이유는 CORS 오류 때문에...🫠
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type'
},
'body': json.dumps('Hello from Lambda!')
}
4. 구성 > VPC를 선택하여 다음과 같이 설정한다. VPC Endpoint 때문에 Lambda가 Private 서브넷에 위치해야한다.
VPC Endpoint를 구성한 서브넷과 똑같은 환경으로 구성한다.
5. Lambda를 [ Deploy ] 하고 [ Test ] 해본다. 다음과 같은 응답이 나타나면 이상이 없는 것!
Private API Gateway
이번에는 API 게이트웨이를 생성한다.
1. API Gateway 콘솔 > [ API 생성 ] 선택
2. REST API 프라이빗에서 [ 구축 ]을 선택한다.
3. API 이름은 알아서 지정해주고
- API 엔드포인트 유형 : 프라이빗
- VPC 엔드포인트 ID : 위에서 생성한 VPC 엔드포인트를 선택하고 꼭 [ 추가 ]를 선택한다
4. [ 리소스 생성 ] 선택 > 다음과 같이 설정하고 생성한다.
- 리소스 경로 : /
- 리소스 이름 : my-resource
- 오리진 간 리소스 공유(CORS) 활성화
5. /my-resource를 선택한 상태에서 [ 메서드 생성 ]을 선택한다.
- 메서드 유형 : GET
- Lambda 프록시 통합 : 활성화
- Lambda 함수 : 위에서 만든 람다함수 선택
6. API Gateway 메뉴에서 < 리소스 정책 >에 가서 다음과 같이 설정한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "*"
}
]
}
7. API 배포 전에 GET 메서드를 테스트한다. 테스트 탭에서 [ 테스트 ]를 선택했을 때 다음과 같이 람다 테스트 응답과 동일하게 나타나면 된다!
8. 우측 상단의 [ API 배포 ]를 선택한다. 스테이지가 없다면 [ 새 스테이지 ]를 선택해서 만들어 배포하면 된다.
9. 스테이지 배포가 완료되면 다음과 같은 형식의 URL을 확인할 수 있다.
https://API아이디.execute-api.리전.amazonaws.com/스테이지이름
Private API Gateway 호출하기
이 Private API 게이트웨이는 VPC 내부에서 호출해야한다. 호출하는 방법이 있긴한데.,, 뭔 소린지 모르겠고 나는 다음 방법을 택했다.
1. EC2에서 Public Subnet에서 Windows 서버를 생성한다.
2. RDP로 접근한다. 보안그룹에서 3389 포트가 열려있으면 ok!
3. 다음 링크에 있는대로 Windows 서버에 아파치를 설치한다.
https://engine.tistory.com/174
4. 윈도우 서버에서 Apache24 > htdocs 폴더로 접근한다. 이곳에 index.html 파일을 생성한다.
- API 게이트웨이의 형식은 다음과 같다.
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
- rest-api-id는 API Gateway 스테이지 URL 중 https://abcdefg1234.execute-api.eu-central-1.amazonaws.com/dev abcdefg1234를 의미한다.
- vpce-id는 VPC 콘솔 > 엔드포인트 > 생성한 엔드포인트를 선택하면 확인 가능하다. 형식은 vpce-0123456678abc로 되어있다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Call AWS Lambda</title>
<script>
async function callLambda() {
const response = await fetch('https://API아이디-vpce-VPC엔드포인트ID.execute-api.eu-central-1.amazonaws.com/dev/my-resource', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const result = await response.json();
document.getElementById('response').innerText = result;
}
</script>
</head>
<body>
<h1>Call AWS Lambda Function</h1>
<button onclick="callLambda()">Call Lambda</button>
<p id="response"></p>
</body>
</html>
5. 마지막으로 서비스 > Apache24 선택 > start service를 선택하고 윈도우 서버 내 웹페이지에서 localhost에 접근한다.
- Call Lambda 버튼을 선택하고 "Hello from Lambda!"를 선택하면 정상적으로 Private API가 호출된 것이라고 볼 수 있다.
이걸로 3일간 삽질을 오지게했당 %^^,.,, 왜 아무도 접근하는 법 안 알려줘...,,,...
아 참고로 인스턴스에서(윈도우, 아마존 리눅스 상관 X) 다음 명령 입력했을 때 잘 나오면 일단 응답 자체는 잘 하는 거다!
curl -i https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
이제 끗 ~