Azure를 사용하여 인프라 재구성 자동화

Azure Container Instances
Azure Application Gateway
Azure 기능
Azure Monitor

컨테이너화는 앱 현대화에 대한 일반적인 접근 방식입니다. 고급 워크로드에 Azure Kubernetes Service를 사용하거나 간단한 웹 애플리케이션과 같은 간단한 컨테이너 워크로드에 Azure Container Instances를 사용할 수 있습니다. 이 문서에서는 Application Gateway를 방화벽으로 사용할 때 Container Instances에 대한 인프라 수준 서버리스 자동화를 구현하는 방법을 중점적으로 설명합니다.

일반적인 시나리오부터 시작하겠습니다. Azure 컨테이너 인스턴스를 보호하려면 Azure Container Instances에서 컨테이너 그룹을 사용할 수 있습니다. 컨테이너 그룹을 사용하면 컨테이너가 Azure 프라이빗 엔드포인트를 통해 다른 프라이빗 리소스 또는 다른 Azure 서비스에 액세스할 수 있도록 가상 네트워크에 Azure 컨테이너 인스턴스를 배포할 수 있습니다. 웹 애플리케이션을 호스팅하는 고객의 경우 Azure Container Instances를 백 엔드 풀로 사용하는 동안 Azure Application Gateway와 같은 웹 애플리케이션 방화벽을 사용하여 들어오는 트래픽을 프런팅하는 것이 일반적입니다. 컨테이너 그룹에 대한 고정 IP 주소 노출은 시작할 때 참고하면 좋은 문서입니다.

이 방법의 한 가지 잠재적인 과제는 비정적 개인 IP 주소를 백 엔드 풀로 사용하는 것입니다. 유지 관리 중에 개인 IP가 순환될 수 있으므로 클라우드 관리자가 백 엔드 풀을 수동으로 다시 구성해야 합니다. 크기 조정을 위해 새 컨테이너가 추가된 경우 관리자는 트래픽이 오른쪽 백 엔드 풀로 라우팅되도록 재구성을 수행해야 합니다. 또한 활동성 프로브 및 준비 상태 프로브는 컨테이너 그룹에서 지원되지 않으므로 워크로드 가동 중지 시간을 식별하기가 더 어려워집니다.

이 문서에서는 Azure Functions를 모니터링하고 사용하여 개인 IP의 자동 순환을 수행하기 위해 Application Insights 및 Azure Monitor를 도입하여 이러한 일반적인 문제를 해결하기 위한 향상된 기능을 살펴봅니다. 이 방법은 워크로드의 중복성을 향상시킵니다.

잠재적인 사용 사례

이 아키텍처는 다음과 같은 경우에 가장 적합합니다.

  • 서버리스 배포.
  • 자동화를 사용하는 클라우드 네이티브 워크로드에 대한 최소한의 작업.
  • 고급 컨테이너 오케스트레이션이 필요하지 않은 간단한 컨테이너 워크로드.
  • 자동화된 재구성을 사용하며 중복성이 높은 외부 연결 워크로드.
  • Azure 프라이빗 엔드포인트에서 노출하는 워크로드처럼 프라이빗 리소스에 액세스해야 하는 컨테이너 워크로드.

아키텍처

Azure Container Instances의 프라이빗 엔드포인트에서 액세스하는 Azure Cosmos DB를 보여 주는 흐름 다이어그램. 앞에 Azure Application Gateway가 있음

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

데이터 흐름

1부: 일반적인 웹 애플리케이션 트래픽 흐름

1a. Application Gateway에는 백 엔드 워크로드에 도달하기 전에 공용 트래픽을 프론팅하는 데 적합한 웹 애플리케이션 방화벽 기능이 있습니다. Application Gateway는 공용 IP 주소를 노출하므로 Azure DDoS Protection은 다른 보호 계층을 제공합니다.

1b. Application Gateway의 백 엔드 풀은 컨테이너 그룹에 있는 Azure 컨테이너 인스턴스의 개인 IP 주소로 구성됩니다. 컨테이너 그룹의 Azure 컨테이너 인스턴스에는 FQDN(정규화된 도메인 이름)이 제공되지 않으므로 IP 주소를 사용해야 합니다.

1c. Azure Container Instances의 컨테이너는 프라이빗 링크를 통해 Azure Cosmos DB와 같은 프라이빗 리소스를 사용할 수 있습니다.

2부: 자동화를 통한 향상된 기능

2a. Application Gateway에는 Container Instances의 컨테이너 그룹이 활동성 또는 준비 상태 프로브를 지원하지 않는 경우 Azure 컨테이너 인스턴스에 대한 활동성 프로브로 사용할 수 있는 정상 호스트 수 메트릭이 포함되어 있습니다.

2b. Application Insights는 컨테이너에서 사용자 지정 스레드를 통해 모니터링하기 위해 Application Insights로 보낼 수 있는 심박수를 포함한 다른 메트릭을 수집하기 위해 사용됩니다.

2c. 2a 및 2b 단계에 정의된 임계값 수준에 따라 경고를 구성할 수 있습니다. 예를 들어 시스템에 백 엔드 풀로 실행되는 세 개의 컨테이너 인스턴스가 있다고 가정하겠습니다. 정상 호스트 수가 3보다 작은 경우에 발생하는 경고를 구성할 수 있습니다. 경고 규칙의 작업 그룹에서 Azure 함수를 작업 유형으로 사용하여 사용자 지정 작업을 트리거할 수 있습니다.

2d. Azure 함수에서 Azure SDK는 기존 컨테이너 인스턴스의 구성을 가져와 동일한 인스턴스를 다시 만드는 데 사용됩니다. 이 함수는 2c단계에 정의된 경고에 의해 트리거됩니다. 이 함수는 설치의 복잡성에 따라 실행하는 데 시간이 오래 걸릴 수 있습니다. Azure 함수는 시간이 초과될 수 있으므로 Azure Durable Functions를 사용하여 장기 실행 프로세스를 처리하고 상태 업데이트를 가져올 수 있습니다.

구성 요소

Automation

  • Azure Durable Functions: Azure Functions와 달리 Durable Functions는 상태 저장이며 여러 상태 저장 워크플로 패턴을 지원합니다. 이 예제에서는 모니터 패턴이 사용됩니다.
  • Azure SDK: Azure SDK는 선호하는 프로그래밍 언어로 Azure 서비스와 상호 작용하는 데 사용할 수 있는 라이브러리의 컬렉션입니다. SDK를 사용하면 자동화를 수행하는 논리를 보다 유연하게 통합할 수 있습니다.

모니터링

  • Azure Monitor 메트릭: Azure Monitor의 이 기능은 Azure 서비스에서 미리 정의된 숫자 데이터를 수집합니다.
  • 작업 그룹: 작업 그룹은 리소스 소유자가 정의한 알림 기본 설정의 컬렉션입니다. 트리거된 경고에 따라 알림 채널 및 작업을 정의할 수 있습니다.

네트워킹

  • Azure DDoS Protection: Azure DDoS(Basic) Protection은 무료이며 모든 공용 IP에서 사용할 수 있습니다. Azure DDoS Network Protection은 다른 위치에 로그를 수집하는 기능 및 DDoS Protection Rapid Response 팀에 문의하는 기능과 같은 추가 기능을 제공합니다.
  • Azure Application Gateway: Azure Web Application Firewall은 SQL 주입 및 XSS 공격과 같은 익스플로잇으로부터 공용 애플리케이션을 보호합니다.
  • Azure Private Link: Azure Private Link는 Microsoft 백본의 프라이빗 엔드포인트를 통해 Azure PaaS 서비스에 대한 액세스를 제공하여 네트워크 액세스 보안을 더욱 강화합니다.

애플리케이션

  • Azure Container Instances: Azure Container Instances는 또 다른 인프라를 설정하지 않아도 컨테이너 이미지를 원활하게 실행합니다. 고급 컨테이너 오케스트레이션의 경우 AKS(Azure Kubernetes Service)를 고려해야 합니다.
  • Azure Cosmos DB: Azure Cosmos DB는 SQL, Cassandra 및 MongoDB와 같은 여러 플랫폼을 지원하는 완전 관리형 NoSQL 데이터베이스입니다.
  • Azure Key Vault: 개발자가 애플리케이션 소스 코드에 연결 문자열을 암호화되지 않은 텍스트로 저장하지 않는 것이 보안 모범 사례입니다. Azure Key Vault는 향상된 보안으로 비밀을 저장하는 중앙 위치 역할을 합니다. 애플리케이션은 향상된 보안으로 필요한 키를 검색할 수 있습니다.

대안

이전 시나리오는 Application Gateway에 대한 백 엔드 풀을 업데이트합니다. 또는 Azure 프라이빗 DNS 영역을 Application Gateway의 대상 백 엔드로 사용하고, Azure 함수를 사용하여 Application Gateway를 변경하는 대신 레코드를 업데이트할 수 있습니다. 이 대안은 배포 시간을 줄입니다. 반면, Application Gateway 메트릭은 DNS에 의해 추상화되므로 호스트 수를 식별할 수 없습니다. 따라서 이 자동화는 Application Insights 또는 Azure Monitor와 같은 애플리케이션 모니터링 솔루션을 통해 직접 트리거되어야 합니다.

Azure는 Azure Kubernetes ServiceAzure App Service와 같은 컨테이너 기반 워크로드를 호스트하는 여러 옵션을 제공합니다.

Azure Kubernetes Service는 Container Instances에서 사용할 수 없는 서비스 리소스와 같은 고급 컨테이너 오케스트레이션 및 네트워크 기능을 제공합니다. 이 참조 아키텍처는 이 요구 사항을 해결합니다.

App Service는 컨테이너 워크로드를 호스트할 수도 있으며, App Service Environment를 사용하면 개발자가 Azure Virtual Network에서 App Service를 배포할 수 있습니다. Container Instances의 가격 책정 구조는 App Service와 달리 소규모 워크로드에 적합합니다.

고려 사항

가용성

활동성 및 준비 상태 프로브는 컨테이너 그룹에서 지원되지 않으므로 모니터링에 Azure Monitor 메트릭 및 Azure Application Insights를 사용하는 것이 좋습니다. 컨테이너 상태 및 작동 시간은 시스템이 엔드투엔드로 운영 중인지 확인하는 데 결정적인 접근 방식이 아닙니다.

작업

Azure Durable Functions는 Container Instances에 오류가 발생하거나 컨테이너 그룹의 개인 IP가 변경되는 경우 인프라를 다시 구성하는 데 사용됩니다. 설명서에서 설명한 대로 프로비전 프로세스는 약간 더 오래 걸립니다. 컨테이너가 제시간에 준비되지 않은 경우 사용자는 최소한의 가동 중지 시간을 경험할 수 있습니다.

이 아키텍처는 복원력을 한층 높여줍니다. 그래도 애플리케이션에서 모니터링을 구성하고 Azure 상태를 모니터링하여 플랫폼 오류가 발생하지 않는지 확인하는 것이 좋습니다.

확장성

컨테이너가 생성될 때 CPU 및 메모리 요구 사항이 정의되므로 수직 크기 조정을 직접 수행할 수 없습니다. 컨테이너 그룹에 컨테이너를 추가하여 수평으로 크기를 조정할 수 있습니다. 그러나 컨테이너 그룹의 각 컨테이너는 하나의 개인 IP를 사용하므로 프로비전된 서브넷 크기가 제한됩니다.

크기 조정에 대한 또 다른 중요한 고려 사항은 애플리케이션의 상태입니다. 애플리케이션은 주문형 크기 조정으로 인해 애플리케이션에 데이터 손실이 발생하지 않도록 로컬로 또는 Azure Cache for Redis와 같은 외부 서비스를 사용하여 상태를 처리해야 합니다.

보안

구성이 올바르게 설정되지 않은 경우 가상 네트워크(VNet 삽입)에 PaaS를 배포하는 기능으로 보안이 향상되지 않습니다. VNet 삽입은 관리자에게 추가적인 네트워크 제어를 제공하여 더 엄격한 네트워크 보안 그룹 및 공개적으로 노출되지 않는 리소스 사용과 같은 이점을 제공합니다.

Private Link는 프라이빗 엔드포인트를 가상 네트워크에 투영하여 애플리케이션이 개인 IP 주소를 통해 Azure PaaS에 직접 액세스할 수 있도록 합니다. 이와 동시에 관리자는 관련 Azure PaaS에 액세스할 수 있는 사용자를 추가로 제어할 수 있습니다.

Azure Container Registry에 컨테이너 이미지를 저장하는 경우 컨테이너 레지스트리용 Microsoft Defender를 사용하도록 설정하여 컨테이너 이미지 취약성 검사를 수행할 수 있습니다.

시나리오 배포

Azure Functions를 사용하여 자동화를 수행하는 샘플 소스 코드는 GitHub에서 볼 수 있습니다.

서비스 주체(클라이언트 ID 및 비밀)가 필요합니다. 이는 Azure Functions에서 Azure Resource Manager 작업을 수행하는 데 사용됩니다. 이 서비스 주체가 Application Gateway를 업데이트하고 Azure 컨테이너 인스턴스를 만들려면 최소한 리소스 그룹에 소유자 권한이 있어야 합니다. 이 샘플은 컨테이너화되고 Container Registry에 저장되는 간단한 Python 애플리케이션을 만듭니다. 자체 애플리케이션으로 레지스트리를 업데이트합니다.

가격 책정

Azure 가격 계산기를 사용하여 Azure 리소스에 대한 비용을 예측합니다.

이전 구현의 이 예제를 참조하세요.

참가자

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

보안 주체 작성자:

다음 단계

아키텍처를 찾아보세요.

관련 참고 자료: