AWS

[API GW] Private API Gateway 만들기와 접근하는 방법(VPC Endpoint, Lambda)

2024. 7. 18. 10:23
728x90

이번에 내부에서만 접근이 필요한... 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

 

[EC2] Windows 서버에 Apache 설치하는 방법

먼저, RDP로 Windows에 접속한다.나의 경우 Windows 서버는 Public 서브넷에 올려두었다.  Windows 서버에 접속하였으면 Apache 홈페이지로 들어간다.https://httpd.apache.org/download.cgi Download - The Apache HTTP Server

engine.tistory.com

 

 

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}

 

 

 

이제 끗 ~

728x90