빠른 시작: ARM 템플릿을 사용하여 Azure Data Factory 만들기

적용 대상: Azure Data Factory Azure Synapse Analytics

기업용 올인원 분석 솔루션인 Microsoft Fabric의 Data Factory를 사용해 보세요. Microsoft Fabric은 데이터 이동부터 데이터 과학, 실시간 분석, 비즈니스 인텔리전스 및 보고에 이르기까지 모든 것을 다룹니다. 무료로 새 평가판을 시작하는 방법을 알아봅니다!

이 빠른 시작에서는 ARM 템플릿(Azure Resource Manager 템플릿)을 사용하여 Azure 데이터 팩터리를 만드는 방법을 보여 줍니다. 이 데이터 팩터리에서 만든 파이프라인은 Azure Blob Storage의 한 폴더에서 다른 폴더로 데이터를 복사합니다. Azure Data Factory를 사용하여 데이터를 변환하는 방법에 대한 자습서는 자습서: Apache Spark를 사용하여 데이터 변환을 참조하세요.

Azure Resource Manager 템플릿은 프로젝트의 인프라 및 구성을 정의하는 JSON(JavaScript Object Notation) 파일입니다. 이 템플릿은 선언적 구문을 사용합니다. 배포를 만들기 위한 프로그래밍 명령 시퀀스를 작성하지 않고 의도한 배포를 설명합니다.

참고 항목

이 문서는 Data Factory 서비스의 자세한 소개를 제공하지 않습니다. Azure Data Factory 서비스 소개는 Azure Data Factory 소개를 참조하세요.

환경이 필수 구성 요소를 충족하고 ARM 템플릿 사용에 익숙한 경우 Azure에 배포 단추를 선택합니다. 그러면 Azure Portal에서 템플릿이 열립니다.

Button to deploy the Resource Manager template to Azure.

필수 조건

Azure 구독

Azure 구독이 없는 경우 시작하기 전에 체험 계정을 만듭니다.

파일을 만듭니다.

메모장과 같은 텍스트 편집기를 열고 다음 내용을 사용하여 emp.txt라는 파일을 만듭니다.

John, Doe
Jane, Doe

C:\ADFv2QuickStartPSH 폴더에 이 파일을 저장합니다. 이 폴더가 아직 없으면 만듭니다.

템플릿 검토

이 빠른 시작에서 사용되는 템플릿은 Azure 빠른 시작 템플릿에서 나온 것입니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.26.54.24096",
      "templateHash": "17339534711754973978"
    }
  },
  "parameters": {
    "dataFactoryName": {
      "type": "string",
      "defaultValue": "[format('datafactory{0}', uniqueString(resourceGroup().id))]",
      "metadata": {
        "description": "Data Factory Name"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location of the data factory."
      }
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('storage{0}', uniqueString(resourceGroup().id))]",
      "metadata": {
        "description": "Name of the Azure storage account that contains the input/output data."
      }
    },
    "blobContainerName": {
      "type": "string",
      "defaultValue": "[format('blob{0}', uniqueString(resourceGroup().id))]",
      "metadata": {
        "description": "Name of the blob container in the Azure Storage account."
      }
    }
  },
  "variables": {
    "dataFactoryLinkedServiceName": "ArmtemplateStorageLinkedService",
    "dataFactoryDataSetInName": "ArmtemplateTestDatasetIn",
    "dataFactoryDataSetOutName": "ArmtemplateTestDatasetOut",
    "pipelineName": "ArmtemplateSampleCopyPipeline"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts/blobServices",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/{1}', parameters('storageAccountName'), 'default')]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "minimumTlsVersion": "TLS1_2",
        "supportsHttpsTrafficOnly": true,
        "allowBlobPublicAccess": false
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/{1}/{2}', parameters('storageAccountName'), 'default', parameters('blobContainerName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('storageAccountName'), 'default')]"
      ]
    },
    {
      "type": "Microsoft.DataFactory/factories",
      "apiVersion": "2018-06-01",
      "name": "[parameters('dataFactoryName')]",
      "location": "[parameters('location')]",
      "identity": {
        "type": "SystemAssigned"
      }
    },
    {
      "type": "Microsoft.DataFactory/factories/linkedservices",
      "apiVersion": "2018-06-01",
      "name": "[format('{0}/{1}', parameters('dataFactoryName'), variables('dataFactoryLinkedServiceName'))]",
      "properties": {
        "type": "AzureBlobStorage",
        "typeProperties": {
          "connectionString": "[format('DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}', parameters('storageAccountName'), listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2023-01-01').keys[0].value)]"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.DataFactory/factories', parameters('dataFactoryName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.DataFactory/factories/datasets",
      "apiVersion": "2018-06-01",
      "name": "[format('{0}/{1}', parameters('dataFactoryName'), variables('dataFactoryDataSetInName'))]",
      "properties": {
        "linkedServiceName": {
          "referenceName": "[variables('dataFactoryLinkedServiceName')]",
          "type": "LinkedServiceReference"
        },
        "type": "Binary",
        "typeProperties": {
          "location": {
            "type": "AzureBlobStorageLocation",
            "container": "[parameters('blobContainerName')]",
            "folderPath": "input",
            "fileName": "emp.txt"
          }
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.DataFactory/factories', parameters('dataFactoryName'))]",
        "[resourceId('Microsoft.DataFactory/factories/linkedservices', parameters('dataFactoryName'), variables('dataFactoryLinkedServiceName'))]"
      ]
    },
    {
      "type": "Microsoft.DataFactory/factories/datasets",
      "apiVersion": "2018-06-01",
      "name": "[format('{0}/{1}', parameters('dataFactoryName'), variables('dataFactoryDataSetOutName'))]",
      "properties": {
        "linkedServiceName": {
          "referenceName": "[variables('dataFactoryLinkedServiceName')]",
          "type": "LinkedServiceReference"
        },
        "type": "Binary",
        "typeProperties": {
          "location": {
            "type": "AzureBlobStorageLocation",
            "container": "[parameters('blobContainerName')]",
            "folderPath": "output"
          }
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.DataFactory/factories', parameters('dataFactoryName'))]",
        "[resourceId('Microsoft.DataFactory/factories/linkedservices', parameters('dataFactoryName'), variables('dataFactoryLinkedServiceName'))]"
      ]
    },
    {
      "type": "Microsoft.DataFactory/factories/pipelines",
      "apiVersion": "2018-06-01",
      "name": "[format('{0}/{1}', parameters('dataFactoryName'), variables('pipelineName'))]",
      "properties": {
        "activities": [
          {
            "name": "MyCopyActivity",
            "type": "Copy",
            "typeProperties": {
              "source": {
                "type": "BinarySource",
                "storeSettings": {
                  "type": "AzureBlobStorageReadSettings",
                  "recursive": true
                }
              },
              "sink": {
                "type": "BinarySink",
                "storeSettings": {
                  "type": "AzureBlobStorageWriteSettings"
                }
              },
              "enableStaging": false
            },
            "inputs": [
              {
                "referenceName": "[variables('dataFactoryDataSetInName')]",
                "type": "DatasetReference"
              }
            ],
            "outputs": [
              {
                "referenceName": "[variables('dataFactoryDataSetOutName')]",
                "type": "DatasetReference"
              }
            ]
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.DataFactory/factories', parameters('dataFactoryName'))]",
        "[resourceId('Microsoft.DataFactory/factories/datasets', parameters('dataFactoryName'), variables('dataFactoryDataSetInName'))]",
        "[resourceId('Microsoft.DataFactory/factories/datasets', parameters('dataFactoryName'), variables('dataFactoryDataSetOutName'))]"
      ]
    }
  ],
  "outputs": {
    "name": {
      "type": "string",
      "value": "[variables('pipelineName')]"
    },
    "resourceId": {
      "type": "string",
      "value": "[resourceId('Microsoft.DataFactory/factories/pipelines', parameters('dataFactoryName'), variables('pipelineName'))]"
    },
    "resourceGroupName": {
      "type": "string",
      "value": "[resourceGroup().name]"
    },
    "location": {
      "type": "string",
      "value": "[parameters('location')]"
    }
  }
}

템플릿에 Azure 리소스가 정의되어 있습니다.

더 많은 Azure Data Factory 템플릿 샘플은 빠른 시작 템플릿 갤러리에서 찾을 수 있습니다.

템플릿 배포

  1. 다음 이미지를 선택하고 Azure에 로그인하여 템플릿을 엽니다. 템플릿은 Azure Data Factory 계정, 스토리지 계정 및 Blob 컨테이너를 만듭니다.

    Button to deploy the Resource Manager template to Azure.

  2. 다음 값을 선택하거나 입력합니다.

    Deploy ADF ARM template

    지정되지 않은 경우 기본값을 사용하여 Azure Data Factory 리소스를 만듭니다.

    • 구독: Azure 구독을 선택합니다.
    • 리소스 그룹: 새로 만들기를 선택하고 리소스 그룹에 고유한 이름을 입력한 다음, 확인을 선택합니다.
    • 지역: 위치를 선택합니다. 예: 미국 동부
    • Data Factory 이름: 기본값을 사용합니다.
    • 위치: 기본값을 사용합니다.
    • 스토리지 계정 이름: 기본값을 사용합니다.
    • Blob 컨테이너: 기본값을 사용합니다.

배포된 리소스 검토

  1. 리소스 그룹으로 이동을 선택합니다.

    Resource Group

  2. Azure Data Factory가 생성되었는지 확인합니다.

    1. Azure Data Factory 이름은 - datafactory<uniqueid> 형식입니다.

    Sample Data Factory

  3. 스토리지 계정이 생성되었는지 확인합니다.

    1. 스토리지 계정 이름은 - storage<uniqueid> 형식입니다.

    Storage Account

  4. 생성한 스토리지 계정을 선택한 다음, 컨테이너를 선택합니다.

    1. 컨테이너 페이지에서 원하는 Blob 컨테이너를 선택합니다.
      1. Blob 컨테이너 이름은 - blob<uniqueid> 형식입니다.

    Blob container

파일 업로드

  1. 컨테이너 페이지에서 업로드를 선택합니다.

  2. 오른쪽 창에서 파일 상자를 선택한 다음, 이전에 만든 emp.txt 파일을 찾아 선택합니다.

  3. 고급 제목을 펼칩니다.

  4. 폴더에 업로드 상자에서 입력을 입력합니다.

  5. 업로드 버튼을 선택합니다. 목록에서 emp.txt 파일 및 업로드 상태를 참조하세요.

  6. 닫기 아이콘(X)을 선택하여 Blob 업로드 페이지를 닫습니다.

    Upload file to input folder

이 빠른 시작의 끝에서 출력을 확인하는 데 사용할 수 있으므로 컨테이너 페이지를 열어 둡니다.

트리거 시작

  1. 데이터 팩터리 페이지로 이동하여 이전에 만든 데이터 팩터리를 선택합니다.

  2. Azure Data Factory Studio 열기 타일에서 열기를 선택합니다.

    Author & Monitor

  3. 작성자을 선택합니다.

  4. 만든 파이프라인 - ArmtemplateSampleCopyPipeline을 선택합니다.

    ARM template pipeline

  5. 트리거 추가>지금 트리거를 선택합니다.

    Trigger

  6. 오른쪽 창의 파이프라인 실행에서 확인을 선택합니다.

파이프라인 모니터링

  1. 모니터을 선택합니다.

  2. 파이프라인 실행과 연결된 작업 실행이 표시됩니다. 이 빠른 시작의 파이프라인에는 복사 유형의 작업 하나밖에 없습니다. 따라서 해당 작업에 대한 실행이 표시됩니다.

    Successful run

출력 파일 확인

파이프라인은 자동으로 Blob 컨테이너에서 출력 폴더를 만듭니다. 그런 다음 입력 폴더에서 출력 폴더로 emp.txt 파일을 복사합니다.

  1. Azure Portal의 컨테이너 페이지에서 새로 고침을 선택하여 출력 폴더를 확인합니다.

  2. 폴더 목록에서 출력을 선택합니다.

  3. emp.txt가 출력 폴더에 복사되었는지 확인합니다.

    Output

리소스 정리

빠른 시작에서 만든 리소스는 두 가지 방법으로 정리할 수 있습니다. 리소스 그룹의 모든 리소스를 포함하고 있는 Azure 리소스 그룹을 삭제할 수 있습니다. 다른 리소스를 그대로 유지하려면 이 자습서에서 만든 데이터 팩터리만 삭제합니다.

리소스 그룹을 삭제하면 그 안에 포함된 데이터 팩터리를 포함한 모든 리소스가 삭제됩니다. 다음 명령을 실행하여 전체 리소스 그룹을 삭제합니다.

Remove-AzResourceGroup -ResourceGroupName $resourcegroupname

전체 리소스 그룹이 아니라 데이터 팩터리만 삭제하려면 다음 명령을 실행합니다.

Remove-AzDataFactoryV2 -Name $dataFactoryName -ResourceGroupName $resourceGroupName

이 빠른 시작에서는 ARM 템플릿을 사용하여 Azure Data Factory를 만들고 배포의 유효성을 검사했습니다. Azure Data Factory 및 Azure Resource Manager에 대해 자세히 알아보려면 아래 문서로 계속 진행하세요.