중요합니다
데이터 흐름 그래프가 있는 WEBAssembly(WASM)는 미리 보기로 제공됩니다. 이 기능에는 제한 사항이 있으며 프로덕션 워크로드용이 아닙니다.
베타, 미리 보기 또는 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 법적 용어는 Microsoft Azure 미리 보기에 대한 추가 사용 약관 을 참조하세요.
Azure IoT Operations 데이터 흐름 그래프는 에지에서 사용자 지정 데이터 처리를 위한 WASM(WebAssembly) 모듈을 지원합니다. 사용자 지정 비즈니스 논리 및 데이터 변환을 데이터 흐름 파이프라인의 일부로 배포할 수 있습니다.
팁 (조언)
대역 내 AI를 실행하시겠습니까? WASM 연산자 내에서 작은 ONNX 모델을 패키지하고 실행하려면 WebAssembly 데이터 흐름 그래프 에서 ONNX 유추 실행을 참조하세요.
중요합니다
현재 데이터 흐름 그래프는 MQTT, Kafka 및 OpenTelemetry 엔드포인트만 지원합니다. Data Lake, Microsoft Fabric OneLake, Azure Data Explorer, Local Storage와 같은 다른 엔드포인트 형식은 지원되지 않습니다. 자세한 내용은 알려진 문제참조하세요.
필수 조건
- Arc 지원 Kubernetes 클러스터에 Azure IoT Operations 인스턴스를 배포합니다. 자세한 내용은 Azure IoT 작업 배포를 참조하세요.
- ACR(Azure Container Registry)을 사용하여 WASM 모듈 및 그래프를 저장합니다.
- OCI Registry As Storage(ORAS) CLI를 설치하여 WASM 모듈을 레지스트리에 푸시합니다.
- 데이터 흐름 그래프에 대한 WebAssembly 모듈 개발의 지침에 따라 사용자 지정 WASM 모듈을 개발합니다.
개요
Azure IoT 작업 데이터 흐름 그래프의 WASM(WebAssembly) 모듈을 사용하면 고성능 및 보안을 통해 에지에서 데이터를 처리할 수 있습니다. WASM은 샌드박스 환경에서 실행되며 Rust 및 Python을 지원합니다.
WASM 데이터 흐름 그래프 작동 방식
WASM 데이터 흐름 구현은 다음 워크플로를 따릅니다.
- WASM 모듈 개발: 지원되는 언어로 사용자 지정 처리 논리를 작성하고 WebAssembly 구성 요소 모델 형식으로 컴파일합니다.
- 그래프 정의 개발: YAML 구성 파일을 사용하여 모듈을 통해 데이터가 이동하는 방식을 정의합니다. 자세한 내용은 WebAssembly 그래프 정의 구성을 참조하세요.
- 레지스트리에 아티팩트 저장: ORAS와 같은 OCI 호환 도구를 사용하여 컴파일된 WASM 모듈을 컨테이너 레지스트리에 푸시합니다.
- 레지스트리 엔드포인트 구성: Azure IoT 작업이 컨테이너 레지스트리에 액세스할 수 있도록 인증 및 연결 세부 정보를 설정합니다.
- 데이터 흐름 그래프 만들기: 데이터 원본, 아티팩트 이름 및 대상을 정의합니다.
- 배포 및 실행: Azure IoT 작업은 레지스트리에서 WASM 모듈을 끌어와 그래프 정의에 따라 실행합니다.
다음 예제에서는 일반적인 시나리오에 대해 WASM 데이터 흐름 그래프를 설정하고 배포하는 방법을 보여 줍니다. 이 예제에서는 하드 코드된 값과 간소화된 구성을 사용하여 빠르게 시작할 수 있습니다.
컨테이너 레지스트리 설정
Azure IoT 작업에는 WASM 모듈 및 그래프 정의를 끌어오기 위한 컨테이너 레지스트리가 필요합니다. ACR(Azure Container Registry) 또는 다른 OCI 호환 레지스트리를 사용할 수 있습니다.
Azure Container Registry를 만들고 구성하려면 Azure Container Registry 배포를 참조하세요.
ORAS CLI 설치
ORAS CLI를 사용하여 WASM 모듈 및 그래프 정의를 컨테이너 레지스트리에 푸시합니다. 설치 지침은 ORAS 설치를 참조하세요.
공용 레지스트리에서 샘플 모듈 끌어오기
미리 빌드된 샘플 모듈을 사용합니다.
# Pull sample modules and graphs
oras pull ghcr.io/azure-samples/explore-iot-operations/graph-simple:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/graph-complex:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/temperature:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/window:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/snapshot:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/format:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/humidity:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/collection:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/enrichment:1.0.0
oras pull ghcr.io/azure-samples/explore-iot-operations/filter:1.0.0
레지스트리에 모듈 푸시
샘플 모듈 및 그래프가 있으면 컨테이너 레지스트리에 푸시합니다. Azure Container Registry의 이름으로 <YOUR_ACR_NAME>을(를) 바꿉니다. 운영 경험 웹 UI에 그래프와 모듈이 표시되도록 하려면, 다음 예제와 같이 --config 및 --artifact-type 플래그를 추가하십시오.
# Log in to your ACR
az acr login --name <YOUR_ACR_NAME>
# Push modules to your registry
oras push <YOUR_ACR_NAME>.azurecr.io/graph-simple:1.0.0 --config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml graph-simple.yaml:application/yaml --disable-path-validation
oras push <YOUR_ACR_NAME>.azurecr.io/graph-complex:1.0.0 --config /dev/null:application/vnd.microsoft.aio.graph.v1+yaml graph-complex.yaml:application/yaml --disable-path-validation
oras push <YOUR_ACR_NAME>.azurecr.io/temperature:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm temperature-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/window:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm window-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/snapshot:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm snapshot-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/format:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm format-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/humidity:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm humidity-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/collection:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm collection-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/enrichment:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm enrichment-1.0.0.wasm:application/wasm
oras push <YOUR_ACR_NAME>.azurecr.io/filter:1.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm filter-1.0.0.wasm:application/wasm
팁 (조언)
사용자 고유의 모듈을 푸시하고 사용자 지정 그래프를 만들 수도 있습니다. 사용자 지정 데이터 흐름 그래프 구성을 참조하세요.
레지스트리 엔드포인트 만들기
레지스트리 엔드포인트는 컨테이너 레지스트리에 대한 연결을 정의합니다. 데이터 흐름 그래프는 레지스트리 엔드포인트를 사용하여 컨테이너 레지스트리에서 WASM 모듈 및 그래프 정의를 가져옵니다. 다양한 인증 방법 및 레지스트리 유형을 사용하여 레지스트리 엔드포인트를 구성하는 방법에 대한 자세한 내용은 레지스트리 엔드포인트 구성을 참조하세요.
레지스트리 엔드포인트를 만들려면 Azure Portal, Bicep 또는 Kubernetes 매니페스트를 사용할 수 있습니다. 레지스트리 엔드포인트를 만든 후, 컨테이너 레지스트리에 푸시한 그래프가 데이터 흐름 그래프의 작업 경험에서 사용할 준비가 됩니다.
Azure Container Registry를 사용하여 빠르게 설정하려면 시스템이 할당한 관리 ID 인증을 사용하여 레지스트리 엔드포인트를 만듭니다.
- Azure Portal
- Bicep
- Kubernetes (쿠버네티스)
Azure Portal을 사용하여 레지스트리 엔드포인트를 만들 수 있습니다. 포털 환경을 사용하면 ACR의 호스트 세부 정보를 지정 및 제공하고 필요에 따라 자격 증명을 제공할 수 있습니다. 시작하기 전에 다음 정보가 있는지 확인합니다.
- 레지스트리 엔드포인트 이름.
- ACR의 호스트 이름입니다.
- 네 가지 유형의 인증이 지원됩니다.
- 익명
- 시스템 관리 아이덴티티
- 사용자 관리 아이덴티티
- 아티팩트 비밀
Azure Portal에서 레지스트리 엔드포인트를 만들려면 다음 단계를 수행합니다.
익명 인증을 사용하여 레지스트리 엔드포인트 만들기
ACR(Azure Container Registry)의 호스트 세부 정보를 지정하고, 공용 이미지 검색에 익명 액세스를 사용하도록 설정하고, 다시 사용할 구성을 저장하여 새 레지스트리 엔드포인트를 만들 수 있습니다. 먼저 사용하려는 인증 유형을 선택합니다. 이 예제에서는 익명 인증을 사용합니다.
시스템 관리 ID 인증을 사용하여 레지스트리 엔드포인트 만들기
ACR의 호스트 세부 정보를 지정하고, 보안 액세스를 위해 시스템 할당 관리 ID를 사용하여 인증하고, 다시 사용하기 위한 구성을 저장하여 새 레지스트리 엔드포인트를 만들 수 있습니다.
사용자 관리 ID를 사용하여 레지스트리 엔드포인트 만들기
ACR의 호스트 세부 정보를 지정하고, 보안 액세스를 위해 사용자 할당 관리 ID를 사용하여 인증하고, 다시 사용하기 위한 구성을 저장하여 새 레지스트리 엔드포인트를 만들 수 있습니다.
비고
사용자 관리 ID를 사용하도록 설정하려면 클라이언트 및 테넌트 ID가 필요합니다.
아티팩트 비밀을 사용하여 레지스트리 엔드포인트 만들기
아티팩트 비밀은 컨테이너 이미지를 풀할 때 ACR, Docker Hub 또는 MCR과 같은 프라이빗 컨테이너 레지스트리를 사용하여 인증하는 데 사용됩니다. 레지스트리에 자격 증명이 필요하고 이미지에 공개적으로 액세스할 수 없는 경우 비밀이 필수적입니다. 이 시나리오를 사용하면 Azure IoT 작업 및 작업 환경에서 데이터 흐름 그래프를 관리할 수 있습니다. 기존 비밀을 선택하여 Azure Key Vault에서 아티팩트 비밀을 설정할 수 있습니다.
ACR의 호스트 세부 정보를 지정하고, 보안 액세스를 위해 아티팩트 비밀을 사용하여 인증하고, 다시 사용하기 위한 구성을 저장하여 새 레지스트리 엔드포인트를 만들 수 있습니다.
새 비밀을 만들고 Azure Key Vault에 저장하여 Azure Key Vault에서 아티팩트 비밀을 설정합니다.
비고
여러 데이터 흐름 그래프 및 Akri 커넥터와 같은 다른 Azure IoT 작업 구성 요소에서 레지스트리 엔드포인트를 다시 사용할 수 있습니다.
확장 이름 가져오기
# Get extension name
az k8s-extension list \
--resource-group <RESOURCE_GROUP> \
--cluster-name <CLUSTER_NAME> \
--cluster-type connectedClusters \
--query "[?extensionType=='microsoft.iotoperations'].name" \
--output tsv
첫 번째 명령은 확장명(예: azure-iot-operations-4gh3y)을 반환합니다.
관리 ID 권한 구성
Azure IoT 작업이 컨테이너 레지스트리에서 WASM 모듈을 끌어오도록 하려면 관리 ID에 올바른 권한을 부여합니다. IoT 운영 확장은 Azure Container Registry에서 AcrPull 역할이 필요한 시스템이 할당한 관리 ID를 사용합니다. 다음 필수 조건을 갖추고 있는지 확인합니다.
- Azure Container Registry에 대한 소유자 권한입니다.
- 컨테이너 레지스트리는 다른 리소스 그룹 또는 구독에 있을 수 있지만 IoT 작업 배포와 동일한 테넌트에 있어야 합니다.
다음 명령을 실행하여 IoT 작업 관리 ID에 AcrPull 역할을 할당합니다.
# Get the IoT Operations extension managed identity
export EXTENSION_OBJ_ID=$(az k8s-extension list --cluster-name $CLUSTER_NAME -g $RESOURCE_GROUP --cluster-type connectedClusters --query "[?extensionType=='microsoft.iotoperations'].identity.principalId" -o tsv)
# Get the application ID for the managed identity
export SYSTEM_ASSIGNED_MAN_ID=$(az ad sp show --id $EXTENSION_OBJ_ID --query "appId" -o tsv)
# Assign the AcrPull role to the managed identity
az role assignment create --role "AcrPull" --assignee $SYSTEM_ASSIGNED_MAN_ID --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
컨테이너 레지스트리 역할에 대한 자세한 내용은 Azure Container Registry 역할 및 권한을 참조하세요.
Azure CLI로 인증 오류가 발생하는 경우 Azure Portal에서 권한을 할당합니다.
- Azure Portal에서 Azure Container Registry로 이동합니다.
- 메뉴에서 액세스 제어(IAM)를 선택합니다.
- 추가>역할 할당 추가를 선택합니다.
- AcrPull 기본 제공 역할을 선택합니다.
- 옵션에 대한 액세스 할당으로 사용자, 그룹 또는 서비스 주체를 선택합니다.
- IoT 작업 확장 이름을 검색하고 선택합니다(예
azure-iot-operations-4gh3y). - 저장을 선택하여 역할 할당을 완료합니다.
자세한 지침은 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.
예제 1: 하나의 WASM 모듈을 사용한 기본 배포
이 예제에서는 WASM 모듈을 사용하여 온도 데이터를 화씨에서 섭씨로 변환합니다.
온도 모듈 소스 코드는 GitHub에서 사용할 수 있습니다. 컨테이너 레지스트리에 푸시한 미리 컴파일된 버전 graph-simple:1.0.0을(를) 사용합니다.
작동 방식
그래프 정의는 간단한 3단계 파이프라인을 만듭니다.
- 원본: MQTT에서 온도 데이터 수신
- 맵: 온도 WASM 모듈을 사용하여 데이터 처리
- 싱크: 변환된 데이터를 MQTT로 다시 전송
단순 그래프 정의의 작동 방식과 해당 구조에 대한 자세한 내용은 예제 1: 단순 그래프 정의를 참조하세요.
입력 형식:
{"temperature": {"value": 100.0, "unit": "F"}}
출력 형식:
{"temperature": {"value": 37.8, "unit": "C"}}
다음 구성은 이 온도 변환 파이프라인을 사용하는 데이터 흐름 그래프를 만듭니다. 그래프는 YAML 정의를 포함하고 컨테이너 레지스트리에서 온도 모듈을 끌어오는 graph-simple:1.0.0 아티팩트를 참조합니다.
데이터 흐름 그래프 구성
이 구성은 온도 변환 워크플로를 구현하는 세 개의 노드, 즉 들어오는 온도 데이터를 구독하는 원본 노드, WASM 모듈을 실행하는 그래프 처리 노드 및 변환된 결과를 게시하는 대상 노드를 정의합니다.
데이터 흐름 그래프 리소스는 그래프 정의 아티팩트를 "래핑"하고 추상 원본/싱크 작업을 구체적인 엔드포인트에 연결합니다.
- 그래프 정의의
source작업은 데이터 흐름의 원본 노드(MQTT 토픽)에 연결됩니다. - 그래프 정의의
sink작업은 데이터 흐름의 대상 노드(MQTT 항목)에 연결됩니다. - 그래프 정의의 처리 작업은 그래프 처리 노드 내에서 실행됩니다.
이렇게 분리하면 처리 논리를 변경하지 않고도 환경 간에 서로 다른 엔드포인트를 사용하여 동일한 그래프 정의를 배포할 수 있습니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
작업 환경에서 데이터 흐름 그래프를 만들려면 데이터 흐름 탭으로 이동합니다.
+ 만들기 옆에 있는 드롭다운 메뉴를 선택하고 데이터 흐름 그래프 만들기를 선택합니다.
자리 표시자 이름 new-data-flow 를 선택하여 데이터 흐름 속성을 설정합니다. 데이터 흐름 그래프의 이름을 입력하고 사용할 데이터 흐름 프로필을 선택합니다.
데이터 흐름 다이어그램에서 원본 을 선택하여 원본 노드를 구성합니다. 원본 세부 정보에서 자산 또는 데이터 흐름 엔드포인트를 선택합니다.
자산을 선택하는 경우 데이터를 끌어올 자산을 선택하고 적용을 클릭합니다.
데이터 흐름 엔드포인트를 선택하는 경우 다음 세부 정보를 입력하고 적용을 클릭합니다.
Setting Description 데이터 흐름 엔드포인트 기본 MQTT 메시지 브로커 엔드포인트를 사용하려면 기본값을 선택합니다. 주제 들어오는 메시지에 대한 구독 항목 필터입니다. 여러 항목을 추가하려면 항목>행 추가를 사용합니다. 메시지 스키마 들어오는 메시지를 역직렬화하는 데 사용할 스키마입니다.
데이터 흐름 다이어그램에서 그래프 변환 추가(선택 사항) 를 선택하여 그래프 처리 노드를 추가합니다. 그래프 선택 창에서 그래프 단순:1을 선택하고 적용을 클릭합니다.
중요합니다
이 예제에서는
graph-simple:1.0.0아티팩트가 사용됩니다. 사용자 고유의 WASM 모듈을 개발하고 컨테이너 레지스트리에 푸시하여 사용자 지정 그래프를 만들 수 있습니다. 컨테이너 레지스트리에 푸시하는 그래프는 그래프 선택 창에서 사용할 수 있습니다.다이어그램에서 그래프 노드를 선택하여 일부 그래프 연산자 설정을 구성할 수 있습니다. 예를 들어 모듈-온도/맵 연산자를 선택하고 값을
key2입력example-value-2할 수 있습니다. 적용 클릭하여 변경 내용을 저장합니다.데이터 흐름 다이어그램에서 대상 을 선택하여 대상 노드를 구성합니다.
데이터 흐름 그래프 이름 아래에 저장 을 선택하여 데이터 흐름 그래프를 저장합니다.
데이터 흐름 테스트
데이터 흐름을 테스트하려면 클러스터 내에서 MQTT 메시지를 보냅니다. 먼저 MQTT 클라이언트를 사용하여 MQTT 브로커에 대한 연결 테스트의 지침에 따라 MQTT 클라이언트 Pod를 배포합니다. MQTT 클라이언트는 브로커에 연결할 인증 토큰 및 인증서를 제공합니다. MQTT 클라이언트를 배포하려면 다음 명령을 실행합니다.
kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml
온도 메시지 보내기
첫 번째 터미널 세션에서 화씨 온도 데이터를 보내는 스크립트를 만들고 실행합니다.
# Connect to the MQTT client pod
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
# Create and run temperature.sh from within the MQTT client pod
while true; do
# Generate a random temperature value between 0 and 6000 Fahrenheit
random_value=$(shuf -i 0-6000 -n 1)
payload="{\"temperature\":{\"value\":$random_value,\"unit\":\"F\"}}"
echo "Publishing temperature: $payload"
# Publish to the input topic
mosquitto_pub -h aio-broker -p 18883 \
-m "$payload" \
-t "sensor/temperature/raw" \
-d \
--cafile /var/run/certs/ca.crt \
-D PUBLISH user-property __ts $(date +%s)000:0:df \
-D CONNECT authentication-method 'K8S-SAT' \
-D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)
sleep 1
done'
비고
MQTT 사용자 속성 __ts 은 HLC(하이브리드 논리 시계)를 사용하여 메시지를 적시에 처리하기 위해 메시지에 타임스탬프를 추가하는 데 사용됩니다. 타임스탬프를 사용하면 데이터 흐름이 메시지를 수락할지 아니면 삭제할지를 결정하는 데 도움이 됩니다. 속성의 형식은 .입니다 <timestamp>:<counter>:<nodeid>. 데이터 흐름 처리를 보다 정확하게 만들지만 필수는 아닙니다.
스크립트는 1초마다 임의 온도 데이터를 토픽에 sensor/temperature/raw 게시합니다. 다음과 같이 표시됩니다.
Publishing temperature: {"temperature":{"value":1234,"unit":"F"}}
Publishing temperature: {"temperature":{"value":5678,"unit":"F"}}
온도 데이터를 계속 게시하려면 스크립트를 실행 상태로 둡니다.
처리된 메시지 구독
두 번째 터미널 세션(MQTT 클라이언트 Pod에도 연결됨)에서 출력 항목을 구독하여 변환된 온도 값을 확인합니다.
# Connect to the MQTT client pod
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
mosquitto_sub -h aio-broker -p 18883 -t "sensor/temperature/processed" --cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)"'
WASM 모듈에 의해 화씨에서 섭씨로 변환된 온도 데이터가 표시됩니다.
{"temperature":{"value":1292.2222222222222,"count":0,"max":0.0,"min":0.0,"average":0.0,"last":0.0,"unit":"C","overtemp":false}}
{"temperature":{"value":203.33333333333334,"count":0,"max":0.0,"min":0.0,"average":0.0,"last":0.0,"unit":"C","overtemp":false}}
예제 2: 복잡한 그래프 배포
이 예제에서는 온도, 습도 및 이미지 데이터를 비롯한 여러 데이터 형식을 처리하는 정교한 데이터 처리 워크플로를 보여 줍니다. 복잡한 그래프 정의는 여러 WASM 모듈을 오케스트레이션하여 고급 분석 및 개체 감지를 수행합니다.
작동 방식
복잡한 그래프는 세 개의 데이터 스트림을 처리하고 이를 보강된 센서 분석으로 결합합니다.
- 온도 처리: 화씨에서 섭씨로 변환하고, 잘못된 판독값을 필터링하고, 통계를 계산합니다.
- 습도 처리: 시간 간격에 따른 습도 측정값을 누적합니다.
- 이미지 처리: 카메라 스냅샷에서 개체 감지를 수행하고 결과 형식을 지정합니다.
복잡한 그래프 정의의 작동 방식, 해당 구조 및 여러 처리 단계를 통한 데이터 흐름에 대한 자세한 내용은 예제 2: 복합 그래프 정의를 참조하세요.
그래프는 Rust 연산자의 특수 모듈을 사용합니다.
복잡한 데이터 흐름 그래프 구성
이 구성은 graph-complex:1.0.0 아티팩트를 사용하여 다중 센서 처리 워크플로를 구현합니다. 데이터 흐름 그래프 배포가 예제 1과 어떻게 유사한지 확인합니다. 둘 다 처리 논리가 다르더라도 동일한 3노드 패턴(원본, 그래프 프로세서, 대상)을 사용합니다.
이러한 유사성은 데이터 흐름 그래프 리소스가 그래프 정의를 로드하고 실행하는 호스트 환경 역할을 하므로 발생합니다. 실제 처리 논리는 WASM 모듈 간의 작업 및 연결에 대한 YAML 사양을 포함하는 그래프 정의 아티팩트(graph-simple:1.0.0 vs graph-complex:1.0.0)에 있습니다. 데이터 흐름 그래프 리소스는 아티팩트 끌어오기, 모듈 인스턴스화 및 정의된 워크플로를 통해 데이터를 라우팅하는 런타임 인프라를 제공합니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
작업 환경에서 데이터 흐름 그래프를 만들려면 데이터 흐름 탭으로 이동합니다.
+ 만들기 옆에 있는 드롭다운 메뉴를 선택하고 데이터 흐름 그래프 만들기를 선택합니다.
자리 표시자 이름 new-data-flow 를 선택하여 데이터 흐름 속성을 설정합니다. 데이터 흐름 그래프의 이름을 입력하고 사용할 데이터 흐름 프로필을 선택합니다.
데이터 흐름 다이어그램에서 원본 을 선택하여 원본 노드를 구성합니다. 원본 세부 정보에서 자산 또는 데이터 흐름 엔드포인트를 선택합니다.
자산을 선택하는 경우 데이터를 끌어올 자산을 선택하고 적용을 클릭합니다.
데이터 흐름 엔드포인트를 선택하는 경우 다음 세부 정보를 입력하고 적용을 클릭합니다.
Setting Description 데이터 흐름 엔드포인트 기본 MQTT 메시지 브로커 엔드포인트를 사용하려면 기본값을 선택합니다. 주제 들어오는 메시지에 대한 구독 항목 필터입니다. 여러 항목을 추가하려면 항목>행 추가를 사용합니다. 메시지 스키마 들어오는 메시지를 역직렬화하는 데 사용할 스키마입니다.
데이터 흐름 다이어그램에서 그래프 변환 추가(선택 사항) 를 선택하여 그래프 처리 노드를 추가합니다. 그래프 선택 창에서 그래프 복합:1을 선택하고 적용을 클릭합니다.
중요합니다
이 예제에서는
graph-complex:1.0.0아티팩트가 사용됩니다. 사용자 고유의 WASM 모듈을 개발하고 컨테이너 레지스트리에 푸시하여 사용자 지정 그래프를 만들 수 있습니다. 컨테이너 레지스트리에 푸시하는 그래프는 그래프 선택 창에서 사용할 수 있습니다.다이어그램에서 그래프 노드를 선택하여 일부 그래프 연산자 설정을 구성할 수 있습니다.
Operator Description module-snapshot/branch 이미지에서 snapshot개체 검색을 수행하도록 모듈을 구성합니다. 구성 키를 설정snapshot_topic하여 이미지 데이터에 대한 입력 항목을 지정할 수 있습니다.모듈-온도/지도 key2온도 값을 다른 배율로 변환합니다.적용 클릭하여 변경 내용을 저장합니다.
데이터 흐름 다이어그램에서 대상 을 선택하여 대상 노드를 구성합니다.
데이터 흐름 그래프 이름 아래에 저장 을 선택하여 데이터 흐름 그래프를 저장합니다.
복잡한 데이터 흐름 테스트
출력을 보려면 원본 데이터 설정을 가져와야 합니다.
mqtt-client Pod에 RAW 이미지 파일 업로드
이미지 파일은 이미지에서 객체를 감지하기 위한 snapshot 모듈에 사용됩니다. GitHub의 이미지 폴더에 있습니다.
먼저 리포지토리를 복제하여 이미지 파일에 액세스합니다.
git clone https://github.com/Azure-Samples/explore-iot-operations.git
cd explore-iot-operations
폴더에서 Pod로 ./samples/wasm/imagesmqtt-client RAW 이미지 파일을 업로드하려면 다음 명령을 사용할 수 있습니다.
kubectl cp ./samples/wasm/images azure-iot-operations/mqtt-client:/tmp
파일이 업로드되는지 확인합니다.
kubectl exec -it mqtt-client -n azure-iot-operations -- ls /tmp/images
/tmp/images 폴더의 파일 목록을 봐야 합니다.
beaker.raw laptop.raw sunny2.raw
binoculars.raw lawnmower.raw sunny4.raw
broom.raw milkcan.raw thimble.raw
camera.raw photocopier.raw tripod.raw
computer_mouse.raw radiator.raw typewriter.raw
daisy3.raw screwdriver.raw vacuum_cleaner.raw
digital_clock.raw sewing_machine.raw
hammer.raw sliding_door.raw
시뮬레이션된 온도, 습도 데이터 게시 및 이미지 보내기
온도, 습도 데이터를 게시하고 이미지를 단일 스크립트로 보내기 위한 명령을 결합할 수 있습니다. 다음 명령을 사용합니다.
# Connect to the MQTT client pod and run the script
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
while true; do
# Generate a random temperature value between 0 and 6000
temp_value=$(shuf -i 0-6000 -n 1)
temp_payload="{\"temperature\":{\"value\":$temp_value,\"unit\":\"F\"}}"
echo "Publishing temperature: $temp_payload"
mosquitto_pub -h aio-broker -p 18883 \
-m "$temp_payload" \
-t "sensor/temperature/raw" \
--cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)" \
-D PUBLISH user-property __ts $(date +%s)000:0:df
# Generate a random humidity value between 30 and 90
humidity_value=$(shuf -i 30-90 -n 1)
humidity_payload="{\"humidity\":{\"value\":$humidity_value}}"
echo "Publishing humidity: $humidity_payload"
mosquitto_pub -h aio-broker -p 18883 \
-m "$humidity_payload" \
-t "sensor/humidity/raw" \
--cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)" \
-D PUBLISH user-property __ts $(date +%s)000:0:df
# Send an image every 2 seconds
if [ $(( $(date +%s) % 2 )) -eq 0 ]; then
file=$(ls /tmp/images/*.raw | shuf -n 1)
echo "Sending file: $file"
mosquitto_pub -h aio-broker -p 18883 \
-f $file \
-t "sensor/images/raw" \
--cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)" \
-D PUBLISH user-property __ts $(date +%s)000:0:df
fi
# Wait for 1 second before the next iteration
sleep 1
done'
출력 확인
새 터미널에서 출력 항목을 구독합니다.
kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh -c '
mosquitto_sub -h aio-broker -p 18883 -t "analytics/sensor/processed" --cafile /var/run/certs/ca.crt \
-D CONNECT authentication-method "K8S-SAT" \
-D CONNECT authentication-data "$(cat /var/run/secrets/tokens/broker-sat)"'
출력은 다음과 같습니다.
{"temperature":[{"count":9,"max":2984.4444444444443,"min":248.33333333333337,"average":1849.6296296296296,"last":2612.222222222222,"unit":"C","overtemp":true}],"humidity":[{"count":10,"max":76.0,"min":30.0,"average":49.7,"last":38.0}],"object":[{"result":"milk can; broom; screwdriver; binoculars, field glasses, opera glasses; toy terrier"}]}
{"temperature":[{"count":10,"max":2490.5555555555557,"min":430.55555555555554,"average":1442.6666666666667,"last":1270.5555555555557,"unit":"C","overtemp":true}],"humidity":[{"count":9,"max":87.0,"min":34.0,"average":57.666666666666664,"last":42.0}],"object":[{"result":"broom; Saint Bernard, St Bernard; radiator"}]}
여기서 출력에는 이미지에서 검색된 개체뿐만 아니라 온도 및 습도 데이터가 포함됩니다.
실행 중인 그래프에서 모듈 업데이트
그래프를 중지하지 않고 실행 중인 그래프에서 WASM 모듈을 업데이트할 수 있습니다. 이는 데이터 흐름을 중지하지 않고 연산자의 논리를 업데이트하려는 경우에 유용합니다. 예를 들어 온도 변환 모듈을 버전에서 버전 1.0.0 으로 2.0.0업데이트하려면 다음과 같이 새 버전을 업로드합니다.
oras push <YOUR_ACR_NAME>.azurecr.io/temperature:2.0.0 --artifact-type application/vnd.module.wasm.content.layer.v1+wasm temperature-2.0.0.wasm:application/wasm
데이터 흐름 그래프는 추가 구성 없이 모듈의 새 버전을 자동으로 선택합니다. 그래프는 중단 없이 계속 실행되고 새 모듈 버전은 후속 데이터 처리에 사용됩니다.
사용자 지정 WASM 모듈 개발
데이터 흐름 그래프에 대한 사용자 지정 데이터 처리 논리를 만들려면 Rust 또는 Python에서 WebAssembly 모듈을 개발합니다. 사용자 지정 모듈을 사용하면 기본 제공 연산자에서 사용할 수 없는 특수 비즈니스 논리, 데이터 변환 및 분석을 구현할 수 있습니다.
다음을 포함한 포괄적인 개발 지침의 경우:
- 개발 환경 설정
- Rust 및 Python에서 연산자 만들기
- 데이터 모델 및 인터페이스 이해
- 모듈 빌드 및 테스트
데이터 흐름 그래프를 위한 WebAssembly 모듈 개발을 참조하세요.
데이터 처리 워크플로를 정의하는 YAML 그래프 정의를 만들고 구성하는 방법에 대한 자세한 내용은 WebAssembly 그래프 정의 구성을 참조하세요.
사용자 지정 데이터 흐름 그래프 구성
이 섹션에서는 WASM 모듈을 사용하여 데이터 흐름 그래프를 구성하는 방법에 대한 자세한 정보를 제공합니다. 모든 구성 옵션, 데이터 흐름 엔드포인트 및 고급 설정을 다룹니다.
데이터 흐름 그래프 개요
데이터 흐름 그래프는 처리를 위해 WebAssembly 모듈을 통해 데이터가 흐르는 방법을 정의합니다. 각 그래프는 다음으로 구성됩니다.
- 그래프의 사용 여부를 제어하는 모드
- 크기 조정 및 리소스 설정을 정의하는 데이터 흐름 프로필에 연결되는 프로필 참조
- 필요에 따라 그래프 상태에 대한 영구 스토리지를 사용하도록 설정하는 디스크 지속성
- 원본, 처리 및 대상 구성 요소를 정의하는 노드
- 노드 간에 데이터가 흐르는 방식을 지정하는 노드 연결
모드 구성
모드 속성은 데이터 흐름 그래프가 데이터를 적극적으로 처리하고 있는지 여부를 결정합니다. 모드를 Enabled(으)로 설정하거나 Disabled(으)로(대/소문자를 구분하지 않는) 설정할 수 있습니다. 사용하지 않도록 설정하면 그래프가 데이터 처리를 중지하지만 해당 구성은 유지됩니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
데이터 흐름 그래프를 만들거나 편집할 때 데이터 흐름 속성 창에서 데이터 흐름을 사용하도록 [예]로 설정하여 모드를 Enabled로 설정할 수 있습니다. 확인란을 선택하지 않으면 모드가 Disabled로 설정됩니다.
프로필 참조
프로필 참조는 데이터 흐름 그래프를 크기 조정 설정, 인스턴스 수 및 리소스 제한을 정의하는 데이터 흐름 프로필에 연결합니다. 프로필 참조를 지정하지 않으면 Kubernetes 소유자 참조를 대신 사용해야 합니다. 대부분의 시나리오에서는 Azure IoT 작업에서 제공하는 기본 프로필을 사용합니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
데이터 흐름 그래프를 만들거나 편집할 때 데이터 흐름 속성 창에서 데이터 흐름 프로필을 선택합니다. 기본 데이터 흐름 프로필은 기본적으로 선택됩니다. 데이터 흐름 프로필에 대한 자세한 내용은 데이터 흐름 프로필 구성을 참조하세요.
중요합니다
데이터 흐름 그래프를 만들 때만 데이터 흐름 프로필을 선택할 수 있습니다. 데이터 흐름 그래프를 만든 후에는 데이터 흐름 프로필을 변경할 수 없습니다. 기존 데이터 흐름 그래프의 데이터 흐름 프로필을 변경하려면 원래 데이터 흐름 그래프를 삭제하고 새 데이터 흐름 프로필을 사용하여 새 데이터 흐름 그래프를 만듭니다.
디스크 지속성 요청
중요합니다
데이터 흐름 그래프의 디스크 지속성에는 알려진 문제가 있습니다. 이 기능은 현재 예상대로 작동하고 있지 않습니다. 자세한 내용은 알려진 문제참조하세요.
디스크 지속성 요청을 통해 데이터 흐름 그래프가 다시 시작할 때 상태를 유지할 수 있습니다. 이 기능을 사용하도록 설정하면 연결된 브로커가 다시 시작되는 경우 그래프가 처리 상태를 복구할 수 있습니다. 이 기능은 중간 데이터 손실이 문제가 될 수 있는 상태 저장 처리 시나리오에 유용합니다. 디스크 지속성 요청을 사용하도록 설정하면 브로커는 구독자 큐의 메시지와 같은 MQTT 데이터를 디스크에 유지합니다. 이 방법을 사용하면 정전 또는 브로커를 다시 시작하는 동안 데이터 흐름의 데이터 원본에 데이터 손실이 발생하지 않습니다. 지속성은 데이터 흐름별로 구성되므로 브로커는 최적의 성능을 유지하여 지속성이 필요한 데이터 흐름만 이 기능을 사용합니다.
데이터 흐름 그래프는 MQTTv5 사용자 속성을 사용하여 구독하는 동안 이 지속성 요청을 수행합니다. 이 기능은 다음 경우에만 작동합니다.
- 데이터 흐름이 MQTT 브로커를 원본으로 사용합니다(MQTT 엔드포인트가 있는 원본 노드).
- MQTT 브로커는 구독자 큐와 같은 데이터 형식에 대해 동적 지속성 모드를
Enabled(으)로 설정하고 지속성을 사용하도록 설정했습니다.
이 구성을 사용하면 데이터 흐름 그래프와 같은 MQTT 클라이언트가 MQTTv5 사용자 속성을 사용하여 구독에 대한 디스크 지속성을 요청할 수 있습니다. 자세한 MQTT 브로커 지속성 구성은 MQTT 브로커 지속성 구성을 참조하세요.
설정에서는 Enabled 또는 Disabled을(를) 허용하며 기본값은 Disabled입니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
데이터 흐름 그래프를 만들거나 편집할 때 데이터 흐름 속성 창에서 요청 데이터 지속성을Yes 로 확인하여 요청 디스크 지속성을 Enabled설정할 수 있습니다. 선택 취소된 상태로 두면 설정은 Disabled입니다.
노드 구성
노드는 데이터 흐름 그래프의 구성 요소입니다. 각 노드는 그래프 내에서 고유한 이름을 가지며 특정 함수를 수행합니다. 다음과 같은 세 가지 유형의 노드가 있습니다.
원본 노드
원본 노드는 데이터가 그래프에 입력되는 위치를 정의합니다. MQTT 브로커 또는 Kafka 토픽에서 데이터를 수신하는 데이터 흐름 엔드포인트에 연결합니다. 각 원본 노드는 다음을 지정해야 합니다.
- 구성된 데이터 흐름 엔드포인트를 가리키는 엔드포인트 참조
- 구독할 MQTT 항목 또는 Kafka 항목 목록으로서의 데이터 원본
- 스키마 유추를 위해 Azure 장치 레지스트리 자산에 연결되는 자산 참조(선택 사항)
데이터 원본 배열을 사용하면 엔드포인트 구성을 수정하지 않고도 여러 항목을 구독할 수 있습니다. 이러한 유연성을 통해 엔드포인트는 다양한 데이터 흐름에서 다시 사용할 수 있습니다.
비고
현재 MQTT 및 Kafka 엔드포인트만 데이터 흐름 그래프의 데이터 원본으로 지원됩니다. 자세한 내용은 데이터 흐름 엔드포인트 구성을 참조하세요.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
데이터 흐름 다이어그램에서 원본 을 선택하여 원본 노드를 구성합니다. 원본 세부 정보에서 데이터 흐름 엔드포인트를 선택한 다음, 토픽 필드를 사용하여 들어오는 메시지에 대해 구독할 MQTT 토픽 필터를 지정합니다. 행 추가를 선택하고 새 항목을 입력하여 여러 MQTT 항목을 추가할 수 있습니다.
그래프 처리 노드
그래프 처리 노드에는 데이터를 변환하는 WebAssembly 모듈이 포함되어 있습니다. 이러한 노드는 컨테이너 레지스트리에서 WASM 아티팩트를 끌어와 지정된 구성 매개 변수를 사용하여 실행합니다. 각 그래프 노드에는 다음이 필요합니다.
- 아티팩트를 가져오기 위한 레지스트리 엔드포인트를 가리키는 레지스트리 엔드포인트 참조
- 끌어올 모듈 이름 및 버전을 정의하는 아티팩트 사양
- WASM 모듈에 전달된 키-값 쌍으로 구성 매개변수
구성 배열을 사용하면 WASM 아티팩트 다시 빌드하지 않고도 모듈 동작을 사용자 정의할 수 있습니다. 일반적인 구성 옵션에는 처리 매개 변수, 임계값, 변환 설정 및 기능 플래그가 포함됩니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
데이터 흐름 다이어그램에서 그래프 변환 추가(선택 사항) 를 선택하여 그래프 처리 노드를 추가합니다. 그래프 선택 창에서 원하는 그래프 아티팩트(단순 또는 복합 그래프)를 선택하고 적용을 클릭합니다. 다이어그램에서 그래프 노드를 선택하여 일부 그래프 연산자 설정을 구성할 수 있습니다.
구성 키-값 쌍은 런타임에 WASM 모듈에 전달됩니다. 모듈은 이러한 값에 액세스하여 동작을 사용자 지정할 수 있습니다. 이 방법을 사용하면 다음과 같은 이점이 있습니다.
- 다른 구성을 사용하여 동일한 WASM 모듈 배포
- 모듈을 다시 빌드하지 않고 처리 매개 변수 조정
- 배포 요구 사항에 따라 기능 사용 또는 사용 안 함
- 임계값 또는 엔드포인트와 같은 환경별 값 설정
대상 노드
대상 노드는 처리된 데이터가 전송되는 위치를 정의합니다. MQTT 브로커, 클라우드 스토리지 또는 기타 시스템에 데이터를 보내는 데이터 흐름 엔드포인트에 연결됩니다. 각 대상 노드는 다음을 지정합니다.
- 구성된 데이터 흐름 엔드포인트를 가리키는 엔드포인트 참조
- 출력 데이터의 특정 토픽, 경로 또는 위치로서의 데이터 대상
- serialization 형식 및 스키마 유효성 검사를 정의하는 출력 스키마 설정(선택 사항)
Azure Data Lake 또는 Fabric OneLake와 같은 스토리지 대상의 경우 출력 스키마 설정을 지정하여 데이터가 직렬화되고 유효성이 검사되는 방식을 제어할 수 있습니다.
비고
현재 MQTT, Kafka 및 OpenTelemetry 엔드포인트만 데이터 흐름 그래프의 데이터 대상으로 지원됩니다. 자세한 내용은 데이터 흐름 엔드포인트 구성을 참조하세요.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
- 데이터 흐름 다이어그램에서 대상 노드를 선택합니다.
- 데이터 흐름 엔드포인트 세부 정보 드롭다운에서 원하는 데이터 흐름 엔드포인트를 선택합니다.
- 계속을 선택하여 대상을 구성합니다.
- 데이터를 보낼 토픽 또는 테이블을 포함하여 대상에 필요한 설정을 입력합니다. 데이터 대상 필드는 엔드포인트 유형에 따라 자동으로 해석됩니다. 예를 들어 데이터 흐름 엔드포인트가 MQTT 엔드포인트인 경우 대상 세부 정보 페이지에서 항목을 입력하라는 메시지를 표시합니다.
노드 연결
노드 연결은 노드 간의 데이터 흐름 경로를 정의합니다. 각 연결은 원본 노드와 대상 노드를 지정하여 처리 파이프라인을 만듭니다. 연결에는 필요에 따라 처리 단계 간의 데이터 무결성을 보장하기 위한 스키마 유효성 검사가 포함될 수 있습니다.
스키마 유효성 검사를 지정하면 시스템은 노드 간에 흐르는 데이터 형식과 구조의 유효성을 검사합니다. 유효성 검사는 데이터 불일치를 조기에 포착하고 WASM 모듈이 예상된 형식으로 데이터를 수신하도록 합니다.
- 작업 환경
- Bicep
- Kubernetes (쿠버네티스)
작업 환경은 그래프 처리 노드를 선택할 때 노드 연결을 자동으로 만듭니다. 그래프를 만든 후에는 연결을 수정할 수 없습니다.
데이터 흐름 엔드포인트
데이터 흐름 그래프는 데이터 흐름 엔드포인트를 통해 외부 시스템에 연결됩니다. 엔드포인트 유형에 따라 원본, 대상 또는 둘 다로 사용할 수 있는지 여부가 결정됩니다.
MQTT 엔드포인트
MQTT 엔드포인트는 원본 및 대상 모두로 사용될 수 있습니다. 다음을 포함하여 MQTT 브로커에 연결됩니다.
- Azure IoT 작업 로컬 MQTT 브로커(모든 데이터 흐름에 필요)
- Azure Event Grid MQTT
- 사용자 지정 MQTT 브로커
자세한 구성 정보는 MQTT 데이터 흐름 엔드포인트 구성을 참조하세요.
Kafka 엔드포인트
Kafka 엔드포인트는 원본 및 대상 모두로 사용될 수 있습니다. 다음을 포함하여 Kafka 호환 시스템에 연결됩니다.
- Azure Event Hubs(Kafka 호환)
- Apache Kafka 클러스터
- Confluent Cloud
자세한 구성 정보는 Azure Event Hubs 및 Kafka 데이터 흐름 엔드포인트 구성을 참조하세요.
스토리지 엔드포인트
스토리지 엔드포인트는 대상으로만 사용할 수 있습니다. 장기 데이터 보존 및 분석을 위해 클라우드 스토리지 시스템에 연결됩니다.
- Azure Data Lake Storage
- Microsoft Fabric OneLake
- 로컬 스토리지
스토리지 엔드포인트에는 일반적으로 데이터 serialization 형식을 정의하기 위해 출력 스키마 설정이 필요합니다.
레지스트리 엔드포인트
레지스트리 엔드포인트는 WASM 모듈 및 그래프 정의를 끌어오기 위해 컨테이너 레지스트리에 대한 액세스를 제공합니다. 데이터 흐름에서 직접 사용되지는 않지만 그래프 처리 노드는 이를 참조합니다.
자세한 구성 정보는 레지스트리 엔드포인트 구성조하세요.