가상 네트워크 통합 서버리스 마이크로서비스

API Management
Cosmos DB
Functions
Key Vault
Virtual Network

이 Azure 솔루션에서 APIM(Azure API Management)은 단일 관리 엔드포인트를 통해 API에 대한 액세스를 제어합니다. 애플리케이션 백 엔드는 환자 기록과 감사 기록을 만들고 관리하는 두 개의 상호 의존적인 Azure Functions 마이크로서비스 앱으로 구성됩니다. APIM과 두 함수 앱은 잠긴 가상 네트워크를 통해 서로 액세스합니다.

이 문서와 관련 코드 프로젝트는 특정 구현을 위한 스캐폴딩 역할을 하기 위해 예제 시나리오를 주요 기술 구성 요소로 요약합니다. 이 솔루션은 Terraform으로 모든 코드 및 인프라 배포를 자동화하며 자동화된 통합, 단위 및 부하 테스트를 포함합니다.

아키텍처

다음 다이어그램은 환자 기록 만들기 요청 흐름을 보여 줍니다.

가상 네트워크 통합 마이크로 서비스를 보여 주는 다이어그램

이 아키텍처의 Visio 파일을 다운로드합니다.

워크플로

  1. 외부 서비스 및 클라이언트는 환자 정보가 포함된 데이터 본문을 사용하여 APIM에 POST 요청을 합니다.
  2. APIM은 지정된 환자 정보를 사용하여 Patient API에서 CreatePatient 함수를 호출합니다.
  3. Patient APICreatePatient 함수는 Audit API 함수 앱의 CreateAuditRecord 함수를 호출하여 감사 레코드를 만듭니다.
  4. Audit APICreateAuditRecord 함수는 Azure Cosmos DB에 감사 레코드를 만들고 Patient APICreatePatient 함수에 대한 성공 응답을 반환합니다.
  5. CreatePatient 함수는 Azure Cosmos DB에서 환자 문서를 만들고 APIM에 성공 응답을 반환합니다.
  6. 외부 서비스와 클라이언트는 APIM으로부터 성공 응답을 받습니다.

구성 요소

이 솔루션은 다음 구성 요소를 사용합니다.

  • APIM(Azure API Management)은 모든 환경에서 API를 관리하기 위한 하이브리드 다중 클라우드 플랫폼입니다. 이 솔루션에서 APIM은 데이터를 읽거나 쓸 수 있는 Patient API에 대한 내부 및 타사 액세스를 제어합니다. APIM을 사용하면 다양한 인증 메커니즘과 쉽게 통합할 수 있습니다.

  • Azure Functions는 작은 이벤트 기반 코드 조각을 처리하는 서버리스 컴퓨팅 플랫폼입니다. 클라우드 인프라는 함수를 대규모로 실행하는 데 필요한 업데이트된 서버를 제공합니다. 현재 솔루션은 환자 테스트 결과 및 감사 레코드에 대한 작업을 만들고 관리하는 두 가지 Azure Functions API 마이크로 서비스 집합을 사용합니다.

  • Azure Virtual Network는 특정 IP 주소 또는 서브넷에 대한 네트워크 액세스를 제한하여 격리되고 매우 안전한 애플리케이션 환경을 제공합니다. APIM과 Azure Functions는 모두 가상 네트워크에서 액세스 제한 및 배포를 지원합니다. 이 솔루션은 지역 가상 네트워크 통합을 사용하여 동일한 지역의 동일한 가상 네트워크에 두 함수 앱을 모두 배포합니다.

  • Azure Key Vault는 키, 인증서 및 연결 문자열에 대한 액세스를 중앙에서 저장, 암호화 및 관리합니다. 이 솔루션은 지정된 ID만 액세스할 수 있는 Key Vault에서 Azure Functions 호스트 키 및 Azure Cosmos DB 연결 문자열을 유지 관리합니다.

  • Azure Cosmos DB는 즉각적인 자동 크기 조정 기능을 갖춘 완전 관리형 서버리스 데이터베이스입니다. 현재 솔루션에서 두 마이크로서비스는 모두 MongoDB Node.js 드라이버를 사용하여 Azure Cosmos DB에 데이터를 저장합니다. 서비스는 데이터를 공유하지 않으며 각 서비스를 자체 독립 데이터베이스에 배포할 수 있습니다.

  • Azure Monitor의 기능인 Application Insights는 이상을 검색하고 진단하는 데 도움이 되도록 애플리케이션 성능, 사용량, 가용성 및 동작에 대해 보고합니다.

    마이크로 서비스 기반 아키텍처의 오류는 종종 다양한 구성 요소에 분산되어 있으며 서비스를 개별적으로 살펴보면 진단할 수 없습니다. 구성 요소 간에 원격 분석의 상관 관계를 지정하는 기능은 이러한 문제를 진단하는 데 매우 중요합니다. Application Insights 원격 분석은 전체 요청 파이프라인을 따라 로깅을 중앙 집중화하여 성능 이상을 검색합니다. 원격 분석은 공통 작업 ID를 공유하여 구성 요소 간의 상관 관계를 허용합니다.

    APIM 및 Azure Functions 런타임은 표준 애플리케이션 출력을 포함하여 다양한 원격 분석을 생성하고 상호 연결하는 Application Insights를 기본적으로 지원합니다. 함수 앱은 Application Insights Node.js SDK를 사용하여 종속성 및 기타 사용자 지정 원격 분석을 수동으로 추적합니다.

    이 솔루션의 분산 원격 분석 추적에 대한 자세한 내용은 분산 원격 분석을 참조하세요.

대안

  • 현재 솔루션에서 APIM 엔드포인트에 액세스하려면 구독 키가 필요하지만 Azure AD(Azure Active Directory) 인증을 사용할 수도 있습니다.
  • API 액세스 키를 요구하는 것 외에도 Azure Functions의 기본 제공 App Service 인증을 사용하여 API의 관리 ID에 대한 Azure AD 권한 부여를 사용하도록 설정할 수 있습니다.
  • 코드를 변경하지 않고 이 솔루션의 Azure Cosmos DB 엔드포인트를 다른 MongoDB 서비스로 바꿀 수 있습니다.
  • 추가 Azure Cosmos DB 보안을 위해 Azure Cosmos DB 데이터베이스에서 함수 앱으로의 트래픽을 잠글 수 있습니다.
  • Azure Cosmos DB와 같은 구성 요소는 원격 분석을 Azure Monitor로 보낼 수 있으며, 여기서 Application Insights의 원격 분석과 상관 관계를 지정할 수 있습니다.
  • Terraform 대신 Key Vault 키 회전 작업에 Azure Portal 또는 Azure CLI를 사용할 수 있습니다.
  • Terraform 대신 Azure DevOps 또는 GitHub Actions와 같은 시스템을 사용하여 솔루션 배포를 자동화할 수 있습니다.
  • 고가용성을 위해 이 솔루션을 여러 지역에 배포할 수 있습니다. Azure Cosmos DB를 다중 마스터로 설정하고 APIM의 기본 제공 다중 지역 지원을 사용하고 Azure Function 앱을 쌍을 이루는 지역에 배포합니다.

시나리오 정보

이 문서에서는 환자 기록 관리를 위한 통합 솔루션에 대해 설명합니다. 의료 기관은 매우 중요한 대량의 환자 의료 테스트 데이터를 클라우드에 디지털 방식으로 저장해야 합니다. 내부 및 타사 시스템은 API(애플리케이션 프로그래밍 인터페이스)를 통해 데이터를 안전하게 읽고 쓸 수 있어야 합니다. 데이터와의 모든 상호 작용은 감사 레지스터에 기록되어야 합니다.

잠재적인 사용 사례

  • 지정된 외부 엔드포인트에서 매우 중요한 데이터에 액세스합니다.
  • 데이터 액세스 작업에 대한 보안 감사를 구현합니다.
  • 상호 의존적인 마이크로서비스 앱을 일반 액세스 및 보안과 통합합니다.
  • 서버리스 비용 절감 및 유연성을 활용하면서 가상 네트워크 보안 기능을 사용합니다.

이점

Azure Functions와 같은 서버리스 애플리케이션의 몇 가지 이점은 전용 서버에 대해 선불로 지불하는 대신 필요한 컴퓨팅 리소스만 사용하는 비용 절감 및 유연성입니다. 이 솔루션을 통해 Azure Functions는 전체 ASE(Azure App Service Environment)의 비용 및 운영 오버헤드를 발생시키지 않고 보안을 위해 가상 네트워크 액세스 제한을 사용할 수 있습니다.

APIM은 Azure Functions에 구축된 API 마이크로 서비스 집합에 대한 내부 및 타사 액세스를 제어합니다. Patient API는 환자 및 해당 테스트 결과에 대한 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 제공합니다. Audit API 함수 앱은 감사 항목을 만드는 작업을 제공합니다.

각 함수 앱은 독립적인 Azure Cosmos DB 데이터베이스에 데이터를 저장합니다. Azure Key Vault는 앱 및 데이터베이스와 관련된 모든 키, 비밀 및 연결 문자열을 안전하게 보관합니다. Application Insights 원격 분석 및 Azure Monitor는 시스템 전체에서 로깅을 중앙 집중화합니다.

고려 사항

이러한 고려 사항은 워크로드의 품질을 향상시키는 데 사용할 수 있는 일단의 지침 원칙인 Azure Well-Architected Framework의 핵심 요소를 구현합니다. 자세한 내용은 Microsoft Azure Well-Architected Framework를 참조하세요.

이 솔루션을 구현할 때 다음 측면을 고려합니다.

보안

우수한 보안은 중요한 데이터 및 시스템에 대한 고의적인 공격과 악용을 방어합니다. 자세한 내용은 보안 요소의 개요를 참조하세요.

데이터의 민감도 때문에 이 솔루션에서는 보안이 가장 중요합니다. 이 솔루션은 다음과 같은 여러 메커니즘을 사용하여 데이터를 보호합니다.

  • API 게이트웨이 관리
  • 가상 네트워크 액세스 제한
  • 서비스 액세스 키 및 연결 문자열
  • Key Vault의 키 및 연결 문자열 관리
  • Key Vault 키 회전
  • 관리되는 서비스 ID

이 솔루션의 보안 패턴에 대한 자세한 내용은 API Management, Functions 앱 및 Azure Cosmos DB 간의 통신을 위한 보안 패턴을 참조하세요.

API 게이트웨이 관리

시스템은 단일 관리 APIM 엔드포인트를 통해서만 공개적으로 액세스할 수 있습니다. APIM 서브넷은 들어오는 트래픽을 지정된 게이트웨이 노드 IP 주소로 제한합니다.

APIM을 사용하면 다양한 인증 메커니즘과 쉽게 통합할 수 있습니다. 현재 솔루션에는 구독 키가 필요하지만 APIM에서 구독 키를 관리할 필요 없이 Azure Active Directory를 사용하여 APIM 엔드포인트를 보호할 수도 있습니다.

가상 네트워크

API 및 함수가 공개적으로 노출되는 것을 방지하기 위해 Azure Virtual Network는 API 및 함수에 대한 네트워크 액세스를 특정 IP 주소 또는 서브넷으로 제한합니다. API Management 및 Azure Functions는 모두 가상 네트워크에서 액세스 제한 및 배포를 지원합니다.

함수 앱은 IPv4, IPv6 및 가상 네트워크 서브넷 액세스를 제한할 수 있습니다. 기본적으로 함수 앱은 모든 액세스를 허용하지만 하나 이상의 주소 또는 서브넷 제한을 추가하면 앱은 다른 모든 네트워크 트래픽을 거부합니다.

이 솔루션에서 함수 앱은 자체 가상 네트워크 내에서만 상호 작용을 허용합니다. Patient API는 APIM 서브넷을 액세스 제한 허용 목록에 추가하여 APIM 서브넷에서 호출을 허용합니다. Audit API는 Patient API 서브넷을 액세스 제한 허용 목록에 추가하여 Patient API와의 통신을 허용합니다. API는 다른 원본의 트래픽을 거부합니다.

이 솔루션은 지역 가상 네트워크 통합을 사용하여 APIM 및 함수 앱을 동일한 가상 네트워크 및 Azure 지역과 통합합니다. 지역 가상 네트워크 통합을 사용하기 위한 몇 가지 중요한 고려 사항이 있습니다.

  • 지역 가상 네트워크 통합과 확장성을 모두 갖추려면 Azure Functions Premium SKU를 사용해야 합니다.
  • VNET 연결을 사용하려면 APIM Developer 또는 Premium SKU를 사용해야 합니다.
  • 가상 네트워크의 서브넷에 함수 앱을 배포하므로 가상 네트워크의 다른 서브넷에서 오는 트래픽을 허용하도록 함수 앱의 액세스 제한을 구성합니다.
  • 지역 가상 네트워크 통합은 Azure Function에서 가상 네트워크로의 아웃바운드 트래픽만 제한합니다. 인바운드 트래픽은 앱의 액세스 목록에 의해 제한되기는 하지만 여전히 가상 네트워크 외부로 라우팅됩니다.

App Service Environment만이 완전한 네트워크 수준 가상 네트워크 격리를 제공합니다. ASE는 지역 가상 네트워크 통합을 지원하는 Azure Functions보다 구현하는 데 훨씬 더 많은 비용과 노력이 필요할 수 있습니다. ASE 스케일링도 덜 탄력적입니다.

액세스 키

액세스 키를 사용하지 않고 APIM 및 함수 앱을 호출할 수 있습니다. 그러나 액세스 키를 사용하지 않도록 설정하는 것은 좋은 보안 방법이 아니므로 이 솔루션의 모든 구성 요소에는 액세스 키가 필요합니다.

  • APIM에 액세스하려면 구독 키가 필요하므로 사용자는 HTTP 헤더에 Ocp-Apim-Subscription-Key를 포함해야 합니다.
  • Patient API 함수 앱의 모든 함수에는 API 액세스 키가 필요하므로 APIM은 Patient API를 호출할 때 HTTP 헤더에 x-functions-key를 포함해야 합니다.
  • Audit API 함수 앱에서 CreateAuditRecord를 호출하려면 API 액세스 키가 필요하므로 Patient API는 CreateAuditRecord 함수를 호출할 때 HTTP 헤더에 x-functions-key를 포함해야 합니다.
  • 두 함수 앱 모두 Azure Cosmos DB를 데이터 저장소로 사용하므로 Azure Cosmos DB 데이터베이스에 액세스하려면 연결 문자열을 사용해야 합니다.

Key Vault 스토리지

애플리케이션 설정에서 액세스 키와 연결 문자열을 유지할 수는 있지만 앱에 액세스할 수 있는 모든 사람이 키와 문자열을 볼 수 있으므로 좋은 방법은 아닙니다. 특히 프로덕션 환경의 경우 키와 문자열을 Azure Key Vault에 유지하고 Key Vault 참조를 사용하여 앱을 호출하는 것이 가장 좋습니다. Key Vault는 지정된 관리 ID에만 액세스를 허용합니다.

APIM은 인바운드 정책을 사용하여 성능 개선을 위해 Patient API 호스트 키를 캐시합니다. 후속 시도에서 APIM은 먼저 캐시에서 키를 찾습니다.

  • APIM은 Key Vault에서 Patient API 호스트 키를 검색하여 캐시하고 Patient API 함수 앱을 호출할 때 HTTP 헤더에 넣습니다.
  • Patient API 함수 앱은 Key Vault에서 Audit API 호스트 키를 검색하고 Audit API 함수 앱을 호출할 때 이를 HTTP 헤더에 넣습니다.
  • Azure Function 런타임은 들어오는 요청의 HTTP 헤더에 있는 키의 유효성을 검사합니다.

키 회전

Key Vault 키를 회전하면 시스템을 더욱 안전하게 보호할 수 있습니다. 주기적으로 키를 자동으로 회전하거나 누출 시 수동으로 또는 필요에 따라 키를 회전할 수 있습니다.

키 회전에는 다음과 같은 몇 가지 설정 업데이트가 포함됩니다.

  • 함수 앱 호스트 키 자체
  • 호스트 키를 저장하는 Key Vault의 비밀
  • 최신 비밀 버전을 참조하기 위한 함수 앱 애플리케이션 설정의 Key Vault 참조
  • Patient API에 대한 APIM 캐싱 정책의 Key Vault 참조

현재 솔루션은 대부분의 키 회전 작업에 Terraform을 사용합니다. 자세한 내용은 Terraform을 사용한 키 회전 패턴을 참조하세요.

관리 ID

이 솔루션에서 APIM 및 함수 앱은 Azure 시스템 할당 MSI(관리되는 서비스 ID)를 사용하여 Key Vault 비밀에 액세스합니다. Key Vault에는 각 서비스의 관리 ID에 대해 다음과 같은 개별 액세스 정책이 있습니다.

  • APIM은 Patient API 함수 앱의 호스트 키를 가져올 수 있습니다.
  • Patient API 함수 앱은 데이터 저장소에 대한 Audit API 호스트 키 및 Azure Cosmos DB 연결 문자열을 가져올 수 있습니다.
  • Audit API 함수 앱은 데이터 저장소에 대한 Azure Cosmos DB 연결 문자열을 가져올 수 있습니다.

비용 최적화

비용 최적화는 불필요한 비용을 줄이고 운영 효율성을 높이는 방법을 찾는 것입니다. 자세한 내용은 비용 최적화 핵심 요소 개요를 참조하세요.

Azure Functions와 같은 서버리스 애플리케이션의 주요 이점 중 하나는 전용 서버에 대해 선불로 지불하는 대신 사용한 만큼만 지불하여 비용을 절감하는 것입니다. 가상 네트워크를 지원하려면 요금이 추가되는 Azure Functions Premium 요금제가 필요합니다. Azure Functions Premium은 지역 가상 네트워크 통합을 지원하는 동시에 동적 크기 조정도 지원합니다. Azure Functions Premium SKU에는 APIM의 가상 네트워크 통합이 포함됩니다.

자세한 내용 및 가격 계산기는 Azure Functions 가격 책정을 참조하세요.

App Service 가상 머신에서 함수를 호스트할 수도 있습니다. ASE(App Service Environment)만이 완전한 네트워크 수준 가상 네트워크 격리를 제공합니다. ASE는 지역 가상 네트워크 통합을 지원하는 Azure Functions 요금제보다 훨씬 더 비쌀 수 있으며 ASE 크기 조정은 덜 탄력적입니다.

시나리오 배포

이 솔루션의 소스 코드는 Azure VNet 통합 서버리스 마이크로서비스에 있습니다.

PatientTest APIAudit APITypeScript 원본 코드는 /src 폴더에 있습니다. 각 API의 원본에는 모든 필수 구성 요소가 설치된 개발 컨테이너가 포함되어 있어 빠르게 진행할 수 있습니다.

두 API 모두 자동화된 통합 및 단위 테스트의 전체 제품군을 갖추고 있어 변경 시 회귀를 방지할 수 있습니다. 프로젝트는 코드 스타일을 유지하고 의도하지 않은 오류를 방지하는 데 도움이 되도록 ESLint로 린팅하도록 구성됩니다. 서비스의 각 추가 정보 파일에는 테스트 및 린팅 실행 방법에 대한 정보가 포함되어 있습니다.

Terraform 배포

코드 프로젝트의 /env 폴더에는 Terraform 배포를 위한 스크립트와 템플릿이 포함되어 있습니다. Terraform은 APIM 및 함수 앱을 배포하고 배포된 Application Insights 인스턴스를 사용하도록 구성합니다. 또한 Terraform은 네트워킹 잠금 및 액세스 키 보안 패턴을 포함한 모든 리소스와 구성을 프로비저닝합니다.

배포 추가 정보에서는 사용자 고유의 Azure 구독에 Terraform 환경을 배포하는 방법을 설명합니다. /env 폴더에는 Terraform 배포를 위해 모든 필수 구성 요소가 설치된 개발 컨테이너도 포함되어 있습니다.

Locust 부하 테스트

API 성능을 측정하기 위해 포함된 Locust 부하 테스트를 사용하여 API에 대한 부하 테스트를 실행할 수 있습니다. Locust는 오픈 소스 부하 테스트 도구이며 테스트는 Python으로 작성됩니다. 부하 테스트를 로컬로 실행하거나 AKS(Azure Kubernetes Service) 클러스터에서 원격으로 실행할 수 있습니다. 테스트는 APIM 엔드포인트에 대해 다양한 작업을 수행하고 성공 및 실패 기준에 따라 동작을 확인합니다.

참가자

Microsoft에서 이 문서를 유지 관리합니다. 원래 다음 기여자가 작성했습니다.

보안 주체 작성자:

  • Hannes Nel | Principal Software Engineering Lead

비공개 LinkedIn 프로필을 보려면 LinkedIn에 로그인합니다.

다음 단계

다음 아키텍처는 주요 API Management 시나리오를 다룹니다.

다음 문서에서는 주요 함수 시나리오를 다룹니다.