

# API Gateway에서 REST API에 대한 스테이지 변수 설정
<a name="how-to-set-stage-variables-aws-console"></a>

이 섹션에서는 Amazon API Gateway 콘솔을 사용하여 샘플 API의 두 가지 배포 스테이지에 대해 다양한 스테이지 변수를 설정하는 방법을 보여줍니다. API Gateway에서 스테이지 변수를 사용하는 방법을 이해하려면 이 섹션의 모든 절차를 따르는 것이 좋습니다.

## 사전 조건
<a name="how-to-set-stage-variables-aws-console-prerequisites"></a>

시작하기 전에 다음 사전 요구 사항을 충족하는지 확인하세요.
+ API Gateway에 사용 가능한 API가 있어야 합니다. [API Gateway에서 REST API 개발](rest-api-develop.md)의 지침을 따르세요.
+ API는 1회 이상 배포되어야 합니다. [API Gateway에서 REST API 배포](how-to-deploy-api.md)의 지침을 따르세요.
+ 배포된 API에 대한 첫 단계를 생성해야 합니다. [새 단계 생성](set-up-stages.md#how-to-create-stage-console)의 지침을 따르세요.

  

## 스테이지 변수를 사용하여 API를 통해 HTTP 엔드포인트 간접 호출
<a name="how-to-set-stage-variables-aws-console-http-endpoint"></a>

이 절차에서는 HTTP 엔드포인트에 대한 스테이지 변수 1개와 API에 대한 스테이지 2개를 생성하는 방법을 설명합니다. 또한 이 섹션의 다음 절차에 사용되는 스테이지 변수 `url`, `stageName` 및 `function`도 생성합니다.

**스테이지 변수를 사용하여 API를 통해 HTTP 엔드포인트를 간접적으로 호출하려면**

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

1. API를 생성한 다음 API의 루트 리소스에 `GET` 메서드를 생성합니다. 통합 유형을 **HTTP**로 설정하고 **엔드포인트 URL**을 **http://\$1\$1stageVariables.url\$1**로 설정합니다.

1. API를 **beta**라는 스테이지에 배포합니다.

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

1. **스테이지 변수** 탭에서 **편집**을 선택합니다.

1. **스테이지 변수 추가**를 선택합니다.

1. **이름**에 **url**을 입력합니다. **값**에 **httpbin.org/get**을 입력합니다.

1. **스테이지 변수 추가**를 선택하고 다음을 수행합니다.

   **이름**에 **stageName**을 입력합니다. **값**에 **beta**을 입력합니다.

1. **스테이지 변수 추가**를 선택하고 다음을 수행합니다.

   **이름**에 **function**을 입력합니다. **값**에 **HelloWorld**을 입력합니다.

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

1.  이제 두 번째 스테이지를 생성합니다. **스테이지** 탐색 창에서 **스테이지 생성**을 선택합니다. **단계 이름**에 **prod**를 입력합니다. **배포**에서 최신 배포를 선택한 후 **스테이지 생성**을 선택합니다.

1.  **베타** 스테이지와 마찬가지로, 동일한 세 스테이지 변수(**url**, **stageName**, **function**)를 각각 다른 값(**petstore-demo-endpoint.execute-api.com/petstore/pets**, **prod**, **HelloEveryone**)으로 설정합니다.

1. **단계** 탐색 창에서 **베타**를 선택합니다. **스테이지 세부 정보**에서 복사 아이콘을 선택해 API의 호출 URL을 복사하여 웹 브라우저에 입력합니다. 그러면 API의 루트 리소스에 대한 [**beta**] 단계 `GET` 요청이 시작됩니다.
**참고**  
[**Invoke URL**] 링크는 [**beta**] 단계에서 API의 루트 리소스를 가리킵니다. 웹 브라우저에 URL을 입력하면 루트 리소스에서 링크 **베타** 스테이지 `GET` 메서드를 호출합니다. 루트 리소스 자체가 아닌 하위 리소스에 메서드가 정의된 경우, 웹 브라우저에 URL을 입력하면 `{"message":"Missing Authentication Token"}` 오류 응답이 반환됩니다. 이 경우 특정 하위 리소스의 이름을 **URL 호출(Invoke URL)** 링크에 추가해야 합니다.

1. [**beta**] 단계 `GET` 요청에서 받은 응답은 다음에 표시됩니다. 브라우저로 [**http://httpbin.org/get**] 페이지를 탐색해 결과를 확인할 수도 있습니다. 이 값은 [**beta**] 단계의 `url` 변수에 할당되었습니다. 이 두 응답은 동일합니다.

1. **단계(Stages)** 탐색 창에서 **prod** 단계를 선택합니다. **스테이지 세부 정보**에서 복사 아이콘을 선택해 API의 호출 URL을 복사하여 웹 브라우저에 입력합니다. 그러면 API의 루트 리소스에 대한 **prod** 단계 `GET` 요청이 시작됩니다.

1. [**prod**] 단계 `GET` 요청에서 받은 응답은 다음에 표시됩니다. 브라우저로 **http://petstore-demo-endpoint.execute-api.com/petstore/pets** 페이지를 탐색해 결과를 확인할 수 있습니다. 이 값은 [**prod**] 단계의 `url` 변수에 할당되었습니다. 이 두 응답은 동일합니다.

## 스테이지별 메타데이터를 HTTP 백엔드로 전달
<a name="how-to-set-stage-variables-aws-console-stage-metadata"></a>

이 절차에서는 쿼리 파라미터 표현식에서 스테이지 변수 값을 사용하여 스테이지별 메타데이터를 HTTP 백엔드로 전달하는 방법에 대해 설명합니다. 이전 절차에서 선언된 `stageName` 스테이지 변수를 사용하겠습니다.

**스테이지별 메타데이터를 HTTP 백엔드로 전달하려면**

1. **리소스** 탐색 창에서 **GET** 메서드를 선택합니다.

   쿼리 문자열 파라미터를 메서드의 URL에 추가하려면 **메서드 요청** 탭을 선택한 다음 **메서드 요청 설정** 섹션에서 **편집**을 선택합니다.

1. **URL 쿼리 문자열 파라미터**를 선택하고 다음을 수행합니다.

   1. **쿼리 문자열 추가(Add query string)**를 선택합니다.

   1. **이름**에 **stageName**을 입력합니다.

   1. **필수** 상태로 유지하고 **캐싱**을 해제합니다.

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

1. **통합 요청** 탭을 선택한 다음 **통합 요청 설정** 섹션에서 **편집**을 선택합니다.

1. **엔드포인트 URL**의 경우 이전에 정의한 URL 값에 **?stageName=\$1\$1stageVariables.stageName\$1**을 추가하여 전체 **엔드포인트 URL**이 **http://\$1\$1stageVariables.url\$1?stageName=\$1\$1stageVariables.stageName\$1**이 되도록 합니다.

1. **배포 API**를 선택하고 **베타** 스테이지를 선택합니다.

1. 기본 탐색 창에서 **스테이지**를 선택합니다. **단계** 탐색 창에서 **베타**를 선택합니다. **스테이지 세부 정보**에서 복사 아이콘을 선택해 API의 호출 URL을 복사하여 웹 브라우저에 입력합니다.
**참고**  
 `url` 변수 "http://httpbin.org/get"에서 지정한 바와 같이 HTTP 엔드포인트가 쿼리 파라미터 표현식을 수락하고 응답으로 `args` 객체로 반환하기 때문에 베타 스테이지를 사용합니다.

1. 응답은 다음과 같습니다. `beta` 단계 변수에 할당된 `stageName`는 백엔드에 `stageName` 인수로 전달됩니다.

      
![\[url 스테이지 변수를 사용하여 HTTP 엔드포인트에 대한 API의 GET 메서드로부터 받은 응답입니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/stageVariables-new-console-invoke-beta-stage-with-url-and-stageName-response.png)

## 스테이지 변수를 사용하여 API를 통해 Lambda 함수 간접 호출
<a name="how-to-set-stage-variables-aws-console-lambda-function"></a>

이 절차에서는 스테이지 변수를 사용하여 Lambda 함수를 API 백엔드로 호출하는 방법을 설명합니다. `function`에서 선언된 [스테이지 변수를 사용하여 API를 통해 HTTP 엔드포인트 간접 호출](#how-to-set-stage-variables-aws-console-http-endpoint) 스테이지 변수를 사용합니다.

 Lambda 함수를 단계 변수의 값으로 설정할 때는 **HelloWorld**, **HelloWorld:1** 또는 **HelloWorld:alpha**와 같이 별칭이나 버전 사양이 포함될 수 있는 함수의 로컬 이름을 사용합니다. 해당 함수의 ARN을 사용하면 안 됩니다(예: **arn:aws:lambda:us-east-1:123456789012:function:HelloWorld**). API Gateway 콘솔은 Lambda 함수에 대한 스테이지 변수 값을 정규화되지 않은 함수 이름으로 가정하고 주어진 스테이지 변수를 ARN으로 확장합니다.

**스테이지 변수를 사용하여 API를 통해 Lambda 함수를 간접적으로 호출하려면**

1. 기본 Node.js 런타임을 사용하여 **HelloWorld**라는 Lambda 함수를 생성합니다. 코드에는 다음이 포함되어 있습니다.

   ```
   export const handler = function(event, context, callback) {
       if (event.stageName)
           callback(null, 'Hello, World! I\'m calling from the ' + event.stageName + ' stage.');
       else
           callback(null, 'Hello, World! I\'m not sure where I\'m calling from...');
   };
   ```

   Lambda 함수를 생성하는 방법에 대한 자세한 내용은 [REST API 콘솔 시작하기](getting-started-rest-new-console.md#getting-started-rest-new-console-create-function)를 참조하세요.

1. **리소스** 창에서 **리소스 생성**을 선택하고 다음을 수행합니다.

   1. **리소스 경로**에서 **/**를 선택합니다.

   1. **리소스 이름**에 **lambdav1**을 입력합니다.

   1. **리소스 생성**을 선택합니다.

1. **/lambdav1** 리소스를 선택한 다음 **메서드 생성**을 선택합니다.

   뒤이어 다음과 같이 하세요.

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

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

   1. **Lambda 프록시 통합**을 비활성화된 상태로 유지합니다.

   1. **Lambda 함수**에서 `${stageVariables.function}`을(를) 입력합니다.  
![\[function 단계 변수에서 지정한 대로 Lambda 함수와 통합된 GET 메서드를 생성합니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/stageVariables-new-console-create-lambda-get-method.png)
**작은 정보**  
**권한 명령 추가**라는 메시지가 표시되면 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 명령을 복사합니다. `function` 스테이지 변수에 할당될 각 Lambda 함수에서 명령을 실행합니다. 예를 들어, `$stageVariables.function` 값이 `HelloWorld`이면 다음 AWS CLI 명령을 실행합니다.  

      ```
      aws lambda add-permission --function-name arn:aws:lambda:us-east-1:account-id:function:HelloWorld --source-arn arn:aws:execute-api:us-east-1:account-id:api-id/*/GET/lambdav1 --principal apigateway.amazonaws.com --statement-id statement-id-guid --action lambda:InvokeFunction
      ```
 그렇지 않으면 메서드 호출 시 `500 Internal Server Error` 응답이 반환됩니다. `${stageVariables.function}`을 스테이지 변수에 할당된 Lambda 함수 이름으로 바꾸어야 합니다.  
   

![\[생성한 메서드에서 간접적으로 호출할 Lambda 함수에 권한을 추가하는 AWS CLI 명령입니다.\]](http://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/images/stageVariables-new-console-add-permission-to-lambda-function.png)


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

1. **프로덕션** 및 **베타** 스테이지 모두에 API를 배포합니다.

1. 기본 탐색 창에서 **스테이지**를 선택합니다. **단계** 탐색 창에서 **베타**를 선택합니다. **스테이지 세부 정보**에서 복사 아이콘을 선택해 API의 호출 URL을 복사하여 웹 브라우저에 입력합니다. URL에 **/lambdav1**을 추가한 다음 Enter 키를 누릅니다.

   응답은 다음과 같습니다.

   ```
   "Hello, World! I'm not sure where I'm calling from..."
   ```

## 단계 변수를 통해 Lambda 함수에 단계별 메타데이터 전달
<a name="pass-version-info-to-lambda-backend-with-stage-variable"></a>

이 절차에서는 단계 변수를 사용하여 Lambda 함수로 단계별 구성 메타데이터를 전달하는 방법을 설명합니다. `POST` 메서드 및 입력 매핑 템플릿을 만들어 앞서 설명한 `stageName` 스테이지 변수를 사용해 페이로드를 생성합니다.

**스테이지 변수를 통해 Lambda 함수에 스테이지별 메타데이터를 전달하려면**

1. **/lambdav1** 리소스를 선택한 다음 **메서드 생성**을 선택합니다.

   뒤이어 다음과 같이 하세요.

   1. **메서드 유형**에서 **POST**를 선택합니다.

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

   1. **Lambda 프록시 통합**을 비활성화된 상태로 유지합니다.

   1. **Lambda 함수**에서 `${stageVariables.function}`을(를) 입력합니다.

   1. **권한 명령 추가**라는 메시지가 표시되면 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 명령을 복사합니다. `function` 스테이지 변수에 할당될 각 Lambda 함수에서 명령을 실행합니다.

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

1. **통합 요청** 탭을 선택한 다음 **통합 요청 설정** 섹션에서 **편집**을 선택합니다.

1. **매핑 템플릿**을 선택한 다음 **매핑 템플릿 추가**를 선택합니다.

1. **콘텐츠 유형**에 **application/json**을 입력합니다.

1. **템플릿 본문**에 다음 템플릿을 입력합니다.

   ```
   #set($inputRoot = $input.path('$'))
   {
       "stageName" : "$stageVariables.stageName"
   }
   ```
**참고**  
 매핑 템플릿에서 스테이지 변수는 따옴표 안에 참조되어야 합니다(`"$stageVariables.stageName"` 또는 `"${stageVariables.stageName}"`에서와 같이). 다른 곳에서는 따옴표 없이 참조해야 합니다(`${stageVariables.function}`에서와 같이).

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

1. **베타** 및 **프로덕션** 스테이지 모두에 API를 배포합니다.

1. REST API 클라이언트를 사용하여 스테이지별 메타데이터를 전달하려면 다음을 수행합니다.

   1. **단계** 탐색 창에서 **베타**를 선택합니다. **스테이지 세부 정보**에서 복사 아이콘을 선택해 API의 호출 URL을 복사하여 REST API 클라이언트의 입력 필드에 입력합니다. **/lambdav1**을 추가한 후 요청을 제출합니다.

      응답은 다음과 같습니다.

      ```
      "Hello, World! I'm calling from the beta stage."
      ```

   1. **스테이지** 탐색 창에서 **프로덕션**을 선택합니다. **스테이지 세부 정보**에서 복사 아이콘을 선택해 API의 호출 URL을 복사하여 REST API 클라이언트의 입력 필드에 입력합니다. **/lambdav1**을 추가한 후 요청을 제출합니다.

      응답은 다음과 같습니다.

      ```
      "Hello, World! I'm calling from the prod stage."
      ```

1. **테스트** 기능을 사용하여 스테이지별 메타데이터를 전달하려면 다음을 수행합니다.

   1. **리소스** 탐색 창에서 **테스트** 탭을 선택합니다. 탭을 표시하려면 오른쪽 화살표 버튼을 선택해야 할 수도 있습니다.

   1. **function**에 **HelloWorld**를 입력합니다.

   1. **stageName**에 **beta**를 입력합니다.

   1. **테스트**를 선택합니다. `POST` 요청에 본문을 추가할 필요는 없습니다.

      응답은 다음과 같습니다.

      ```
      "Hello, World! I'm calling from the beta stage."
      ```

   1. 이전 단계를 반복하여 **프로덕션** 스테이지를 테스트할 수 있습니다. **stageName**에 **Prod**를 입력합니다.

      응답은 다음과 같습니다.

      ```
      "Hello, World! I'm calling from the prod stage."
      ```