

# 자습서: 프라이빗 REST API 생성
<a name="private-api-tutorial"></a>

이 자습서에서는 프라이빗 REST API를 생성합니다. 클라이언트는 Amazon VPC 내에서만 API에 액세스할 수 있습니다. API는 일반적인 보안 요구 사항인 공용 인터넷과 격리됩니다.

이 자습서는 완료되는데 약 30분이 걸립니다. 먼저 CloudFormation 템플릿을 사용하여 Amazon VPC, VPC 엔드포인트, AWS Lambda 함수를 생성하고 API를 테스트하는 데 사용할 Amazon EC2 인스턴스를 시작합니다. 그런 다음 AWS Management Console를 사용하여 프라이빗 API를 생성하고 VPC 엔드포인트에서만 액세스를 허용하는 리소스 정책을 연결합니다. 마지막으로 API를 테스트합니다.

![\[이 튜토리얼에서 생성하는 프라이빗 API의 개요입니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/private-api-tutorial-diagram.png)


이 자습서를 완료하려면 AWS 계정과 콘솔 액세스 권한이 있는 AWS Identity and Access Management 사용자가 있어야 합니다. 자세한 내용은 [API Gateway를 사용하도록 설정](setting-up.md) 단원을 참조하세요.

이 자습서에서는 를 사용합니다AWS Management Console 이 API 및 모든 관련 리소스를 생성하는 CloudFormation 템플릿은 [template.yaml](samples/private-api-full-template.zip)을 참조하세요.

**Topics**
+ [1단계: 종속성 생성](#private-api-tutorial-create-dependencies)
+ [2단계: 프라이빗 API 생성](#private-api-tutorial-create-api)
+ [3단계: 메서드 및 통합 생성](#private-api-tutorial-create-method)
+ [4단계: 리소스 정책 연결](#private-api-tutorial-attach-resource-policy)
+ [5 단계: API 배포](#private-api-tutorial-deploy-api)
+ [6단계: API에 공개적으로 액세스할 수 없는지 확인](#private-api-tutorial-test-private-api)
+ [7단계: VPC의 인스턴스에 연결하고 API 호출](#private-api-tutorial-connect-to-instance)
+ [8단계: 정리](#private-api-tutorial-cleanup)
+ [다음 단계: 를 통한 자동화CloudFormation](#private-api-tutorial-next-steps)

## 1단계: 종속성 생성
<a name="private-api-tutorial-create-dependencies"></a>

[이 CloudFormation 템플릿](samples/private-api-starter-template.zip)을 다운로드하고 압축을 풉니다. 템플릿을 사용하여 Amazon VPC, VPC 엔드포인트 및 API의 백엔드 역할을 하는 Lambda 함수를 포함하여 프라이빗 API에 대한 모든 종속성을 생성합니다. 나중에 프라이빗 API를 생성합니다.

**CloudFormation 스택을 생성하려면**

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. **스택 생성**을 선택한 다음 **새 리소스 사용(표준)**을 선택합니다.

1. **템플릿 지정**에서 **템플릿 파일 업로드**를 선택합니다.

1. 다운로드한 템플릿을 선택합니다.

1. **다음**을 선택합니다.

1. **스택 이름**에 **private-api-tutorial**을 입력하고 **다음**을 선택합니다.

1. **스택 옵션 구성**에서 **다음**을 선택합니다.

1. **기능**의 경우 CloudFormation이 계정에 IAM 리소스를 생성할 수 있음을 확인합니다.

1. **다음**을 선택한 후 **제출**을 선택합니다.

CloudFormation는 API에 대한 종속성을 프로비저닝합니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. CloudFormation 스택 상태가 **CREATE\$1COMPLETE**인 경우 **출력(Outputs)**을 선택합니다. VPC 엔드포인트 ID를 적어둡니다. 이 자습서의 이후 단계를 위해 필요합니다.

## 2단계: 프라이빗 API 생성
<a name="private-api-tutorial-create-api"></a>

프라이빗 API를 생성하여 VPC 내의 클라이언트만 액세스할 수 있도록 합니다.

**프라이빗 API 생성**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. **API 생성**(Create API)을 선택한 다음 **REST API**에 대해 **빌드**(Build)를 선택합니다.

1. **API 이름**에서 **private-api-tutorial**을(를) 입력합니다.

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

1. **VPC 엔드포인트 ID**의 경우 CloudFormation 스택의 **출력**에서 VPC 엔드포인트 ID를 입력합니다.

1. **IP 주소 유형**의 경우 **듀얼 스택**을 선택합니다.

1. **API 생성**을 선택합니다.

## 3단계: 메서드 및 통합 생성
<a name="private-api-tutorial-create-method"></a>

`GET` 메서드와 Lambda 통합을 생성하여 API에 대한 `GET` 요청을 처리합니다. 클라이언트가 API를 호출하면 API Gateway는 1단계에서 생성한 Lambda 함수로 요청을 보낸 다음 클라이언트에 대한 응답을 반환합니다.

**메서드 및 통합 생성**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. API를 선택합니다.

1. **메서드 생성**을 선택합니다.

1. **메서드 유형**에서 `GET`을 선택합니다.

1. **통합 유형**에서 **Lambda 함수**를 선택합니다.

1. **Lambda 프록시 통합**을 켭니다. Lambda 프록시 통합을 통해 API Gateway는 정의된 구조를 사용하여 이벤트를 Lambda에 보내고 Lambda 함수의 응답을 HTTP 응답으로 변환합니다.

1. **Lambda 함수**의 경우 1단계에서 CloudFormation 템플릿으로 생성한 함수를 선택합니다. 함수의 이름은 **private-api-tutorial**로 시작합니다.

1. **메서드 생성**을 선택합니다.

## 4단계: 리소스 정책 연결
<a name="private-api-tutorial-attach-resource-policy"></a>

클라이언트가 VPC 엔드포인트를 통해서만 API를 호출하도록 허용하는 [리소스 정책](apigateway-resource-policies.md)을 API에 연결합니다. API에 대한 액세스를 추가로 제한하기 위해 VPC 엔드포인트에 대한 [ VPC 엔드포인트 정책](apigateway-vpc-endpoint-policies.md)을 구성할 수도 있지만 이 자습서에는 필요하지 않습니다.

**리소스 정책 연결**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. API를 선택합니다.

1. **리소스 정책**, **정책 생성**을 차례로 선택합니다.

1. 다음 정책을 입력합니다. *vpceID*를 CloudFormation 스택의 **출력(Outputs)**에서 VPC 엔드포인트 ID로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*",
               "Condition": {
                   "StringNotEquals": {
                       "aws:sourceVpce": "vpce-abcd1234"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*"
           }
       ]
   }
   ```

------

1. **변경 사항 저장**을 선택합니다.

## 5 단계: API 배포
<a name="private-api-tutorial-deploy-api"></a>

그런 다음 API를 배포하여 Amazon VPC의 클라이언트가 사용할 수 있도록 합니다.

**API 배포**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. API를 선택합니다.

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

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

1. **단계 이름**에 **test**를 입력합니다.

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

1. [**Deploy**]를 선택합니다.

이제 API를 테스트 할 준비가 되었습니다.

## 6단계: API에 공개적으로 액세스할 수 없는지 확인
<a name="private-api-tutorial-test-private-api"></a>

`curl`를 사용하여 Amazon VPC 외부에서 API를 호출할 수 없는지 확인합니다.

**API 테스트하기**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. API를 선택합니다.

1. 기본 탐색 창에서 **스테이지**를 선택한 후 **테스트** 스테이지를 선택합니다.

1. **스테이지 세부 정보**에서 복사 아이콘을 선택하여 API의 호출 URL을 복사합니다. 이 URL은 `https://abcdef123.execute-api.us-west-2.amazonaws.com/test`와 같은 형식입니다. 1단계에서 생성한 VPC 엔드포인트에는 프라이빗 DNS가 활성화되어 있으므로 제공된 URL을 사용하여 API를 호출할 수 있습니다.

1. curl을 사용하여 VPC 외부에서 API를 호출합니다.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Curl은 API의 엔드포인트를 확인할 수 없음을 나타냅니다. 다른 응답을 받은 경우 2단계로 돌아가서 API의 엔드포인트 유형에 대해 **프라이빗**(Private)으로 선택해야 합니다.

   ```
   curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

그런 다음 VPC의 Amazon EC2 인스턴스에 연결하여 API를 호출합니다.

## 7단계: VPC의 인스턴스에 연결하고 API 호출
<a name="private-api-tutorial-connect-to-instance"></a>

그런 다음 Amazon VPC 내에서 API를 테스트합니다. 프라이빗 API에 액세스하려면 VPC의 Amazon EC2 인스턴스에 연결한 다음 curl을 사용하여 API를 호출합니다. Systems Manager 세션 관리자를 사용하여 브라우저에서 인스턴스에 연결합니다.

**API 테스트하기**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. **인스턴스**를 선택합니다.

1. 1단계에서 CloudFormation 템플릿으로 생성한 **private-api-tutorial**이라는 인스턴스를 선택합니다.

1. **연결**(Connect)을 선택한 다음 **세션 관리자**(Session Manager)를 선택합니다.

1. **연결**(Connect)을 선택하여 인스턴스에 대한 브라우저 기반 세션을 시작합니다.

1. 세션 관리자 세션에서 curl을 사용하여 API를 호출합니다. Amazon VPC에서 인스턴스를 사용하고 있기 때문에 API를 호출할 수 있습니다.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   응답 `Hello from Lambda!`이 수신되는지 확인합니다.

![\[세션 관리자를 사용하여 Amazon VPC 내에서 API를 호출합니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/private-api-tutorial-invoke.png)


Amazon VPC 내에서만 액세스할 수 있는 API를 성공적으로 생성한 다음 작동하는지 확인했습니다.

## 8단계: 정리
<a name="private-api-tutorial-cleanup"></a>

불필요한 비용을 방지하려면 이 자습서의 일부로 생성한 리소스를 삭제합니다. 다음 단계에서는 REST API 및 CloudFormation 스택을 삭제합니다.

**REST API 삭제**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)에서 API Gateway 콘솔에 로그인합니다.

1. **API** 페이지에서 API를 선택합니다. **API 작업**을 선택하고 **API 삭제**를 선택한 다음 선택을 확인합니다.

**CloudFormation 스택을 삭제하려면**

1. CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 엽니다.

1. CloudFormation 스택을 선택합니다.

1. **삭제**를 선택한 다음 해당 선택을 확인합니다.

## 다음 단계: 를 통한 자동화CloudFormation
<a name="private-api-tutorial-next-steps"></a>

이 자습서와 관련된 모든 AWS 리소스의 생성 및 정리를 자동화할 수 있습니다. 전체 예제 CloudFormation 템플릿에 대해서는 [template.yaml](samples/private-api-full-template.zip)을 참조하세요.