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를 생성합니다.
원하는 API 이름을 지정합니다.youtube-demo 로 선택하겠습니다 .지금은 경로와 단계를 건너뛰고 곧 추가하겠습니다.'검토 및 생성(Review and Create)'을 클릭하면 기본 단계($default)와 함께 새 API 게이트웨이 엔드포인트가 생성됩니다.기본 단계에는 할당된 연결된 호출 URL도 있습니다.
경로를 설정하려면 먼저 경로를 통합할 수 있는 백엔드 서비스가 필요합니다.이제 데이터를 제공할 백엔드 서비스를 구축해 보겠습니다.
Backend Services - AWS Lambda
API Gateway는 데이터를 제공할 수 있는 여러 통합 유형을 지원합니다.아래는 이 글을 작성하는 시점에서 지원되는 것들입니다.
예제에서는 AWS Lambda Functions와 통합하여 API endpoints 에서 데이터를 보내고 받습니다.
아래와 같이 일부를 반환하는 새 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.APIGatewayEventsnuget 패키지APIGatewayProxyRequest에서 사용합니다.앞에서 본 것처럼Mock Lambda 테스트 도구를 사용하여 로컬에서 function 코드를 실행할 수 있습니다 .
이 기능을 AWS 계정에 빠르게 배포하려면 Visual Studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하여 'Publish To AWS Lambda..' 옵션을 사용하세요.AWS Toolkit 은 이 옵션을 제공합니다.실제 애플리케이션에서 소스 코드 리포지토리가 변경될 때마다 자동으로 배포하도록 빌드-배포 파이프라인을 설정할 수 있습니다.
AWS 계정에 배포되면 이 Function를 사용하여 API Gateway 엔드포인트를 제공할 수 있습니다.
HTTP 메서드와 resource 경로로 구성됩니다.이 조합은 경로가 일치하는 백엔드 서비스 또는 통합을 매핑하는 데 사용됩니다.HTTP 메서드는모든 메서드와 일치하는 모든 HTTP 동사 또는ANY 입니다.
다른 요청과 일치하지 않는 요청에 대한 대체 경로(fallback route) 역할을 하는$defaultroute 를 추가할 수도 있습니다 .
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 이동하면,lambdaFunction 의 날씨 데이터 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 등)를 구별할 수 있습니다.
기본적으로 이것은 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 에 따라 적절한 람다 함수를 선택했습니다.
이 예에서는 테스트 stage 에 대해env변수를 '-test'로 설정 했으므로 해당 stage 에 대해get-weather-forecast-devlambda 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 ARN 및 Action 을 지정합니다.
Source ARN 에는 이 lambda function에 액세스할 API Gateway endpoint 세부 정보가 필요합니다.stage및 Action type 에 따라 아래와 같이 지정할 수 있습니다.
첫 번째 와일드카드 *는 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 에 따라 백엔드 서비스 간에 성공적으로 전환할 수 있습니다.그런 다음 이러한 백엔드 서비스는 데이터베이스, 스토리지 및 기타 서비스의 인스턴스와 통신할 수 있습니다.