재우니의 블로그

Amazon API Gateway 를 활용한 .net - HTTP APIs 를 빌드하는 방법

 

 

Amazon API Gateway는 개발자가 규모에 상관없이 API를 구축하고 유지 관리하는 데 도움이 되는 완전 관리형 서비스입니다. 게이트웨이는 비즈니스 데이터 및 백엔드 서비스에 대한 'front door' 역할을 합니다.

API Gateway 는 HTTP 엔드포인트를 통해 함수를 매우 쉽게 노출할 수 있게 해주기 때문에 서버리스 기술, 특히 AWS Lambda와 함께 자주 언급됩니다.

 

HTTP API는 다양한 AWS 서비스와의 낮은 지연 시간, 비용 효율적인 통합을 위해 설계된 최신 서비스 세트입니다. 이전 세대 REST API에 비해 많은 장점이 있습니다. 그러나 누락된 기능도 있습니다. 따라서 시작하기 전에 HTTP API가 올바른 선택인지 확인하세요. (대부분의 경우).

 

<유투브 영상으로 알아보기>
 
 

이 게시물에서는 .NET Core에 구축된 AWS Lambda Function 에 연결하는 Amazon API Gateway에서 HTTP API를 설정하는 방법을 알아보겠습니다. API를 빌드할 때 익숙한 다양한 일반적으로 필요한 기능을 살펴보겠습니다.

API Gateway 생성

먼저 Amazon API Gateway 아래의 AWS 포털로 이동하여 새 HTTP API를 생성합니다.

 

Amazon API Gateway(aws-console-api-gateway-create-http-api.jpg) 의 하단에 AWS 콘솔에서 새 HTTP API 추가함

 

원하는 API 이름을 지정합니다. youtube-demo 로 선택하겠습니다 . 지금은 경로와 단계를 건너뛰고 곧 추가하겠습니다. '검토 및 생성(Review and Create)'을 클릭하면 기본 단계( $default)와 함께 새 API 게이트웨이 엔드포인트가 생성됩니다. 기본 단계에는 할당된 연결된 호출 URL도 있습니다.

 

경로를 설정하려면 먼저 경로를 통합할 수 있는 백엔드 서비스가 필요합니다. 이제 데이터를 제공할 백엔드 서비스를 구축해 보겠습니다.

 

 

Backend Services - AWS Lambda

 

 

API Gateway는 데이터를 제공할 수 있는 여러 통합 유형을 지원합니다. 아래는 이 글을 작성하는 시점에서 지원되는 것들입니다.

 

Amazon API Gateway(api-gateway-http-api-supported-integrations.jpg)에서 HTTP API를 구축할 때 지원되는 통합 유형 임

 

 

예제에서는 AWS Lambda Functions와 통합하여 API endpoints 에서 데이터를 보내고 받습니다.

 

 

 

 

AWS Lambda 함수를 빠르게 생성하고 배포하려면 AWS Toolkit for Visual Studio 와 함께 제공되는 템플릿을 사용하세요. (다른 IDE에도 이 도구 키트가 구현되어 있음).

 

아래와 같이 일부를 반환하는 새 function 를 만들어 보겠습니다 ( ASP NET Core 기본 템플릿 WeatherData 을 사용해본 경험이 있는 경우 익숙할 것입니다 ).

public class Function
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    public List<WeatherForecast> FunctionHandler(
                    APIGatewayProxyRequest input, ILambdaContext context)
    {
        Console.WriteLine(JsonSerializer.Serialize(input));
       
        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            City = $"{cityName}-test",
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToList();
    }
}

 

function  는 API Gateway에서 입력을 받기 때문에 Amazon.Lambda.APIGatewayEvents nuget 패키지APIGatewayProxyRequest 에서 사용합니다. 앞에서 본 것처럼 Mock Lambda 테스트 도구를 사용하여 로컬에서 function  코드를 실행할 수 있습니다 .

 

이 기능을 AWS 계정에 빠르게 배포하려면 Visual Studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하여 'Publish To AWS Lambda..' 옵션을 사용하세요. AWS Toolkit 은 이 옵션을 제공합니다. 실제 애플리케이션에서 소스 코드 리포지토리가 변경될 때마다 자동으로 배포하도록 빌드-배포 파이프라인을 설정할 수 있습니다.

 

 

AWS 계정에 배포되면 이 Function  를 사용하여 API Gateway  엔드포인트를 제공할 수 있습니다.

 

Routes and Integration

직접 API 요청을 백엔드 리소스로 라우팅 합니다.

HTTP 메서드와 resource  경로로 구성됩니다. 이 조합은 경로가 일치하는 백엔드 서비스 또는 통합을 매핑하는 데 사용됩니다. HTTP 메서드는 모든 메서드와 일치하는 모든 HTTP 동사 또는 ANY 입니다.

다른 요청과 일치하지 않는 요청에 대한 대체 경로(fallback route) 역할을 하는 $default route 를 추가할 수도 있습니다 .

 

 

GET Endpoint

 

첫 번째 GET 엔드포인트를 생성하려면 생성을 선택하고 AWS 콘솔의 경로 아래에 경로 세부 정보를 입력합니다. GET /weather-forecast 아래에서 경로 를 만들고 있습니다.

 

 

 

Create and Attach Integration

 

이 경로에 대한 백엔드 integration 을 생성하고 연결할 수 있습니다. 사이드바 아래의 경로 또는 integration  메뉴 옵션에서 경로로 이동할 수 있습니다.

 

 

이전에 배포한 Lambda Function를 선택합니다. 생성을 클릭하면 integration 이 생성되고 API 게이트웨이가 AWS Lambda Function 를 호출할 수 있는 관련 권한이 추가됩니다.

 

API가 모두 설정되었습니다. API에 대한 기본 URL로 /weather-forecast  이동하면, lambda Function 의 날씨 데이터 response 이 표시됩니다.

 

Query Parameters

 

다른 URL과 마찬가지로 쿼리 매개변수로 URL의 API에 매개변수를 전달할 수 있습니다. 이들은 백엔드 integration 으로 전달됩니다.

lambda integration 의 경우 인스턴스 .APIGatewayProxyRequest 에서 QueryStringParameters 의 속성을 통해 쿼리 매개변수를 검색할 수 있습니다.

이 cityName 를 검색하기 위해 function handler 를 업데이트했습니다 . 쿼리의 일부로 전달된 경우 해당 도시의 날씨 데이터를 반환합니다.

 

public List<WeatherForecast> FunctionHandler(APIGatewayProxyRequest input, ILambdaContext context)
{
    Console.WriteLine(JsonSerializer.Serialize(input));
    string cityName = null;
    input.QueryStringParameters?.TryGetValue("cityName", out cityName);
    cityName = cityName ?? "Brisbane";

    var rng = new Random();
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        City = cityName,
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .ToList();
}

AWS 함수에 배포되면 API 요청과 함께 도시 이름 매개변수를 전달할 수 있습니다 →GET /weather-forecast?cityName=Sydney

 

 

 

Path Parameters & Parameter Mapping(경로 매개변수 및 매개변수 매핑)

 

쿼리 매개변수와 마찬가지로 API Gateway 경로 URL을 정의할 때 경로 매개변수(Path parameters)도 정의할 수 있습니다. 예를 들어 cityName 경로 endpoint 을 만들 때 URL 경로의 일부로 에 포함할 수 있습니다.

예를 들어 URL 경로가 GET /weather-forecast/{cityName} 인 경우, URL을 호출할 때 cityName 이 전달되도록 해야 하며, 이는 더 이상 선택 사항이 아닙니다. 제공된 경우에만 적절한 backend integration 에 매핑됩니다.

 

Path parameters 는 APIGatewayProxyRequest 에서 PathParameters 속성을 통해 사용할 수 있습니다.

AWS Lambda에 현재 배포된 코드를 사용하여 path parameter 로 전환하면 코드가 손상됩니다. QueryStringParameters 대신 PathParameters 속성을 확인하도록 코드를 업데이트해야 합니다. 그러나 API Gateway에서 매개변수 매핑(parameter mapping) 을 수행하여 path parameter query string parameter (및 그 이상)로도 매핑할 수도 있습니다.

Parameter mapping 은 백엔드 통합(integrations)으로 전송되기 전에 요청을 변환하거나 요청하는 클라이언트로 다시 전송되기 전에 응답을 변경할 수 있습니다.

 

Path parameters에서 쿼리 문자열 매개변수를 매핑하려면...

 

 

모든 수신 요청에 대한 새 Parameter mapping 을 추가합니다. 매핑은 새 쿼리 string parameter (cityName)를 추가하고 이름이 cityName인 Path parameters 의 값으로 설정합니다.

 

 

QueryStringParameters이 매핑이 있으면 URL에서 Path parameters 를 사용하는 경우 기존 function  코드를 보고나서 작동합니다. API Gateway는 요청을 확인하면 query parameter 에 추가하도록 수정하고 Path parameters 의 값으로 설정한 다음 Lambda integration 으로 보냅니다.

 

 

POST Endpoint

POST /weather-forecast/{cityName} 을 생성하려면 메서드 유형이 POST인 새 Route 를 추가하고 GET 엔드포인트를 생성하는 방법과 매우 유사한 엔드포인트 Route를 지정합니다.

 

backend service 에 대한 새로운 lambda function 를 게시해야 합니다. 아래에는 POST endpoint 에 대한 샘플 코드가 있습니다.

PathParameters 속성에서 cityName을 검색하고 request body 의 WeatherForecast 개체에 설정합니다. 실제 응용 프로그램에서는 이 데이터를 데이터베이스에 저장하고 이벤트를 발생시키는 등의 작업을 수행합니다.

 

public APIGatewayProxyResponse FunctionHandlerPost(
    APIGatewayProxyRequest input, ILambdaContext context)
{
    var data = JsonSerializer.Deserialize<WeatherForecast>(input.Body);

    string cityName = "Brisbane";
    input.PathParameters?.TryGetValue("cityName", out cityName);

    data.City = cityName;
    return new APIGatewayProxyResponse()
    {
        Body = JsonSerializer.Serialize(data),
        StatusCode = (int)HttpStatusCode.OK
    };
}

 

Visual Studio에서 게시를 사용하는 경우 게시 옵션 대화 상자에서 function name Handler function 도 업데이트해야 합니다. 성공적으로 게시되면 아래와 같이 새 Route 에 대한 새 람다 통합을 만들고 설정할 수 있습니다.

 

 

POST endpoint 인 api-gateway-http-api-create-lambda-integration-post.jpg에 대한 Lambda integration 

설정이 완료되면 POST requests 을 새 endpoint  로 성공적으로 보내고 작동하는 모습을 볼 수 있습니다.

 

Stages

 

API Gateway의 Stages는 API lifecycle  에 대한  logical reference 입니다. 이를 사용하여 다양한 개발 lifecycle (dev, test, staging, prod 등)를 구별할 수 있습니다.

API Gateway 생성 시 $default Stages가 자동으로 생성됩니다. Stages 는 API URL의 기반에서 제공됩니다. Stages의 경우 기본 URL 뒤에 단계 이름(https://{api_id}.execute-api.{region}.amazonaws.com/{stageName}) 형태를 지니고 있습니다.

 

Deploy  → Stages 에서 API에 대한 새 Stages 를 생성할 수 있습니다.

 

API Gateway api-gateway-http-api-create-stage.jpg에서 새&nbsp; Stages &nbsp;생성

 

 

기본적으로 이것은 Routes integrations 을 생성할 때 lambda functions hard-wired 했기 때문에 동일한 integrations 에 매핑됩니다.

 

 

Stage 에 따라 다른  Backend Integration

 

Stages를 사용할 때, 우리는 우리의 backend service 가 stage에 따라 달라지기를 원합니다 - lambda function, database, etc., per environment 로 주로 선호됩니다.

 

먼저 environment  → get-weather-forecast-test 용 GET endpoint  에 대해 다른  lambda function 를 설정합니다. 날씨 데이터 목록을 반환할 때 cityName 에 '-test'를 추가합니다.

 

stage 를 기반으로 다른 lambda functions 를 매핑하려면 먼저 Stage Variable 를 만들어야 합니다. Stages 아래에서 Stages 를 편집하고 새로운 변수를 추가할 수 있습니다. 아래에 값이 '-test'인 신규 변수 env를 추가했습니다.

 

 

integration 을 정의할 때 이 새로운 stage 변수를 사용할 수 있습니다. 기존 람다 integration 을 편집하고 드롭다운에서 명시적으로 람다 함수를 선택하는 대신 람다에 ARN을 지정할 수 있습니다. stage 변수를 사용하여 람다 함수 이름을 작성할 수 있습니다.

 

아래 예에서는 다음 형식을 사용 get-weather-forecast하여 stage 에 따라 적절한 람다 함수를 선택했습니다.

 

arn:aws:lambda:ap-southeast-2:aws-account-id:function:get-weather-forecast${stageVariables.env}

 

이 예에서는 테스트 stage 에 대해 env변수를 ' -test '로 설정 했으므로 해당 stage 에 대해 get-weather-forecast-dev  lambda function 를 선택합니다. 기본 stage 에 대한 env 변수 가 없기 때문에 get-weather-forecast 람다를 선택합니다.

stage 에 따라  lambda function가 자동으로 결정되므로 API Gateway lambda function를 호출할 수 있는 적절한 권한을 부여해야 합니다.  lambda function는 명시적으로 할당되지 않으므로 Lambda에서 이 권한을 수동으로 설정해야 합니다.

 lambda function 로 이동합니다.  Configuration → Permissions → Resource-Based Policy → Policy statement 에서 권한 추가를 선택합니다. API Gateway 에 대한 액세스 권한을 부여하려면 AWS 서비스 를 선택하고 Gateway API를 선택합니다. 고유한 StatementId 를 제공하고, Source ARNAction 을 지정합니다.

 

Source ARN 에는 이  lambda function에 액세스할 API Gateway endpoint 세부 정보가 필요합니다. stage 및 Action type 에 따라 아래와 같이 지정할 수 있습니다.

 

arn:aws:execute-api:ap-southeast-2:AWS-ACCOUNT-ID:API-ID///weather-forecast/{cityName}

 

첫 번째 와일드카드 *는 stage 를 나타내고 두 번째 와일드카드는 HTTP VERB 동사를 나타냅니다.

 

 

이제 API Gateway에 Lambda function를 호출할 수 있는 적절한 권한이 있습니다. test stage 에서 URL을 호출 get-weather-forecast-test 하면 적절한 stage변수를 매핑한 후  lambda function 를 호출합니다 . default stage 가 호출되면lambda function 인 get-weather-forecast 를 호출합니다.

 

배포된 stage 에 따라 백엔드 서비스 간에 성공적으로 전환할 수 있습니다. 그런 다음 이러한 백엔드 서비스는 데이터베이스, 스토리지 및 기타 서비스의 인스턴스와 통신할 수 있습니다.

 

 

여기에서 람다 함수의 소스 코드를 찾을 수 있습니다 .

 

원본 사이트

 

https://www.rahulpnath.com/blog/amazon-api-gateway-http-apis/

 

Amazon API Gateway for the .NET Developer - How To Build HTTP APIs | Rahul Nath

Learn how to get started with API Gateway by building an HTTP API backed by AWS Lambda running on .NET Core. We will see how to create different HTTP endpoints, connect them to lambda functions, send and receive data, set up stages, and more.

www.rahulpnath.com