[Microsoft Data School] 24일차 - 실시간 데이터 파이프라인, Azure Functions

RudinP·5일 전

Microsoft Data School 3기

목록 보기
26/29
post-thumbnail

실시간 데이터 파이프라인

스트리밍 데이터 처리, 실시간 데이터에 대한 즉각적 통찰력

실시간 데이터 예제: 쿠팡 방문 후 다른홈페이지 갈 시 광고, 신용카드 해외 사용 감지
기존 배치 처리 방식(데이터 수집 대기 일괄 처리 결과 확인)은 시간지연(latency) 문제 有
(비용절감은 좋음)
실시간 데이터 수집은 항상 리소스가 켜져있어야 하기 때문

실시간 시스템의 필수 조건

1. 실시간성(Real-Time)

데이터가 생성되는 즉시 분석하고 대응
예) 주식 거래 시스템

2. 내결함성(Fault Tolerance)

장애가 발생해도 데이터 손실 없이 24/7/365 운영
예) 병원 환자 모니터링

3. 확장성(Scalability)

트래픽 폭주 시에도 성능 저하 없이 유연하게 확장
예)블랙프라이데이 쇼핑 트래픽 처리

4. 분석 정확도(Accuracy)

빠른 속도 속에서 데이터 누락이나 오류 없는 정확한 판단 필요
예) 금융 사기 거래 탐지

5. 다양성(Variety)

텍스트, 영상, 센서 데이터 등 정형/비정형 데이터를 모두 처리해야 함
예) 스마트 팩토리 복합 센서 분석

구분배치 처리 (Batch Processing)실시간 처리 (Real-time Processing)
방식일정 기간 모아서 처리데이터 생성 즉시 처리
용도과거 데이터 분석, 정기 보고서이상 탐지, 사기 방지, IoT 제어
장점대량 처리 효율성, 비용 절감즉각적 대응, 최신 인사이트
단점결과 확인 지연 (High Latency)복잡한 인프라 구축 필요

전국 태양광 에너지 모니터링 파이프라인

  • 발전량 예측 및 최적화
  • 설비 고장 즉시 진단
  • 전력망 안정화

Pipeline Overview

  1. 데이터 수집
  2. 전송 및 전처리
  3. 데이터 저장 및 버퍼링
  4. 데이터 분석
  5. 데이터 저장
  6. 시각화
    -시스템 구성 환경에 따라 변환 및 저장 단계 한 번 이상 발생 가능

대용량 데이터를 한 번에 받으면 터진다
이런 절차가 필요한 이유

1,2. 데이터 수집 및 전처리

Source

도시 정보, 발전량, 설비 용량, 일사량, 온도, 풍속 등 External API

Ingest & Prep(Azure Functions)

  1. 주기적 API 호출 Trigger
  2. 데이터 정규화 Normalization
  3. JSON 변환 Formatting
  4. Event Hubs로 전송 Push

3. 대용량 데이터의 안정적 수집

Azure Event Hubs

Azure Function에서 처리된 데이터는 Event Hub에 저장됨(저장 및 버퍼 역할)

  • 대량 수집
  • 순서 보장(시계열 데이터 순서 유지)
  • 분산 (시스템 과부하 방지 및 데이터 보존)

4. 실시간 분석 및 인사이트 도출

Azure Stream Analytics

INTO CosmosDB
FROM EventHub
GROUP BY TumblingWindow(second, 10)
  • 실시간 계산: 들어오는 데이터 스트림을 즉시 쿼리하여 분석
  • 이용률 산출: (현재 발전량 / 설비 용량) X 100
  • 이상 감지: 발전량 급감, 온도 급등 등

5,6. 저장 및 시각화

Backend 저장 (Azure Cosmos DB)

  • NOSQL 기반
  • 다양한 형태의 센서 데이터 적재
  • 대시보드에서 밀리초 단위로 조회 가능

Frontend 시각화 (PowerBI)

  • 실시간 운영 대시보드
  • 지도 위에 발전소 상태 표시, 지역별 발전량 그래프, 이상 발생 시 붉은색 알림

요약

AI/ML 통합, 완전 자동화(Ops) 중요
Functions → Event Hubs → Stream Analytics → PowerBI


Azure Functions

  • Serverless Architecture: 서버 배포 및 유지 불필요
  • Event-Driven: 특정 이벤트에 반응하여 코드 실행
  • Polyglot Development: 여러 언어로 개발 가능
  • Cost Efficiency: 사용량 기반 과금(pay-as-you-go)

트리거와 바인딩

Trigger

함수 실행을 시작하는 원인
예) HTTP 요청 수신, 정해진 시간(Timer), Blob 파일 업로드

Bindings

데이터 소스에 대한 선언적 연결
연결 코드를 직접 작성하지 않고도 데이터를 입력, 출력 할 수 있음

트리거와 바인딩을 활용한 무한한 통합 시나리오

개발 수명 주기

유연할 개발 환경

Visual Studio, VS Code, IntelliJ, Azure 개발자 CLI

다양한 언어

Native: C#, (.NET), Java, JavaScript, Python, PowerShell
Custom Handler: Rust, Go 등 HTTP 기본 형식 지원 모든 언어

DevOps 통합

Github Actions 및 Azure Pipelines를 통한 CI/CD 지원

모니터링

Azrue Monitor 및 Application Insights와 내장 통합되어 포괄적 분석 및 디버깅 제공

Azure 통합 서비스 생태계 비교


개발 및 운영 마스터 가이드

로컬 개발~클라우드 배포
안정성 확보 및 성능 최적화

함수 앱의 핵심 아키텍처와 실행 단위

Function App

Azure에서 실행 컨텍스트이자 배포 및 관리의 단위. 리소스 공유 및 스케일링의 기준

Triggers & Bindings

트리거: 함수를 깨우는 유일한 이벤트
바인딩: SDK 없이 데이터 소스를 연결하는 선언적 방식

Code Project

언어별 프로젝트 단위

  • host.json으로 전역 설정
  • local.settings.json으로 환경 변수 제어

로컬 개발 환경 도구

Azure Function Core Tools(CLI)

IDE & Storage Emulation


Azurite를 이용해서 개발환경을 설정할 때

  • 환경 설정: local.settings.json"AzrueWebJobsStorage": "UseDevelopmentStorage=true"

로컬 설정 및 시크릿 관리 전략

Azurite 에뮬레이터

  • Values 컬렉션: 환경 변수 및 앱 설정을 정의하는 공간
  • IsEncrypted: "func settings encrypt" 명령으로 파일 암호화 가능
  • 배포 제외: 이 파일은 Azure로 배포되지 않습니다(Azure Portal "앱 설정" 등록)
  • 보안 경고: 민감 정보가 포함되므로 이 파일은 .gitignore에 포함해야 함

서비스 연결 전략: 바인딩 vs 클라이언트 SDK

ID 기반 연결

비밀번호 X

Legacy

Key값 사용: Secrets 관리 위험, 주기적 교체 필요

Modern Standard

  • 관리 ID 사용으로 자격 증명 코드에서 제거 Microsoft Entra ID Auth
  • RBAC(역할 기반 액세스 제어) 최소 권한 원칙 적용

비 HTTP 트리거의 수동 실행 및 테스트

Timer 나 Queue 트리거를 기다리지 않고 즉시 실행할 수 있게 해준다.

  • Admin Endpoint: /admin/functions/함수명 활용
  • Master Key: 로컬 실행 시 불필요, 클라우드 실행 시 헤더 필수

신뢰할 수 있는 이벤트 처리 및 크기 조정 전략

분산 시스템을 위한 복원력(Resilience)
확장성(Scalability)
동시성(Concurrency) 제어 가이드

분산 이벤트 스트림의 본질적 과제

고속 이벤트 처리 시스템에서 발생하는 필연적 문제들

  • 게시자(Publisher)가 손상된 데이터 전송
  • 함수 코드 내에서 처리되지 않은 예외 발생
  • 다운스트림 시스템의 오프라인 상태로 인한 처리 차단

Queue vs Steam

신뢰성 원칙 1: 스트림 보존과 검사점(CheckPointing)


예외는 함수 내부에서 처리
try/catch 블록을 필수로 작성. 예외가 발생하더라도 포인터가 진행될 수 있도록 처리해야 교착 상태 방지

신뢰성 원칙 2: 재시도 및 회로 차단기(Retries & Circuit Breakers)

Azure Function 호스팅 플랜별 크기 조정 동작 및 제한

  • Flex Consumption에서 Scaling 정도를 알고싶다면 CLI에서 az functionapp scale config set 명령어 실행
  • Flex Consumption + Premium에서는 cold start를 방지할 수 있다.
    cold start: 시스템이 준비되지 않은 상태에서 처음 시작되거나 장시간 사용 후 재시작될 때 발생하는 초기 성능 저하나 지연 현상

스케일 컨트롤러

Azure Functions 및 Container Apps에서 이벤트 속도와 메트릭을 모니터링하여 인스턴스 수를 자동(Scale out/in)으로 조정하는 관리형 구성 요소

확장성 표준


지원되는 소스: Apache Kafka, Azure Cosmos DB, Event Hubs, Azure Queue Storage, Azure Service Bus

정적 동시성(Static Concurrency)


단일 인스턴스가 동시에 처리하는 이벤트의 수를 제한함

동적 동시성(Dynamic Concurrency)

{
	"concurrency": {
    	"dynamicConcurrencyEnabled": true,
        "snapshotPersistenceEnabled": true
    }
}
  • 지원 트리거: Blob, Queue, Service Bus
  • 동작: 1에서 시작하여 시스템이 감당 가능한 최적 수준까지 자동 조정

확장성 vs 동시성: 균형 찾기

  • cpu 집약적 작업 → 동시성 ↓ + 수평 확장에 의존
  • I/O 대기 작업 → 동시성 ↑, 인스턴스 리소스 활용 극대화

설계 철학: 멱등성(Idempotency)

  • Check before insert
  • Use Upsert(Update or Insert)
  • De-duplication keys

Azure 호스팅 플랜

낭비 없는 클라우드 리소스 활용 가이드

호스팅 플랜 상세 비교

스케일링과 성능 최적화

콜드 스타트

유휴 상태(0 인스턴스)에서 첫 요청 처리 시 발생하는 지연 → 프리미엄 및 Flex 소비플랜의 항상 준비된 인스턴스 기능 통해 해결

확장성

Flex Consumption: 앱별/함수별 파티셔닝을 통해 최대 1000개 인스턴스로 빠른 확장
Concurrency: HTTP 트리거는 인스턴스당 요청을 동시에 처리, 비동기 패턴 권장

시간 제한(TimeOut)

소비 플랜은 기본 5분(최대 10분) 제한
Flex/프리미엄은 무제한 실행 설정 가능 (단, HTTP 응답은 230초 제한)

Flex 소비 플랜

서버리스의 유연함과 VNet 보안의 결합

  • Fast Scaling: 0에서 1000 인스턴스까지 빠른 수평 확장
  • Network Security: HTTP 응답성 향상을 위한 인스턴스당 동시성 제어
  • Billing: 실행 시간 + 메모리 사용량 기반 종량제
  • Recommended For: 가변적인 워크로드, 보안이 중요한 엔터프라이즈 앱

특수 목적을 위한 호스팅: 컨테이너 앱 및 전용 플랜

Azure Container Apps

  • Use Case: 마이크로 서비스 아키텍처, 맞춤형 라이브러리, GPU 필요시
  • Tech: KEDA 스케일링, Kubernetes 관리 오버헤드 X
  • Environment: 완전 관리형 컨테이너 환경

전용(App Services)

  • Use case: 예측 가능한 청구, 유휴 VM 활용, 장기 실행 프로세스
  • Benefit: 콜드 스타트가 문제되지 않음(Always on)
  • Isolation: ASE 사용 시 완벽한 격리 가능

네트워킹

프라이빗 액세스, 고정 IP, 백엔드 통합을 통한 보안 요새 구축

서버리스 네트워킹의 핵심: 격리와 연결의 균형

네트워킹 기능으로 살펴보는 호스팅 플랜 비교

인바운드 보안 1: 액세스 제한 및 서비스 엔드포인트

액세스 제한(Access Restriction)

  • 우선 순위 기반의 허용/거부 목록 작성
  • IPv4, IPv6 또는 특정 VNet 서브넷 필터링

암시적 거부(Implicit Deny)

규칙이 하나라도 추가되면 목록에 없는 모든 트래픽은 자동 차단

서비스 엔드포인트

Microsoft.Web 서비스 엔드포인트를 통해 특정 서브넷 트래픽만 허용

주의: SCM(배포) 사이트 접근 고려. 메인 사이트를 차단하면 배포 에이전트(Github Action)의 접근도 차단될 수 있음.

인바운드 보안 2: 프라이빗 엔드포인트로 공용 액세스 차단

VNet 내부의 개인 IP를 통해 함수 앱에 접속. 공용 인터넷 액세스는 완전히 차단

DNS 구성

Pirvatelink.azurewebsites.net 프라이빗 DNS 구성과의 통합 필요

아웃바운드 연결 1: 가상 네트워크 통합의 구조

지역 가상 네트워크 통합(Regional VNet Integration)

  • 동일 리전 내의 VNet과 통합
  • 라우팅 방향: Function App → VNet
  • 인바운드 보안 기능이 아니며, 아웃바운드 트래픽을 VNet으로 보냄

NSB(보안 그룹) 및 UDR(경로 테이블)을 통합 서브넷에 적용하여 트래픽 제어 가능

아키텍트의 필수 고려사항: 서브넷 사이징 및 위임 전략

아웃바운드 연결 2: 프라이빗 엔드포인트로 공용 액세스 차단

IP 주소 관리: 동적 IP의 이해와 대응

네트워크 문제 해결을 위한 도구 및 체크리스트


Azure Functions 실습

Azure Functions 개발 환경 구축하기

  1. Azure Functions 로컬 개발 환경 구축
  2. VS Code를 이용한 로컬 Azure Functions 프로젝트 생성
  3. 로컬 환경에서 Functions 테스트
  4. Azure 클라우드에 Functions 앱 생성
  5. 로컬 코드를 Azure에 배포
  6. 클라우드에 배포된 함수 테스트
  7. 불필요한 리소스 제거하기

python, dotnet 설치

https://www.python.org/downloads/windows/

  • Python은 3.11.9
  • dotnet은 8

Azure Functions Core Tools 설치

인터넷 없이도 Azure Functions를 만들고 실행하고 디버깅하는 작업을 로컬 환경에서 처리 가능
https://github.com/Azure/azure-functions-core-tools?tab=readme-ov-file

VSCode 확장 설치

Azure Functions

Python

Azurite


Azure Storage 서비스의 로컬 구현체로, Azure Functions의 테스트 및 실제 Azure Storage 없이도
로컬 환경에서 데이터 저장과 처리를 가능하게 해주는 도구

Node.js 설치

https://nodejs.org/ko/download

node -v로 설치 확인

pnpm 설치

npm install -g pnpm 명령 프롬프트에 입력


Azure Functions 개발 시작하기

Python과 VS Code를 이용한 서버리스 앱 개발

F1 입력 후

언어 python
Python 인터프리터 python 3.11.9
템플릿 HTTP Trigger
함수 이름 http_trigger
권한 부여 수준 ANONYMOUS

host.json: 전역 설정
Local.settings.json: 환경변수 설정

AzureWebJobStorage 설정 변경

Local.settings.json 파일에서 AzureWebJobStorage 설정을 변경하여 로컬 스토리지 에뮬레이터를 사용하도록 설정

"AzureWebJobsStorage": "UseDevelopmentStorage=true"

Azurite 스토리지 에뮬레이터 시작

F1 입력 후 Azurite: Start 선택

로컬에서 Azure Functions 실행하기

F5 입력 혹은 실행 및 디버그 아이콘 클릭
http_trigger 함수 url 확인

import azure.functions as func
import logging

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="http_trigger")
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    name = req.params.get('name')
    if not name:
        try:
            req_body = req.get_json()
        except ValueError:
            pass
        else:
            name = req_body.get('name')

    if name:
        logging.info('로깅로깅로깅')
        return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.")
    else:
        return func.HttpResponse(
             "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.",
             status_code=200
        )

Azure Functions 테스트: VS Code의 Azure 확장 기능

  1. 작업 표시줄에서 Azure 아이콘 선택

  2. Local Project > Functions 확장

  3. 함수를 클릭하고 Execute Function Now 버튼 클릭

  4. 요청 본문에 {"name": "Azure"} 입력 후 실행

Azure 클라우드 환경

리소스 그룹 생성 후, 리소스 그룹 내에서 함수 앱 만들기

Azure에 함수 앱 배포하기

  1. VSCode 에서 F1 눌러 명령 팔레트 열기
  2. Azure Functions: Deploy to Function App 명령을 검색하여 실행
  3. Azure에 Azure Functions 앱 생성하기에서 만든 함수 앱 선택
  4. Deploy

Azure에서 함수 실행 및 테스트

  1. F1눌러 명령 팔레트 열기
  2. Azure Functions: Execute Function Noew 명령 검색 후 실행
  3. Azure에 Azure Functions 앱 생성하기에서 만든 함수 앱 선택
  4. 함수 (http_trigger) 선택

portal에서 실행

보통 프로젝트 별로 다른 리소스그룹을 생성해서 관리 (비용관리, 액세스 제어 등의 목적)


Thumbnail 생성 실습

Blob Trigger를 이용한 자동 Thumbnail 생성하기

각기 다른 리소스그룹(원본 + 섬네일) 구성

리소스 그룹 생성

스토리지 계정 생성

컨테이너 생성

스토리지 페이지에서 생성한다

데이터 업로드 컨테이너

썸네일 컨테이너

동일하게 생성

github 토큰 데이터 가져오기

git clone으로 실습 프로젝트를 클론했다. 관련해서는 노출이 불가하여 생략

환경변수설정

local.settings.json 파일 추가
이후 환경 변수 정보를 입력

{
	"IsEncrypted": false,
	"Values": {
		"AzureWebJobsStorage": "UseDevelopmentStorage=true",
		"FUNCTIONS_WORKER_RUNTIME": "python",
		"STORAGE_CONNECTION_STRING": "",
		"TARGET_CONTAINER_NAME": "thumbnails"
	},
	"Host": {
	"CORS": "*"
	}
}
  • TARGET_CONTAINER_NAME: 생성했던 컨테이너 이름 넣으면 된다

스토리지 계정 연결 문자열 가져오기

Azure Portal에서 실행

1. 액세스키 메뉴 클릭
2. 연결 문자열 필드에서 표시 버튼 클릭
3. 클립 보드에 복사 버튼 클릭

이후 F1 start azurite

가상환경 생성

python -m venv .venv
.venv\Scripts\activate
pip install -r requiements.txt

실행은 F5

samples-workers 이미지 업로드

이미지 업로드를 하면 자동으로 thumbnails 컨테이너에도 이미지가 생성된다

profile
iOS 개발자가 되기 위한 스터디룸/스터디의 레퍼런스는 모두 kxcoding

0개의 댓글