Apache APISIX와 Azure Serverless의 통합
API7.ai
December 1, 2021
Apache APISIX는 주요 클라우드 벤더를 위한 서버리스 프레임워크 지원을 제공합니다(추가 지원 예정). 애플리케이션에 함수 URL을 하드코딩하는 대신, Apache APISIX는 서버리스 플러그인이 활성화된 경로를 정의할 것을 제안합니다. 이를 통해 개발자들은 함수 URI를 핫 업데이트할 수 있을 뿐만 아니라, 완전히 다른 클라우드 제공자로 FaaS 벤더를 변경하는 것도 간편하게 할 수 있습니다. 또한, 이 접근 방식은 애플리케이션 로직에서 인증 및 권한 부여 문제를 완화합니다. Apache APISIX는 매우 강력한 인증 지원을 제공하여 클라이언트 소비자가 특정 경로에 접근할 수 있도록 식별하고 권한을 부여할 수 있습니다. 이 글은 최근 추가된 새로운 플러그인 azure-functions
에 대해 이야기하고, 널리 사용되는 서버리스 솔루션인 Azure Functions를 Apache APISIX 서버리스 제품군에 통합하는 방법에 대한 자세한 지침을 제공합니다.
azure-functions 플러그인의 작동 방식
azure-functions
플러그인은 사용자가 게이트웨이 URI에 대해 Azure HTTP Trigger
서버리스 함수로의 업스트림을 정의할 수 있게 합니다. 이 플러그인이 활성화되면, 해당 특정 URI로의 진행 중인 요청을 종료하고, 사용자가 설정한 적절한 인증 정보, 요청 헤더, 요청 본문, 매개변수(이 세 가지 구성 요소는 원래 요청에서 전달됨)를 사용하여 클라이언트를 대신하여 Azure FaaS(새로운 업스트림)로 새로운 요청을 시작합니다. 그리고 응답 본문, 상태 코드 및 헤더를 원래 클라이언트에 반환합니다.
이 플러그인은 API 키와 Azure Active Directory를 통해 Azure FaaS 서비스에 대한 인증을 지원합니다.
Apache APISIX와 Azure Functions 사용 방법
이 플러그인의 주요 목표는 경로 구성에 지정된 게이트웨이 경로를 Azure Functions URI로 프록시하는 것입니다. 이 섹션에서는 Azure 클라우드에서 서버리스 HTTP Trigger를 구성하고 생성하는 방법에 대해 실습을 제공합니다.
-
먼저 Microsoft Azure에 가입/로그인하고 평가판 플랜을 설정합니다. Azure Functions는 1백만 번의 호출까지 무료입니다. 가격에 대해 더 알아보려면 여기를 방문하세요.
-
Azure Portal을 방문하세요(FYI, Azure 서비스는 웹 포털, CLI 및 VSCode를 통해 접근할 수 있습니다. 사용자 친화성을 위해 웹을 사용합니다).
- 먼저, 생성할 FaaS를 논리적으로 분할하기 위해 리소스 그룹을 생성합니다.
- 원하는 URL로 함수 앱을 생성합니다(저는 test-apisix를 선택하겠습니다).
- 먼저, 생성할 FaaS를 논리적으로 분할하기 위해 리소스 그룹을 생성합니다.
-
VSCode 편집기에 Azure Functions 확장을 설치합니다. 설치 후, 확장을 통해 인증하고 로컬 개발을 위해 Azure Functions 코어 도구를 설치합니다:
npm install -g azure-functions-core-tools@3 --unsafe-perm true
-
방금 생성한 함수 앱에 다음 스니펫을 VSCode의 Azure Functions 확장 패널을 통해 배포합니다:
module.exports = async function (context, req) { context.log("HTTP trigger invoked on Test-APISIX."); const name = req.query.name || (req.body && req.body.name); const responseMessage = name ? "Hello, " + name : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response."; context.res = { // status: 200, /* Defaults to 200 */ body: responseMessage, }; };
이 스니펫은 쿼리 매개변수(존재하는 경우, 그렇지 않으면 요청 본문)에서 이름을 가져와 사용자에게 인사합니다.
azure-functions 플러그인 활성화
다음은 특정 경로에 대해 azure-functions 플러그인을 활성화하는 방법의 예입니다. HTTP Trigger가 배포되어 서비스할 준비가 되었다고 가정합니다.
# 특정 경로에 플러그인 활성화
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"plugins": {
"azure-functions": {
"function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",
"authorization": {
"apikey": "<Azure-Function에 접근하기 위해 생성된 API 키>"
}
}
},
"uri": "/azure"
}'
이제 Apache APISIX 게이트웨이에서 /azure
URI로의 모든 요청(HTTP/1.1, HTTPS, HTTP2)은 앞서 언급한 함수 URI로 HTTP 호출을 트리거하고, 응답 본문과 함께 응답 헤더 및 응답 코드가 클라이언트에 프록시됩니다. 예를 들어(여기서 Azure 클라우드 함수는 name
쿼리 매개변수를 받아 Hello $name
을 반환합니다):
curl -i -XGET http://localhost:9080/azure\?name=Bisakh
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Request-Context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:55 GMT
Server: APISIX/2.10.2
Hello, Bisakh
Apache APISIX가 config-default.yaml에서 enable_http2: true
로 실행 중이고, 9081 포트(예를 들어)에서 실행 중이라면, 클라이언트와 APISIX 에이전트 간의 모든 HTTP/2
통신은 HTTP/1.1과 유사하게 Azure FaaS로 프록시되고, 응답은 적절한 헤더와 함께 클라이언트에 프록시됩니다. 예를 들어:
curl -i -XGET --http2 --http2-prior-knowledge http://localhost:9081/azure\?name=Bisakh
HTTP/2 200
content-type: text/plain; charset=utf-8
request-context: appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071
Date: Wed, 19 Nov 2021 18:46:56 GMT
server: APISIX/2.10.2
Hello, Bisakh
azure-functions 플러그인 비활성화
이제 플러그인을 비활성화하려면 플러그인 구성에서 해당 JSON 구성을 제거하고 적절한 업스트림 구성을 추가하면 됩니다. Apache APISIX 플러그인은 핫 리로드되므로 Apache APISIX를 재시작할 필요가 없습니다.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/azure",
"plugins": {},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
사용자 정의 구성
azure-functions
플러그인이 활성화된 새로운 경로를 생성할 때, function_uri
는 함수 URL을 가리키는 플러그인 구성의 필수 속성입니다. 플러그인 스키마와 메타데이터 스키마를 통해 조정할 수 있는 많은 추가 옵션이 있습니다.
플러그인 스키마
이름 | 타입 | 필수 | 기본값 | 유효값 | 설명 |
---|---|---|---|---|---|
function_uri | 문자열 | 필수 | 없음 | 없음 | 서버리스 함수 코드를 트리거하는 Azure 함수 엔드포인트(예: http://test-apisix.azurewebsites.net/api/HttpTrigger). |
authorization | 객체 | 선택 | 없음 | 없음 | 클라우드 함수에 접근하기 위한 인증 자격 증명. |
authorization.apikey | 문자열 | 선택 | 없음 | 없음 | 인증 내부 필드. 해당 엔드포인트에 요청을 인증하기 위해 생성된 API 키. |
authorization.clientid | 문자열 | 선택 | 없음 | 없음 | 인증 내부 필드. 해당 엔드포인트에 요청을 인증하기 위한 클라이언트 ID(Azure Active Directory). |
timeout | 정수 | 선택 | 3000 | [100,...] | 프록시 요청 시간 초과(밀리초). |
ssl_verify | 불리언 | 선택 | true | true/false | 서버의 SSL 검증을 활성화할지 여부. |
keepalive | 불리언 | 선택 | true | true/false | 미래에 동일한 프록시 연결을 재사용할지 여부. 연결을 즉시 닫고 keepalive를 비활성화하려면 false로 설정. |
keepalive_pool | 정수 | 선택 | 5 | [1,...] | 풀의 최대 연결 수. |
keepalive_timeout | 정수 | 선택 | 60000 | [1000,...] | 최대 유휴 시간 초과(밀리초). |
이를 통해 Azure FaaS의 동작을 타이트하게 바인딩할 수 있는 많은 유연성을 제공합니다. 시간 초과를 구성하고 keepalive 풀을 설정하며 서버리스 FaaS의 SSL 인증서를 검증하는 것까지 가능합니다. 서버리스는 이벤트 기반이며 클라우드 제공자가 동적으로 리소스를 할당하기 때문에 이는 실제로 많은 의미를 가집니다.
메타데이터 스키마
마찬가지로, 메타데이터를 사용하여 조정할 수 있는 몇 가지 속성이 있습니다.
이름 | 타입 | 필수 | 기본값 | 유효값 | 설명 |
---|---|---|---|---|---|
master_apikey | 문자열 | 선택 | "" | 없음 | Azure 함수 URI에 접근하기 위해 사용할 수 있는 API KEY 비밀. |
master_clientid | 문자열 | 선택 | "" | 없음 | 함수 URI를 인증하기 위해 사용할 수 있는 클라이언트 ID(Active Directory). |
azure-functions
플러그인의 메타데이터는 인증 폴백 기능을 제공합니다. 여기서 사용자는(선택적으로) 미션 크리티컬 애플리케이션 배포를 위해 마스터 API 키 또는 클라이언트 ID(Azure Active Directory 클라이언트 ID)를 정의할 수 있습니다. 따라서 플러그인 속성 내에 인증 세부 정보가 없는 경우 메타데이터에 있는 인증 세부 정보가 적용됩니다.
상대적 우선 순위는 다음과 같습니다:
- 먼저, 플러그인은 Apache APISIX 에이전트에 대한 요청 헤더 내부에서
x-functions-key
또는x-functions-clientid
키를 찾습니다. - 이를 찾을 수 없는 경우, azure-functions 플러그인은 플러그인 속성 내부의 인증 세부 정보를 확인합니다. 존재하는 경우, Azure 클라우드 함수로 전송된 요청에 해당 헤더를 추가합니다.
- 플러그인 속성 내부에 인증 세부 정보가 없는 경우, Apache APISIX는 이 플러그인에 대한 메타데이터 구성을 가져와 마스터 키를 사용합니다.
새로운 마스터 APIKEY를 추가하려면, 업데이트된 메타데이터와 함께 /apisix/admin/plugin_metadata 엔드포인트에 요청을 보냅니다:
curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/azure-functions \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"master_apikey" : "<Azure 마스터 접근 키>"
}'
요약
azure-functions
플러그인은 Apache APISIX의 두 번째 서버리스 플러그인입니다. 우리는 다른 서버리스 플러그인을 개발 중이며, 이를 곧 출시될 Apache APISIX 릴리스에 포함시킬 예정입니다. 관심이 있으시면, 의견을 공유하기 위해 이슈를 등록하는 것을 망설이지 마세요. 새로운 플러그인 개발에 대한 제안은 메일링 리스트에서도 논의할 수 있습니다!