Apache APISIX로 서버리스 API 관리하기
January 18, 2023
서버리스 컴퓨팅은 개발자가 인프라를 관리할 필요 없이 애플리케이션을 더 빠르게 구축할 수 있게 해줍니다. 클라우드의 서버리스 API를 사용하면 클라우드 서비스 제공업체가 코드 실행에 필요한 인프라를 자동으로 프로비저닝, 확장 및 관리합니다. 이 글에서는 Apache APISIX API Gateway를 Azure functions와 통합하여 Java 기반 서버리스 API를 관리하는 방법을 배우게 됩니다.
학습 목표
이 글을 통해 다음을 배우게 됩니다:
- 서버리스 API란 무엇인가?
- 복잡한 서버리스 API 트래픽을 관리하는 API Gateway의 역할.
- Apache APISIX Gateway를 설정하는 방법.
- Azure Functions로 서버리스 API를 구축하는 방법.
- 서버리스 API를 업스트림 서비스로 노출하는 방법.
- APISIX 인증 플러그인으로 서버리스 API를 보호하는 방법.
- 속도 제한 정책을 적용하는 방법.
Apache APISIX는 AWS Lambda와 같은 다른 서버리스 솔루션과 함께 사용할 수 있는 추가 플러그인을 제공합니다.
실습을 시작하기 전에 몇 가지 개념을 살펴보겠습니다.
서버리스 API란 무엇인가?
서버리스 API는 전통적인 API와 동일하지만 서버리스 백엔드를 사용합니다. 비즈니스와 개발자에게 서버리스 컴퓨팅은 서버 유지 관리나 확장에 대해 더 이상 걱정할 필요가 없음을 의미합니다. 또한, 서버리스 API는 요청이 있을 때마다 서버 리소스를 생성하기 때문에 확장 문제를 피할 수 있습니다. 서버리스 API는 오리진 서버에 호스팅되기 때문에 지연 시간을 줄입니다. 마지막으로, 서버리스 컴퓨팅은 마이크로서비스와 같은 전통적인 대안보다 훨씬 더 비용 효율적입니다.
Azure 함수를 사용한 서버리스 API
Azure Function은 클라우드에서 작은 코드 조각을 실행하는 간단한 방법입니다. 코드를 호스팅하는 데 필요한 인프라에 대해 걱정할 필요가 없습니다. C#, Java, JavaScript, PowerShell, Python 또는 지원되는 언어 목록에 있는 언어로 함수를 작성할 수 있습니다.
Azure Functions를 사용하면 웹 프레임워크의 번거로움 없이 웹 앱을 위한 HTTP API를 빠르게 구축할 수 있습니다. Azure Functions는 서버리스이므로 HTTP 엔드포인트가 호출될 때만 요금이 청구됩니다. 엔드포인트가 사용되지 않을 때는 요금이 청구되지 않습니다. 이 두 가지가 결합되어 Azure Functions와 같은 서버리스 플랫폼은 트래픽이 예기치 않게 급증하는 API에 이상적인 선택이 됩니다.
서버리스 API 트래픽 관리를 위한 API Gateway
API Gateway는 서버리스 API의 기본 부분입니다. 정의된 API와 해당 API에 대한 요청을 처리하는 함수 간의 연결을 담당하기 때문입니다. 서버리스 기반 API 아키텍처에서 API Gateway의 이점은 많습니다. API Gateway의 주요 기능인 인증, 속도 제한, 관찰 가능성, 캐싱 등 외에도, 서버리스 API를 호출하고, 이벤트를 구독한 후 콜백을 사용하여 처리하고, 완전히 사용자 정의된 서버리스 함수 로직으로 외부 인증 서비스에 인증 요청을 전달할 수 있습니다.
Apache APISIX 데모로 서버리스 API 관리
이론적인 지식을 충분히 익혔으니 이제 실습으로 넘어갈 수 있습니다. GitHub에 호스팅된 예제 프로젝트 리포지토리 apisix-manage-serverless-apis를 사용합니다. 이 튜토리얼에서 사용하는 소스 코드와 샘플 curl 명령을 찾을 수 있습니다.
미니 프로젝트를 위해 Product 및 Review 서비스를 위한 서버리스 API를 시뮬레이션하는 Java로 작성된 두 개의 간단한 Azure 함수로 작업할 것입니다.
사전 요구 사항
- 기본 API 개념에 익숙해야 함
- Azure Functions에 대한 실무 지식이 있어야 함, 예를 들어 이 학습 모듈은 Visual Studio Code용 Azure Functions 확장을 사용하여 HTTP API를 구축하는 방법을 보여줍니다.
- Docker
- Azure 계정
- Azure CLI
- Java 개발자 키트, 최소 버전 8
- Maven
- Azure Functions Core Tools
- Visual Studio Code
- Azure Functions Core Tools (최소 버전 2.6.666)
- Visual Studio Code용 Azure Functions 확장
프로젝트 설정
먼저 GitHub에서 프로젝트 리포지토리를 클론합니다:
git clone https://github.com/Boburmirzo/apisix-manage-serverless-apis.git
프로젝트 폴더를 선호하는 코드 편집기에서 엽니다. 이 튜토리얼은 VS Code를 활용합니다.
Apache APISIX 실행
Apache APISIX와 Azure 함수를 로컬에서 실행하려면 다음 단계를 따르세요:
새 터미널 창을 열고 프로젝트의 루트 폴더에서 docker compose up
명령을 실행합니다:
docker compose up -d
위 명령은 Docker와 함께 Apache APISIX와 etcd를 실행합니다. 예를 들어, Docker 데스크톱이 설치된 경우 실행 중인 컨테이너를 볼 수 있습니다:
이 데모에서는 로컬 환경에 APISIX를 설치했지만 Azure Container Instance에 배포하여 실행할 수도 있습니다. 다음 튜토리얼을 참조하세요.
Azure 함수 실행
그런 다음 /upstream
폴더로 이동합니다:
mvn clean install
mvn azure-functions:run
두 함수가 터미널 창에서 시작됩니다. 브라우저에서 두 서버리스 API를 요청할 수 있습니다:
예를 들어:
Azure 함수 배포
다음으로, 아래 명령을 실행하여 함수 코드를 Azure Function App에 배포합니다:
mvn azure-functions:deploy
또는 함수 프로젝트를 Azure에 배포하는 방법에 대한 이 튜토리얼을 따를 수 있습니다.
함수 앱 이름은
artifactId
를 기반으로 무작위로 생성되며 무작위로 생성된 숫자가 추가됩니다. 튜토리얼 명령에서 함수 앱 이름serverless-apis
가 언급됩니다.
함수가 작동하는지 확인하기 위해 브라우저에서 직접 URL을 요청하여 테스트할 수 있습니다:
https://serverless-apis.azurewebsites.net/api/products
https://serverless-apis.azurewebsites.net/api/reviews
APISIX에서 서버리스 API 노출
설정이 완료되면 이제 APISIX에서 서버리스 Azure 함수 API를 업스트림 서비스로 노출할 것입니다. 이를 위해 products
및 reviews
서버리스 백엔드 API에 대해 azure-function
플러그인이 활성화된 새로운 Route를 생성해야 합니다.
azure-function
플러그인이 경로에서 활성화되면 APISIX는 해당 경로의 경로에서 요청을 수신한 다음 해당 요청의 매개변수를 사용하여 원격 Azure 함수 코드를 호출합니다.
Products 함수에 대한 경로 생성
Products 함수에 대한 경로를 생성하려면 다음 명령을 실행합니다:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"name": "Create a route with Azure function plugin",
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/products",
"ssl_verify": false
}
},
"uri": "/products"
}'
데모 목적으로만
azure-functions
플러그인의ssl_verify
속성을false
로 설정하여 SSL 검증을 비활성화했습니다. APISIX에서 Azure Functions로 더 안전한 요청을 수행하려면 이를 활성화할 수도 있습니다. 다른 구성 매개변수를 알아보세요.
curl 요청으로 테스트
curl을 사용하여 요청을 보내 APISIX가 경로를 올바르게 수신하고 요청을 업스트림 서비스로 성공적으로 전달하는지 확인할 수 있습니다:
curl -i -XGET http://127.0.0.1:9080/products
HTTP/1.1 200 OK
[
{
"id": 1,
"name": "Product1",
"description": "Description1"
},
{
"id": 2,
"name": "Product2",
"description": "Description2"
}
]
좋습니다! Azure Function의 실제 서버리스 API로부터 응답을 받았습니다.
다음으로 reviews
함수에 대해 유사한 구성을 할 것입니다.
Reviews 함수에 대한 경로 생성 및 테스트
두 번째 경로를 생성하고 Azure 함수 플러그인을 활성화합니다:
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/reviews",
"ssl_verify": false
}
},
"uri": "/reviews"
}'
서버리스 API 응답 테스트:
curl -i -XGET http://127.0.0.1:9080/reviews
이 섹션에서는 새로운 경로를 소개하고 서버리스 API에 azure-functions
플러그인을 추가하여 APISIX가 원격 Azure 함수를 호출하고 트래픽을 관리할 수 있게 했습니다. 다음 섹션에서는 API 소비자를 인증하고 속도 제한과 같은 런타임 정책을 적용하는 방법을 배우게 됩니다.
APISIX 인증 플러그인으로 서버리스 API 보호
지금까지 서버리스 API는 공개되어 있으며 권한이 없는 사용자도 접근할 수 있습니다. 이 섹션에서는 인증 기능을 활성화하여 권한이 없는 요청을 서버리스 API에 허용하지 않도록 할 것입니다.
Apache APISIX는 자격 증명 및 토큰 검증을 통해 API 요청과 관련된 신원을 확인할 수 있습니다. 또한 API를 통해 백엔드 서비스로 전달할 수 있는 트래픽을 결정할 수 있습니다. 사용 가능한 모든 인증 플러그인을 확인할 수 있습니다.
서버리스 API에 대한 새로운 소비자를 생성하고 기존 경로에 basic-auth 플러그인을 추가하여 허용된 사용자만 접근할 수 있도록 해보겠습니다.
서버리스 API에 대한 새로운 소비자 생성
아래 명령은 사용자 이름과 비밀번호와 같은 자격 증명을 가진 새로운 소비자를 생성합니다:
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "consumer1",
"plugins": {
"basic-auth": {
"username": "username1",
"password": "password1"
}
}
}
기존 Products 및 Services 경로에 basic auth 플러그인 추가
이제 경로에 basic-auth
플러그인을 구성하여 APISIX가 API가 호출될 때마다 API 소비자 자격 증명과 함께 요청 헤더를 확인하도록 합니다:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"name": "Create a route with Azure function plugin",
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/products",
"ssl_verify": false
},
"basic-auth": {}
},
"uri": "/products"
}'
curl http://127.0.0.1:9180/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/reviews",
"ssl_verify": false
},
"basic-auth": {}
},
"uri": "/reviews"
}'
basic auth 플러그인 테스트
이제 헤더에 사용자 자격 증명 없이 서버리스 API를 요청하면 권한 없음 오류가 발생합니다:
curl -i http://127.0.0.1:9080/products
HTTP/1.1 401 Unauthorized
{"message":"Missing authorization in request"}
결과는 예상대로입니다. 그러나 요청에 올바른 사용자 자격 증명을 제공하고 동일한 엔드포인트에 접근하면 잘 작동합니다:
curl -i -u username1:password1 http://127.0.0.1:9080/products
HTTP/1.1 200 OK
Apache APISIX의 도움으로 기본 인증 플러그인을 사용하여 서버리스 API를 요청하려는 클라이언트의 신원을 검증했습니다.
서버리스 API에 속도 제한 정책 적용
이 섹션에서는 서버리스 API를 남용으로부터 보호하기 위해 제한 정책을 적용할 것입니다. Apache APISIX Gateway에서는 들어오는 호출 수를 제한하기 위해 속도 제한을 적용할 수 있습니다.
속도 제한 정책 적용 및 테스트
Products 및 Reviews 함수에 대한 기존 경로 구성을 선택한 상태에서 limit-count 플러그인을 사용하여 API를 비정상적인 사용으로부터 보호하기 위해 속도 제한 정책을 적용할 것입니다. API 호출 수를 API 소비자당 60초 동안 2회로 제한할 것입니다.
기존 Products 경로에 limit-count
플러그인을 활성화하려면 Json 경로 구성의 plugins 속성에 플러그인을 추가해야 합니다:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"name": "Create a route with Azure function plugin",
"plugins": {
"azure-functions": {
"function_uri": "https://serverless-apis.azurewebsites.net/api/products",
"ssl_verify": false
},
"basic-auth": {},
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 403,
"rejected_msg": "Requests are too frequent, please try again later."
}
},
"uri": "/products"
}'
Apache APISIX는 처음 두 요청을 정상적으로 처리합니다. 그러나 동일한 기간 동안 세 번째 요청은 사용자 정의 오류 메시지와 함께 403 HTTP Forbidden
코드를 반환합니다:
HTTP/1.1 403 Forbidden
{"error_msg":"Requests are too frequent, please try again later."}
다음 단계
이 글에서는 Azure Functions와 Apache APISIX Gateway를 사용하여 Java 기반 서버리스 API를 생성하고, APISIX에서 서버리스 API를 업스트림 서비스로 노출하는 방법부터 적절히 보호하고 요청 수를 제한하기 위해 속도 제한을 적용하는 방법까지 단계별로 배웠습니다. 이는 API Gateway와 서버리스 API 통합의 다른 사용 사례로의 문을 엽니다.
APISIX Gateway의 다른 기능을 탐색하여 다양한 내장 플러그인을 연결하여 요청을 변환하고, 서버리스 API의 가용성, 성능 및 사용량을 모니터링하고, API 응답을 캐싱하며, API 버전 관리를 통해 더 발전시킬 수 있습니다. 이를 통해 개발 시간을 단축하고 확장성을 높이며 비용을 절감할 수 있습니다.
Apache APISIX는 완전한 오픈 소스 API Gateway 솔루션입니다. 서버리스 API에 대한 더 고급 API 관리 기능이 필요한 경우 API7 Enterprise 또는 API7 Cloud를 사용할 수 있습니다. 이들은 APISIX를 기반으로 합니다.