이번에 내부에서만 접근이 필요한... 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}
이제 끗 ~
'AWS' 카테고리의 다른 글
[EC2] Windows 서버에 Apache 설치하는 방법 (0) | 2024.07.17 |
---|---|
[AWS 비용] GetMetricData API 삭제 방법 (0) | 2024.04.30 |
인터넷 없이 EC2에 접속하는 방법(AWS Session Manager 이용) (0) | 2024.04.08 |
AWS IoT FleetWise 캠페인을 여러 차량에 배포하기 (0) | 2024.01.24 |
AWS IoT FleetWise 용어 정리 (0) | 2024.01.10 |