프라이빗 API 생성 - Amazon API Gateway

프라이빗 API 생성

프라이빗 API를 생성하기 전에 먼저 API Gateway에 대한 VPC 엔드포인트를 생성합니다. 다음으로 프라이빗 API를 생성하고 리소스 정책을 프라이빗 API에 연결합니다. 선택적으로 VPC 엔드포인트를 프라이빗 API와 연결하여 API 간접 호출 방법을 간소화할 수 있습니다. 마지막으로, API를 배포합니다.

다음 절차에서 그 방법을 설명합니다. AWS Management Console, AWS CLI 또는 AWS SDK를 사용하여 프라이빗 REST API를 생성할 수 있습니다.

필수 조건

이 단계를 수행하려면 완전히 구성된 VPC가 있어야 합니다. VPC 생성 방법을 알아보려면 Amazon VPC 사용 설명서의 VPC만 생성을 참조하세요. VPC를 생성할 때 모든 권장 단계를 따르려면 프라이빗 DNS를 활성화합니다. 이렇게 하면 호스트 또는 x-apigw-api-id 헤더를 전달하지 않고도 VPC 내에서 API를 간접적으로 호출할 수 있습니다.

프라이빗 DNS를 활성화하려면 VPC의 enableDnsSupportenableDnsHostnames 속성을 true로 설정해야 합니다. 자세한 내용은 VPC에서 DNS 지원VPC에 대한 DNS 지원 업데이트를 참조하세요.

1단계: VPC에서 API Gateway용 VPC 엔드포인트 생성

다음 절차에서는 API Gateway용 VPC 엔드포인트를 생성하는 방법을 보여줍니다. API Gateway용 VPC 엔드포인트를 생성하려면 프라이빗 API를 생성할 AWS 리전에 execute-api 도메인을 지정합니다. execute-api 도메인은 API 실행을 위한 API Gateway 구성 요소 서비스입니다.

API Gateway용 VPC 엔드포인트를 생성할 때 DNS 설정을 지정합니다. 프라이빗 DNS를 끄면 퍼블릭 DNS를 사용해서만 API에 액세스할 수 있습니다. 자세한 내용은 문제: API Gateway VPC 엔드포인트에서 내 퍼블릭 API에 연결할 수 없습니다. 단원을 참조하십시오.

AWS Management Console
API Gateway용 인터페이스 VPC 엔드포인트를 생성하려면
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. 탐색 창의 Virtual Private Cloud에서 엔드포인트를 선택합니다.

  3. Create endpoint(엔드포인트 생성)을 선택합니다.

  4. (선택 사항) 이름 태그에 VPC 엔드포인트를 식별하는 데 도움이 되는 이름을 입력합니다.

  5. 서비스 범주(Service category)에서 AWS 서비스를 선택합니다.

  6. 서비스 아래 검색 상자에 execute-api를 입력합니다. 그런 다음 API를 생성할 AWS 리전에서 API Gateway 서비스 엔드포인트를 선택합니다. 서비스 이름은 com.amazonaws.us-east-1.execute-api 같은 형식이어야 하며 유형인터페이스여야 합니다.

  7. VPC에서 엔드포인트를 생성할 VPC를 선택합니다.

  8. (선택 사항) 프라이빗 DNS 이름 활성화를 끄려면 추가 설정을 선택한 다음 프라이빗 DNS 이름 활성화를 선택 취소합니다.

  9. 서브넷에서 엔드포인트 네트워크 인터페이스를 생성한 가용 영역을 선택합니다. API의 가용성을 높이려면 여러 서브넷을 선택합니다.

  10. 보안 그룹에서 VPC 엔드포인트 네트워크 인터페이스와 연결할 보안 그룹을 선택합니다.

    선택한 보안 그룹은 VPC의 IP 범위 또는 VPC의 다른 보안 그룹으로부터 오는 TCP 포트 443의 인바운드 HTTPS 트래픽을 허용하도록 설정되어 있어야 합니다.

  11. 정책에 대해 다음 중 하나를 수행합니다.

    • 프라이빗 API를 생성하지 않았거나 사용자 지정 VPC 엔드포인트 정책을 구성하지 않으려면 전체 액세스를 선택합니다.

    • 이미 프라이빗 API를 생성했고 사용자 지정 VPC 엔드포인트 정책을 구성하려는 경우 사용자 지정 VPC 엔드포인트 정책을 입력할 수 있습니다. 자세한 내용은 API Gateway의 프라이빗 API에 대한 VPC 종단점 정책 사용 단원을 참조하십시오.

    VPC 엔드포인트를 생성한 후 VPC 엔드포인트 정책을 업데이트할 수 있습니다. 자세한 내용은 VPC 엔드포인트 정책 업데이트를 참조하세요.

  12. Create endpoint(엔드포인트 생성)을 선택합니다.

  13. 이후 단계에서 사용할 수 있도록 결과 VPC 엔드포인트 ID를 복사합니다.

AWS CLI

다음 create-vpc-endpoint 명령을 사용하여 VPC 엔드포인트를 생성할 수 있습니다.

aws ec2 create-vpc-endpoint \ --vpc-id vpc-1a2b3c4d \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-east-1.execute-api \ --subnet-ids subnet-7b16de0c \ --security-group-id sg-1a2b3c4d

이후 단계에서 사용할 수 있도록 결과 VPC 엔드포인트 ID를 복사합니다.

2단계: 프라이빗 API 생성

VPC 엔드포인트를 생성한 후에는 프라이빗 REST API를 생성합니다. 다음 절차는 프라이빗 API를 생성하는 방법을 보여줍니다.

AWS Management Console
프라이빗 API 생성
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. API 생성을 선택합니다.

  3. REST API에서 빌드를 선택합니다.

  4. 이름에 이름을 입력합니다.

  5. (선택 사항) 설명에 설명을 입력합니다.

  6. API 엔드포인트 유형에서 프라이빗을 선택합니다.

  7. (선택 사항) VPC 엔드포인트 ID에 VPC 엔드포인트 ID를 입력합니다.

    VPC 엔드포인트 ID를 프라이빗 API와 연결하는 경우 Host 헤더를 재정의하거나 x-apigw-api-id header를 전달하지 않고도 VPC 내에서 API를 간접적으로 호출할 수 있습니다. 자세한 내용은 (선택 사항) VPC 엔드포인트를 프라이빗 API와 연결 또는 연결 해제 섹션을 참조하세요.

  8. API 생성(Create API)을 선택합니다.

이전 단계를 완료한 후에 REST API 콘솔 시작하기의 지침에 따라 이 API에 대해 메서드와 통합을 설정할 수 있습니다. 하지만 API를 배포할 수는 없습니다. API를 배포하려면 3단계를 따르고 API에 리소스 정책을 연결합니다.

AWS CLI

다음 update-rest-api 명령은 프라이빗 API를 생성하는 방법을 보여줍니다.

aws apigateway create-rest-api \ --name 'Simple PetStore (AWS CLI, Private)' \ --description 'Simple private PetStore API' \ --region us-west-2 \ --endpoint-configuration '{ "types": ["PRIVATE"] }'

성공적으로 호출되면 다음과 비슷한 출력 결과를 반환합니다.

{ "createdDate": "2017-10-13T18:41:39Z", "description": "Simple private PetStore API", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (AWS CLI, Private)" }

이전 단계를 완료한 후에 튜토리얼: AWS SDK 또는 AWS CLI를 사용하여 엣지 최적화 API 생성의 지침에 따라 이 API에 대해 메서드와 통합을 설정할 수 있습니다. 하지만 API를 배포할 수는 없습니다. API를 배포하려면 3단계를 따르고 API에 리소스 정책을 연결합니다.

SDK JavaScript v3

다음 예시는 AWS SDK for JavaScript v3를 사용하여 프라이빗 API를 생성하는 방법을 보여줍니다.

import {APIGatewayClient, CreateRestApiCommand} from "@aws-sdk/client-api-gateway"; const apig = new APIGatewayClient({region:"us-east-1"}); const input = { // CreateRestApiRequest name: "Simple PetStore (JavaScript v3 SDK, private)", // required description: "Demo private API created using the AWS SDK for JavaScript v3", version: "0.00.001", endpointConfiguration: { // EndpointConfiguration types: [ "PRIVATE"], }, }; export const handler = async (event) => { const command = new CreateRestApiCommand(input); try { const result = await apig.send(command); console.log(result); } catch (err){ console.error(err) } };

성공적으로 호출되면 다음과 비슷한 출력 결과를 반환합니다.

{ apiKeySource: 'HEADER', createdDate: 2024-04-03T17:56:36.000Z, description: 'Demo private API created using the AWS SDK for JavaScript v3', disableExecuteApiEndpoint: false, endpointConfiguration: { types: [ 'PRIVATE' ] }, id: 'abcd1234', name: 'Simple PetStore (JavaScript v3 SDK, private)', rootResourceId: 'efg567', version: '0.00.001' }

이전 단계를 완료한 후에 튜토리얼: AWS SDK 또는 AWS CLI를 사용하여 엣지 최적화 API 생성의 지침에 따라 이 API에 대해 메서드와 통합을 설정할 수 있습니다. 하지만 API를 배포할 수는 없습니다. API를 배포하려면 3단계를 따르고 API에 리소스 정책을 연결합니다.

Python SDK

다음 예시는 AWS SDK for Python을 사용하여 프라이빗 API를 생성하는 방법을 보여줍니다.

import json import boto3 import logging logger = logging.getLogger() apig = boto3.client('apigateway') def lambda_handler(event, context): try: result = apig.create_rest_api( name='Simple PetStore (Python SDK, private)', description='Demo private API created using the AWS SDK for Python', version='0.00.001', endpointConfiguration={ 'types': [ 'PRIVATE', ], }, ) except botocore.exceptions.ClientError as error: logger.exception("Couldn't create private API %s.", error) raise attribute=["id", "name", "description", "createdDate", "version", "apiKeySource", "endpointConfiguration"] filtered_data ={key:result[key] for key in attribute} result = json.dumps(filtered_data, default=str, sort_keys='true') return result

성공적으로 호출되면 다음과 비슷한 출력 결과를 반환합니다.

"{\"apiKeySource\": \"HEADER\", \"createdDate\": \"2024-04-03 17:27:05+00:00\", \"description\": \"Demo private API created using the AWS SDK for \", \"endpointConfiguration\": {\"types\": [\"PRIVATE\"]}, \"id\": \"abcd1234\", \"name\": \"Simple PetStore (Python SDK, private)\", \"version\": \"0.00.001\"}"

이전 단계를 완료한 후에 튜토리얼: AWS SDK 또는 AWS CLI를 사용하여 엣지 최적화 API 생성의 지침에 따라 이 API에 대해 메서드와 통합을 설정할 수 있습니다. 하지만 API를 배포할 수는 없습니다. API를 배포하려면 3단계를 따르고 API에 리소스 정책을 연결합니다.

3단계: 프라이빗 API에 대한 리소스 정책 설정

현재 프라이빗 API는 일부 VPC에서 액세스할 수 없습니다. 리소스 정책을 사용하여 VPC와 VPC 엔드포인트에 프라이빗 API에 대한 액세스 권한을 부여합니다. 임의 AWS 계정의 VPC 엔드포인트에 대한 액세스 권한을 부여할 수 있습니다.

리소스 정책에는 액세스를 제한하는 aws:SourceVpc 또는 aws:SourceVpce 조건이 포함되어야 합니다. 특정 VPC와 VPC 엔드포인트를 식별하도록 합니다. 모든 VPC와 VPC 엔드포인트에 대한 액세스를 허용하는 리소스 정책은 생성하지 않는 것이 좋습니다.

다음 절차는 API에 리소스 정책을 연결하는 방법을 보여줍니다.

AWS Management Console
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. REST API를 선택합니다.

  3. 기본 탐색 창에서 리소스 정책을 선택합니다.

  4. 정책 생성을 선택합니다.

  5. 템플릿 선택소스 VPC를 차례로 선택합니다.

  6. {{vpceID}}(중괄호 포함)를 VPC 엔드포인트 ID로 바꿉니다.

  7. Save changes(변경 사항 저장)를 선택합니다.

AWS CLI

다음 update-rest-api 명령은 기존 API에 리소스 정책을 연결하는 방법을 보여줍니다.

aws apigateway update-rest-api \ --rest-api-id a1b2c3 \ --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'

VPC 엔드포인트에 액세스할 수 있는 리소스를 제어할 수도 있습니다. VPC 엔드포인트에 액세스할 수 있는 리소스를 제어하려면 엔드포인트 정책을 VPC 엔드포인트에 연결합니다. 자세한 내용은 API Gateway의 프라이빗 API에 대한 VPC 종단점 정책 사용 단원을 참조하십시오.

(선택 사항) VPC 엔드포인트를 프라이빗 API와 연결 또는 연결 해제

VPC 엔드포인트를 프라이빗 API와 연결하면 API Gateway에서 새로운 Route 53 별칭 DNS 레코드를 생성합니다. Host 헤더를 재정의하거나 x-apigw-api-id 헤더를 전달하지 않고 퍼블릭 API를 호출할 때처럼 이 레코드를 사용하여 프라이빗 API를 간접적으로 호출할 수 있습니다.

생성된 기본 URL의 형식은 다음과 같습니다.

https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
Associate a VPC endpoint (AWS Management Console)

VPC 엔드포인트를 생성할 때 또는 생성한 후에 프라이빗 API와 연결할 수 있습니다. 다음 절차는 VPC 엔드포인트를 이전에 생성된 API와 연결하는 방법을 보여줍니다.

VPC 엔드포인트를 프라이빗 API와 연결하려면
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. 프라이빗 API를 선택합니다.

  3. 기본 탐색 창에서 리소스 정책을 선택합니다.

  4. 추가 VPC 엔드포인트에서 직접적으로 호출할 수 있도록 리소스 정책을 편집합니다.

  5. 기본 탐색 창에서 API 설정을 선택합니다.

  6. API 세부 정보 섹션에서 편집을 선택합니다.

  7. VPC 엔드포인트 ID에서 추가 VPC 엔드포인트 ID를 선택합니다.

  8. Save(저장)를 선택합니다.

  9. 변경 사항을 적용하려면 API를 재배포합니다.

Dissociate a VPC endpoint (AWS Management Console)
프라이빗 REST API에서 VPC 엔드포인트 연결을 해제하려면
  1. https://console.aws.amazon.com/apigateway에서 API Gateway 콘솔에 로그인합니다.

  2. 프라이빗 API를 선택합니다.

  3. 기본 탐색 창에서 리소스 정책을 선택합니다.

  4. 리소스 정책을 편집하여 프라이빗 API에서 연결 해제할 VPC 엔드포인트에 대한 언급을 제거합니다.

  5. 기본 탐색 창에서 API 설정을 선택합니다.

  6. API 세부 정보 섹션에서 편집을 선택합니다.

  7. VPC 엔드포인트 ID에서 X를 선택하여 VPC 엔드포인트를 연결 해제합니다.

  8. Save(저장)를 선택합니다.

  9. 변경 사항을 적용하려면 API를 재배포합니다.

Associate a VPC endpoint (AWS CLI)

다음 create-rest-api 명령은 API 생성 시 VPC 엔드포인트를 연결하는 방법을 보여줍니다.

aws apigateway create-rest-api \ --name Petstore \ --endpoint-configuration '{ "types": ["PRIVATE"], "vpcEndpointIds" : ["vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee"] }' \ --region us-west-2

출력은 다음과 같습니다.

{ "apiKeySource": "HEADER", "endpointConfiguration": { "types": [ "PRIVATE" ], "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee" ] }, "id": "u67n3ov968", "createdDate": 1565718256, "name": "Petstore" }

다음 update-rest-api 명령은 이미 생성한 API에 VPC 엔드포인트를 연결하는 방법을 보여줍니다.

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='add',path='/endpointConfiguration/vpcEndpointIds',value='vpce-01d622316a7df47f9'" \ --region us-west-2

출력은 다음과 같습니다.

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

변경 사항을 적용하려면 API를 재배포합니다.

Disassociate a VPC endpoint (AWS CLI)

다음 update-rest-api 명령은 프라이빗 API에서 VPC 엔드포인트 연결을 해제하는 방법을 보여줍니다.

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='remove',path='/endpointConfiguration/vpcEndpointIds',value='vpce-0393a628149c867ee'" \ --region us-west-2

출력은 다음과 같습니다.

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

변경 사항을 적용하려면 API를 재배포합니다.

4단계: 프라이빗 API 배포

API를 배포하려면 API 배포를 생성하여 스테이지에 연결합니다. 다음 절차는 프라이빗 API를 배포하는 방법을 보여줍니다.

AWS Management Console
프라이빗 API를 배포하려면
  1. API를 선택합니다.

  2. Deploy API(API 배포)를 선택합니다.

  3. 스테이지에서 새 스테이지를 선택합니다.

  4. 스테이지 이름에 스테이지 이름을 입력합니다.

  5. (선택 사항) 설명에 설명을 입력합니다.

  6. [배포]를 선택합니다.

AWS CLI

다음 create-deployment 명령은 프라이빗 API를 배포하는 방법을 보여줍니다.

aws apigateway create-deployment --rest-api-id a1b2c3 \ --stage-name test \ --stage-description 'Private API test stage' \ --description 'First deployment'

프라이빗 API 문제 해결

아래에서는 프라이빗 API를 생성할 때 발생할 수 있는 오류 및 문제를 해결하는 방법을 조언합니다.

문제: API Gateway VPC 엔드포인트에서 내 퍼블릭 API에 연결할 수 없습니다.

VPC를 생성할 때 DNS 설정을 구성할 수 있습니다. VPC의 프라이빗 DNS를 켜는 것이 좋습니다. 프라이빗 DNS를 끄면 퍼블릭 DNS를 통해서만 API에 액세스할 수 있습니다.

프라이빗 DNS를 활성화하면 VPC 엔드포인트에서 퍼블릭 API Gateway API의 기본 엔드포인트에 액세스할 수 없습니다. 사용자 지정 도메인 이름으로 API에 액세스할 수 있습니다.

리전 사용자 지정 도메인 이름을 생성하는 경우 A 유형 별칭 레코드를 사용합니다. 엣지 최적화 사용자 지정 도메인 이름을 생성하는 경우 레코드 유형에 대한 제한이 없습니다. 프라이빗 DNS를 활성화한 상태에서 이러한 퍼블릭 API에 액세스할 수 있습니다. 자세한 내용은 문제: API Gateway VPC 엔드포인트에서 내 퍼블릭 API에 연결합니다.를 참조하세요.

문제: 내 API가 {"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"}를 반환합니다.

리소스 정책에서 다음과 같이 보안 주체를 AWS 보안 주체로 설정하는 경우

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", ""Principal": { "AWS": [ "arn:aws:iam::account-id:role/developer", "arn:aws:iam::account-id:role/Admin" ] }, "Action": "execute-api:Invoke", "Resource": [ "execute-api:/*" ] }, ... }

API의 모든 메서드에 AWS_IAM 권한 부여를 사용해야 합니다. 그렇지 않으면 API가 이전 오류 메시지를 반환합니다. 메서드에 대한 AWS_IAM 권한 부여를 켜는 방법에 대한 자세한 지침은 API Gateway의 REST API 메서드 섹션을 참조하세요.

문제: 내 VPC 엔드포인트가 내 API와 연결되어 있는지 알 수 없습니다.

VPC 엔드포인트를 프라이빗 API와 연결하거나 연결 해제하는 경우 API를 다시 배포해야 합니다. DNS 전파로 인해 업데이트 작업을 완료하는 데 몇 분이 걸릴 수 있습니다. 그 동안에도 API를 사용할 수 있지만, 새로 생성된 DNS URL의 DNS 전파는 계속 진행 중일 수 있습니다. 몇 분 후에도 DNS에서 새 URL이 확인되지 않으면 API를 다시 배포하는 것이 좋습니다.