이 문서에서는 Flex 소비 계획을 대신 사용하도록 Azure Functions의 소비 계획에 호스트된 기존 함수 앱을 마이그레이션하기 위한 단계별 지침을 제공합니다.
앱을 Flex Consumption 계획으로 마이그레이션하는 방법은 앱이 Linux에서 실행되는지 Windows에서 실행되는지에 따라 달라집니다. 문서의 맨 위에 있는 운영 체제를 선택해야 합니다.
팁 (조언)
Azure Functions는 Linux 앱을 사용량 플랜에서 Flex 사용 플랜으로 전환하는 데 필요한 대부분의 단계를 자동화하는 Azure CLI 명령을 az functionapp flex-migration에서 제공합니다. 이 문서에서는 현재 Linux에서 실행되는 앱에 대해서만 지원되는 이러한 명령을 제공합니다.
기존 서버리스 앱을 마이그레이션할 때 함수는 Flex Consumption 계획의 이러한 이점을 활용할 수 있습니다.
- 향상된 성능: 앱은 확장성이 향상되고 항상 준비된 인스턴스를 통해 콜드 시작 영향을 줄일 수 있습니다.
- 향상된 컨트롤: 함수별 크기 조정 및 동시성 설정을 사용하여 함수를 미세 조정합니다.
- 확장된 네트워킹: 가상 네트워크 통합 및 프라이빗 엔드포인트를 사용하면 퍼블릭 네트워크와 프라이빗 네트워크 모두에서 함수를 실행할 수 있습니다.
- 향후 플랫폼 투자: 최고의 서버리스 호스팅 계획으로서 플랫폼 안정성, 성능 및 기능을 위해 Flex Consumption에 대한 현재 및 미래의 투자가 먼저 이루어집니다.
앞으로 귀하의 함수에 권장되는 서버리스 호스팅 옵션은 Flex 소비 계획입니다. 자세한 내용은 Flex Consumption 플랜 혜택을 참조하세요. 호스팅 계획 간의 자세한 비교는 Azure Functions 호스팅 옵션을 참조하세요.
고려 사항
마이그레이션을 시작하기 전에 다음 사항에 유의하세요.
Azure Government 지역에서 소비 계획 함수 앱을 실행하는 경우 지금 이 지침을 검토하여 Azure Government에서 Flex Consumption를 사용하도록 설정할 때까지 마이그레이션을 준비합니다.
두 계획 간의 상당한 구성 및 동작 차이로 인해 기존 소비 계획 앱을 Flex Consumption 계획으로 이동할 수 없습니다. 대신 마이그레이션 프로세스에서 현재 앱과 동일한 새 Flex Consumption 계획 앱을 만듭니다. 이 새 앱은 현재 앱과 동일한 종속성과 동일한 리소스 그룹에서 실행됩니다.
Linux의 소비 계획에서 실행되는 앱 마이그레이션의 우선 순위를 지정해야 합니다.
이 문서에서는 Functions 개념 및 아키텍처에 대한 일반적인 이해가 있고 마이그레이션 중인 앱의 기능에 익숙하다고 가정합니다. 이러한 개념에는 트리거 및 바인딩, 인증 및 네트워킹 사용자 지정이 포함됩니다.
이 문서에서는 Azure Portal 또는 Azure CLI를 사용하여 현재 앱을 평가하고 새 Flex Consumption 계획 앱을 배포하는 방법을 보여 줍니다. 현재 앱 배포가 IaC(Infrastructure-as-code)를 사용하여 정의되는 경우 일반적으로 동일한 단계를 수행할 수 있습니다. 다음과 같은 리소스별 고려 사항을 사용하여 ARM 템플릿 또는 Bicep 파일에서 직접 동일한 작업을 수행할 수 있습니다.
- Flex Consumption 계획은 애플리케이션 설정이었던 많은 구성을 포함하는
Microsoft.Web/sites리소스 유형의 새로운 섹션functionAppConfig을 도입했습니다. 자세한 내용은 Flex 사용량 플랜 사용 중단을 참조하세요. - Azure Functions의 함수 앱에 대한 리소스 배포 자동화에서 Flex 사용 계획 앱의 리소스 구성 세부 정보를 찾을 수 있습니다.
- Functions는 ARM 템플릿, Bicep 파일 및 Terraform 파일에 대한 정식 Flex Consumption 계획 배포 예제 집합을 유지 관리합니다.
- Flex Consumption 계획은 애플리케이션 설정이었던 많은 구성을 포함하는
필수 조건
마이그레이션할 함수 앱이 하나 이상 포함된 Azure 구독에 액세스합니다. Azure CLI 명령을 실행하는 데 사용되는 계정은 다음을 수행할 수 있어야 합니다.
- 함수 앱 및 App Service 호스팅 계획을 만들고 관리합니다.
- 관리 ID에 역할을 할당합니다.
- 스토리지 계정을 만들고 관리합니다.
- Application Insights 리소스를 만들고 관리합니다.
- Azure Key Vault, Azure Service Bus 또는 Azure Event Hubs와 같은 앱의 모든 종속 리소스에 액세스합니다.
리소스 그룹의 소유자 또는 기여자 역할에 할당되는 것은 일반적으로 충분한 권한을 제공합니다.
Azure CLI, 버전 v2.77.0 이상 스크립트는 Azure Cloud Shell에서 Azure CLI를 사용하여 테스트됩니다.
명령을 사용하여 설치할 수 있는
az extension add확장입니다.az extension add --name resource-graphjqJSON 출력을 사용하는 데 사용되는 도구입니다.
마이그레이션할 잠재적 앱 식별
다음 단계를 사용하여 마이그레이션해야 하는 함수 앱 목록을 만듭니다. 이 목록에서 이름, 리소스 그룹, 위치 및 런타임 스택을 기록해 둡니다. 그런 다음 Flex 소비 계획으로 마이그레이션하기로 결정한 각 앱에 대해 이 가이드의 단계를 반복할 수 있습니다.
함수 앱 정보가 유지되는 방식은 앱이 Linux 또는 Windows에서 실행되는지에 따라 달라집니다.
Linux 소비 앱의 경우 새 az functionapp flex-migration list 명령을 사용하여 마이그레이션에 적합한 앱을 식별합니다.
az functionapp flex-migration list
이 명령은 구독을 자동으로 검색하고 두 개의 배열을 반환합니다.
- eligible_apps: Flex Consumption로 마이그레이션 가능한 Linux 컨슈머 앱입니다. 이러한 앱은 Flex Consumption와 호환됩니다.
- ineligible_apps: 특정 이유와 함께 마이그레이션할 수 없는 앱입니다. 비호환성에 대한 이유는 계속하기 전에 검토하고 해결해야 합니다.
출력에는 자격 상태 및 마이그레이션 준비 정보와 함께 각 앱의 앱 이름, 리소스 그룹, 위치 및 런타임 스택이 포함됩니다.
이 az graph query 명령을 사용하여 소비 계획에서 실행 중인 구독의 모든 함수 앱을 나열합니다.
az graph query -q "resources | where subscriptionId == '$(az account show --query id -o tsv)' \
| where type == 'microsoft.web/sites' | where ['kind'] == 'functionapp' | where properties.sku == 'Dynamic' \
| project name, ___location, resourceGroup" \
--query data --output table
이 명령은 현재 구독의 Windows에서 실행되는 모든 소비 앱에 대한 앱 이름, 위치 및 리소스 그룹이 있는 테이블을 생성합니다.
아직 설치되지 않은 경우 리소스 그래프 확장을 설치하라는 메시지가 표시됩니다.
기존 앱 평가
Flex Consumption 계획으로 마이그레이션하기 전에 다음 검사를 수행하여 함수 앱을 성공적으로 마이그레이션할 수 있는지 확인해야 합니다.
지역 호환성 확인
현재 Flex Consumption 계획이 마이그레이션하려는 소비 계획 앱과 동일한 지역에서 지원되고 있는지 확인합니다.
확인됨:
az functionapp flex-migration list명령 출력에 앱이eligible_apps목록에 있는 경우 현재 Linux 사용 앱에서 사용되는 동일 지역에서 Flex 사용 플랜이 지원됩니다. 이 경우 언어 스택 호환성을 계속 확인할 수 있습니다.
필요한 작업: 명령 출력 시
az functionapp flex-migration list의 앱이ineligible_apps목록에 있을 때The site '<name>' is not in a region supported in Flex Consumption. Please see the list regions supported in Flex Consumption by running az functionapp list-flexconsumption-locations라는 오류 메시지가 표시됩니다. 이 경우, 귀하의 현재 Linux 컨섬션 앱이 사용하는 지역에서는 Flex Consumption 계획이 아직 지원되지 않습니다.
이 az functionapp list-flexconsumption-locations 명령을 사용하여 Flex Consumption 계획을 사용할 수 있는 모든 지역을 나열합니다.
az functionapp list-flexconsumption-locations --query "sort_by(@, &name)[].{Region:name}" -o table
이 명령은 Flex Consumption 계획이 현재 지원되는 Azure 지역 테이블을 생성합니다.
지역이 현재 지원되지 않고 함수 앱을 마이그레이션하도록 선택하는 경우 Flex Consumption 계획이 지원되는 다른 지역에서 앱이 실행되어야 합니다. 그러나 다른 연결된 서비스와 다른 지역에서 앱을 실행하면 추가 대기 시간이 발생할 수 있습니다. 마이그레이션을 완료하기 전에 새 지역이 애플리케이션의 성능 요구 사항을 충족할 수 있는지 확인합니다.
언어 스택 호환성 확인
Flex 소비 계획은 아직 모든 Functions 언어 스택을 지원하지 않습니다. 이 표는 현재 지원되는 언어 스택을 나타냅니다.
| 스택 설정 | 스택 이름 | 지원됨 |
|---|---|---|
dotnet-isolated |
.NET(격리된 작업자 모델) | ✅ 예 |
node |
JavaScript/TypeScript | ✅ 예 |
java |
java | ✅ 예 |
python |
파이썬 | ✅ 예 |
powershell |
PowerShell | ✅ 예 |
dotnet |
.NET(In Process 모델) | ❌ 아니요 |
custom |
사용자 지정 처리기 | ❌ 아니요 |
확인:
az functionapp flex-migration list명령어가 귀하의 앱을eligible_apps목록에 포함시켰다면, Linux 소비 앱은 이미 Flex Consumption에서 지원하는 언어 스택을 사용하고 있으며 스택 버전 호환성을 검증할 수 있습니다.
필요한 작업:
az functionapp flex-migration list명령이ineligible_apps(이)라는 오류 메시지와 함께Runtime '<name>' not supported for function apps on the Flex Consumption plan.목록에 앱을 포함시킨 경우 Linux 사용 앱은 Flex 사용에서 지원되는 런타임을 아직 실행하지 않고 있습니다.
함수 앱에서 지원되지 않는 런타임 스택을 사용하는 경우:
런타임(
dotnet)을 사용하여 In-Process로 실행되는 C# 앱의 경우 먼저 앱을 .NET 격리로 마이그레이션해야 합니다. 자세한 내용은 프로세스 내 모델에서 격리된 작업자 모델로 C# 앱 마이그레이션을 참조하세요.사용자 지정 처리기를 사용하는 비 네이티브 언어 앱은 현재 Flex Consumption 계획에서 실행되도록 마이그레이션할 수 없습니다.
스택 버전 호환성 확인
마이그레이션하기 전에 현재 지역의 Flex Consumption 계획에서 실행할 때 앱의 런타임 스택 버전이 지원되는지 확인해야 합니다.
확인됨:
az functionapp flex-migration list명령이eligible_apps목록에 앱을 포함시킨 경우, Linux 사용 앱은 이미 Flex 사용에서 지원하는 언어 스택 버전을 사용하고 있으며, 배포 슬롯 사용량을 계속 검증할 수 있습니다.
필요한 작업:
az functionapp flex-migration list명령이ineligible_apps(이)라는 오류 메시지와 함께Invalid version {0} for runtime {1} for function apps on the Flex Consumption plan. Supported versions for runtime {1} are {2}.목록에 앱을 포함시킨 경우 Linux 사용 앱은 Flex 사용에서 지원되는 런타임을 아직 실행하지 않고 있습니다.
이 az functionapp list-flexconsumption-runtimes 명령을 사용하여 특정 지역의 언어 스택 버전에 대한 Flex Consumption 계획 지원을 확인합니다.
az functionapp list-flexconsumption-runtimes --___location <REGION> --runtime <LANGUAGE_STACK> --query '[].{version:version}' -o tsv
이 예제에서는 <REGION>를 현재 지역으로, <LANGUAGE_STACK>를 다음 값 중 하나로 대체합니다.
| 언어 스택 | 가치 |
|---|---|
| C#(격리된 작업자 모델) | dotnet-isolated |
| java | java |
| JavaScript | node |
| PowerShell | powershell |
| 파이썬 | python |
| TypeScript | node |
이 명령은 해당 지역의 Flex Consumption 계획에서 지원하는 지정된 언어 스택의 모든 버전을 표시합니다.
함수 앱에서 지원되지 않는 언어 스택 버전을 사용하는 경우 Flex Consumption 계획으로 마이그레이션하기 전에 먼저 앱 코드를 지원되는 버전으로 업그레이드 해야 합니다.
배포 슬롯 사용량 확인
소비 계획 앱은 배포 슬롯을 정의할 수 있습니다. 자세한 내용은 Azure Functions 배포 슬롯을 참조하세요. 그러나 Flex Consumption 계획은 현재 배포 슬롯을 지원하지 않습니다. 마이그레이션하기 전에 앱에 배포 슬롯이 있는지 확인해야 합니다. 그렇다면 Flex Consumption 계획에서 실행할 때 배포 슬롯 없이 앱을 관리하는 방법에 대한 전략을 정의해야 합니다.
확인: 현재 사용 중인 앱에 배포 슬롯이 활성화된 경우,
az functionapp flex-migration list명령은 경고 없이 목록에 함수 앱을eligible_apps표시합니다. 계속해서 인증서 사용을 확인하십시오.
필요한 작업: 현재 앱에 배포 슬롯이 활성화되어
az functionapp flex-migration list있습니다. 이 명령은 목록에 함수 앱을eligible_apps표시하지만 다음과 같은 경고를 추가합니다.The site '<name>' has slots configured. This will not block migration, but please note that slots are not supported in Flex Consumption.
이 az functionapp deployment slot list 명령을 사용하여 함수 앱에 정의된 배포 슬롯을 나열합니다.
az functionapp deployment slot list --name <APP_NAME> --resource-group <RESOURCE_GROUP> --output table
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요. 명령이 항목을 반환하면 앱에 배포 슬롯이 활성화됩니다.
함수 앱이 현재 배포 슬롯을 사용하는 경우 현재 Flex Consumption 계획에서 이 기능을 재현할 수 없습니다. 마이그레이션하기 전에 다음을 수행해야 합니다.
- 별도의 함수 앱을 사용하도록 애플리케이션을 다시 설계하는 것이 좋습니다. 이러한 방식으로 슬롯을 사용하는 대신 두 번째 비프로덕션 앱에 함수 코드를 개발, 테스트 및 배포할 수 있습니다.
- 배포 슬롯의 새 코드 또는 기능을 주(프로덕션) 슬롯으로 마이그레이션합니다.
인증서 사용 확인
이전에 SSL(Secure Sockets Layer) 인증서로 알려진 TLS(전송 계층 보안) 인증서는 인터넷 연결을 보호하는 데 사용됩니다. 관리되는 인증서, BYOC(Bring-Your-Own Certificate) 또는 공개 키 인증서를 포함하는 TSL/SSL 인증서는 현재 Flex 소비 계획에서 지원되지 않습니다.
확인됨:
az functionapp flex-migration list명령이eligible_apps목록에 앱을 포함시킨 경우 Linux 사용 앱은 아직 인증서를 사용하고 있지 않으며, Blob Storage 트리거 확인을 계속할 수 있습니다.
필요한 작업:
az functionapp flex-migration list명령이ineligible_apps또는The site '<name>' is using TSL/SSL certificates. TSL/SSL certificates are not supported in Flex Consumption.(이)라는 오류 메시지와 함께The site '<name>' has the WEBSITE_LOAD_CERTIFICATES app setting configured. Certificate loading is not supported in Flex Consumption.목록에 앱을 포함시킨 경우 Linux 사용 앱은 아직 Flex 사용과 호환되지 않습니다.
명령을 az webapp config ssl list 사용하여 함수 앱에서 사용할 수 있는 모든 TSL/SSL 인증서를 나열합니다.
az webapp config ssl list --resource-group <RESOURCE_GROUP>
예제에서 <RESOURCE_GROUP>을(를) 리소스 그룹 이름으로 대체합니다. 이 명령이 출력을 생성하는 경우 앱에서 인증서를 사용할 가능성이 높습니다.
앱이 현재 TSL/SSL 인증서를 사용하는 경우 인증서에 대한 지원이 Flex Consumption 계획에 추가될 때까지 마이그레이션을 진행하면 안 됩니다.
Blob Storage 트리거를 확인하세요
현재 Flex 사용 계획은 Source 설정의 EventGrid(으)로 정의된 Azure Blob Storage에 대한 이벤트 기반 트리거만 지원합니다. 컨테이너 폴링을 사용하며 Source 설정이 LogsAndContainerScan인 Blob Storage 트리거는 Flex Consumption에서 지원되지 않습니다. 컨테이너 폴링이 기본값이므로 Blob Storage 트리거 중에서 기본 LogsAndContainerScan 원본 설정을 사용하고 있는지 확인해야 합니다. 자세한 내용은 블롭 컨테이너에서 트리거 설정하기를 참조하세요.
확인됨:
az functionapp flex-migration list명령이 앱을eligible_apps목록에 포함한 경우, Linux 사용 앱은EventGrid을(를) 원본으로 사용하는 Blob Storage 트리거를 사용하지 않고 있습니다. 종속 서비스를 계속 고려할 수 있습니다.
필요한 작업:
az functionapp flex-migration list명령이ineligible_apps(이)라는 오류 메시지와 함께The site '<name>' has blob storage trigger(s) that don't use Event Grid as the source: <list> Flex Consumption only supports Event Grid-based blob triggers. Please convert these triggers to use Event Grid or replace them with Event Grid triggers before migration.목록에 앱을 포함시킨 경우 Linux 사용 앱은 Flex 사용과 아직 호환되지 않습니다.
이 [az functionapp function list] 명령을 사용하여 앱에 Event Grid를 원본으로 사용하지 않는 Blob Storage 트리거가 있는지 확인합니다.
az functionapp function list --name <APP_NAME> --resource-group <RESOURCE_GROUP> \
--query "[?config.bindings[0].type=='blobTrigger' && config.bindings[0].source!='EventGrid'].{Function:name,TriggerType:config.bindings[0].type,Source:config.bindings[0].source}" \
--output table
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요. 명령이 행을 반환하는 경우 함수 앱에서 컨테이너 폴링을 사용하는 트리거가 하나 이상 있습니다.
앱에 Event Grid 원본이 없는 Blob Storage 트리거가 있는 경우 Flex Consumption 계획으로 마이그레이션하기 전에 Event Grid 원본으로 변경해야 합니다.
기존 Blob Storage 트리거를 Event Grid 원본으로 변경하는 기본 단계는 다음과 같습니다.
Blob Storage 트리거 정의에서
source속성을 추가하거나 업데이트하여EventGrid앱을 다시 배포합니다.이벤트 구독에서 사용되는 함수 앱에서 엔드포인트 URL을 빌드합니다.
Blob Storage 컨테이너에서 이벤트 구독을 만듭니다.
자세한 내용은 자습서: 이벤트 구독을 사용하여 Blob 컨테이너에서 Azure Functions 트리거를 참조하세요.
종속 서비스 고려
Azure Functions는 컴퓨팅 서비스이므로 앱의 업스트림 및 다운스트림 모두에서 데이터 및 서비스에 대한 마이그레이션의 영향을 고려해야 합니다.
데이터 보호 전략
마이그레이션 중에 업스트림 및 다운스트림 데이터를 모두 보호하는 몇 가지 전략은 다음과 같습니다.
- Idempotency: 함수가 부정적인 부작용 없이 동일한 메시지를 여러 번 안전하게 처리할 수 있는지 확인합니다. 자세한 내용은 동일한 입력에 대한 Azure Functions 디자인을 참조하세요.
- 로깅 및 모니터링: 마이그레이션 중에 두 앱에서 자세한 로깅을 사용하도록 설정하여 메시지 처리를 추적합니다. 자세한 내용은 Azure Functions의 실행 모니터링을 참조하세요.
- 검사점: Event Hubs 트리거와 같은 스트리밍 트리거의 경우 올바른 검사점 동작을 구현하여 처리 위치를 추적합니다. 자세한 내용은 Azure Functions 신뢰할 수 있는 이벤트 처리를 참조하세요.
- 병렬 처리: 중단 중에 두 앱을 동시에 실행하는 것이 좋습니다. 업스트림 서비스에서 데이터가 처리되는 방식을 주의 깊게 모니터링하고 유효성을 검사해야 합니다. 자세한 내용은 비 HTTPS 트리거 함수에 대한 활성-활성 패턴을 참조하세요.
- 점진적 전환: 대용량 시스템의 경우 트래픽의 일부를 새 앱으로 리디렉션하여 점진적 전환을 구현하는 것이 좋습니다. Azure API Management 또는 Azure Application Gateway와 같은 서비스를 사용하여 앱에서 요청 업스트림의 라우팅을 관리할 수 있습니다.
트리거 유형별 완화
앱에 있을 수 있는 특정 함수 트리거에 대한 데이터를 보호하기 위한 완화 전략을 계획해야 합니다.
| 트리거 | 데이터에 대한 위험 | 전략 |
|---|---|---|
| Azure Blob Storage | 높음 | 새 앱에서 이벤트 기반 트리거에 대한 별도의 컨테이너를 만듭니다. 새 앱이 실행되면 클라이언트를 전환하여 새 컨테이너를 사용합니다. 이전 앱을 중지하기 전에 원래 컨테이너를 완전히 처리하도록 허용합니다. |
| Azure Cosmos DB | 높음 | 새 앱에 대한 전용 임대 컨테이너를 만듭니다. 이 새 임대 컨테이너를 새 앱의 leaseCollectionName 구성으로 설정합니다.함수가 idempotent거나 중복된 변경 피드 처리 결과를 처리할 수 있어야 합니다. StartFromBeginning 전체 피드를 다시 처리하지 않도록 새 앱에서 구성 false 을 설정합니다. |
| Azure Event Grid | 미디엄 | 새 앱에서 동일한 이벤트 구독을 다시 만듭니다. 함수가 멱등적(idempotent)이어야 하거나 중복 이벤트 처리 결과를 처리할 수 있어야 합니다. |
| Azure Event Hubs | 미디엄 | 새 앱에서 사용할 새 소비자 그룹을 만듭니다. 자세한 내용은 Event Grid 트리거에 대한 마이그레이션 전략을 참조하세요. |
| Azure Service Bus | 높음 | 새 앱에서 사용할 새 토픽 또는 큐를 만듭니다. 새 토픽 또는 큐를 사용하도록 보낸 사람과 클라이언트를 업데이트합니다. 원래 항목이 비어 있으면 이전 앱을 종료합니다. |
| Azure Storage 큐 | 높음 | 새 앱에서 사용할 새 큐를 만듭니다. 새 큐를 사용하도록 보낸 사람과 클라이언트를 업데이트합니다. 원래 큐가 비어 있으면 이전 앱을 종료합니다. |
| HTTP | 낮음 | 마이그레이션 후 새 HTTP 엔드포인트를 대상으로 클라이언트 및 기타 앱 또는 서비스를 전환해야 합니다. |
| 타이머 | 낮음 | 중단 중에는 두 앱에서 동시에 실행하지 않도록 두 앱 간의 타이머 일정을 오프셋해야 합니다. 새 앱이 성공적으로 실행된 후 이전 앱에서 타이머 트리거를 사용하지 않도록 설정합니다. |
Linux에 대한 마이그레이션 시작
az functionapp flex-migration start 명령은 자동으로 애플리케이션 구성 정보를 수집하고 원본 앱과 동일한 구성으로 새 Flex Consumption 앱을 만듭니다. 이 예제와 같이 명령을 사용합니다.
az functionapp flex-migration start \
--source-name <SOURCE_APP_NAME> \
--source-resource-group <SOURCE_RESOURCE_GROUP> \
--name <NEW_APP_NAME> \
--resource-group <RESOURCE_GROUP>
이 예제에서는 이러한 자리 표시자를 표시된 값으로 바꿉다.
| 플레이스홀더 | 가치 |
|---|---|
<SOURCE_APP_NAME> |
원래 앱의 이름입니다. |
<SOURCE_RESOURCE_GROUP> |
원래 앱의 리소스 그룹입니다. |
<NEW_APP_NAME> |
새 앱의 이름입니다. |
<RESOURCE_GROUP> |
새 앱의 리소스 그룹입니다. |
이 az functionapp flex-migration start 명령은 다음과 같은 기본 작업을 수행합니다.
- Flex Consumption 호스팅 계획과의 호환성을 위해 원본 앱을 평가합니다.
- Flex 사용량 계획에서 함수 앱을 만듭니다.
- 앱 설정, ID 할당, 스토리지 탑재, CORS 설정, 사용자 지정 도메인 및 액세스 제한을 포함한 대부분의 구성을 마이그레이션합니다.
명령 옵션
마이그레이션 명령은 마이그레이션을 사용자 지정하는 몇 가지 옵션을 지원합니다.
| Option | 설명 |
|---|---|
--storage-account |
새 앱에 대해 다른 스토리지 계정 지정 |
--maximum-instance-count |
크기 조정을 위한 최대 인스턴스 수 설정 |
--skip-access-restrictions |
IP 액세스 제한 마이그레이션 건너뛰기 |
--skip-cors |
CORS 설정 마이그레이션 건너뛰기 |
--skip-hostnames |
사용자 지정 도메인 마이그레이션 건너뛰기 |
--skip-managed-identities |
관리 ID 구성 마이그레이션 건너뛰기 |
--skip-storage-mount |
스토리지 탑재 구성 마이그레이션 건너뛰기 |
전체 명령 옵션을 사용하려면 .를 사용합니다 az functionapp flex-migration start --help.
실행을 az functionapp flex-migration start 성공적으로 완료한 후 코드 배포 패키지를 계속 가져옵니다.
사전 마이그레이션 작업
마이그레이션을 계속하기 전에 Flex Consumption 계획에서 실행되도록 원활하게 전환할 수 있도록 소비 계획 앱에서 사용하는 주요 정보 및 리소스를 수집해야 합니다.
Flex Consumption 계획에서 실행되도록 앱을 마이그레이션하기 전에 다음 작업을 완료해야 합니다.
앱 설정 수집
앱 설정에서 동일한 트리거 및 바인딩 원본 및 기타 설정을 사용하려는 경우 먼저 기존 소비 계획 앱의 현재 앱 설정을 기록해 둡니다.
이 az functionapp config appsettings list 명령을 사용하여 기존 앱 설정을 포함하는 개체를 JSON으로 반환 app_settings 합니다.
app_settings=$(az functionapp config appsettings list --name `<APP_NAME>` --resource-group `<RESOURCE_GROUP>`)
echo $app_settings
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요.
주의
앱 설정에는 키 및 기타 공유 비밀이 자주 포함됩니다. 항상 애플리케이션 설정을 안전하게 저장하고 이상적으로 암호화합니다. 보안을 향상하려면 공유 비밀 대신 새 Flex Consumption 계획 앱에서 관리 ID로 Microsoft Entra ID 인증을 사용해야 합니다.
애플리케이션 구성 수집
앱 설정에서 다른 앱 구성을 찾을 수 없습니다. 또한 새 앱에서 올바르게 다시 만들 수 있도록 기존 앱에서 이러한 구성을 캡처해야 합니다.
이러한 설정을 검토합니다. 현재 앱에 해당 항목이 있는 경우 새 Flex Consumption 계획 앱에서도 다시 만들어야 하는지 여부를 결정해야 합니다.
| 구성 / 설정 | 설정 | 주석 |
|---|---|---|
| CORS 설정 | cors |
클라이언트에 필요할 수 있는 기존 CORS(원본 간 리소스 공유) 설정을 결정합니다. |
| 사용자 지정 도메인 | 앱이 현재 이외의 *.azurewebsites.net도메인을 사용하는 경우 이 사용자 지정 도메인 매핑을 새 앱에 대한 매핑으로 바꾸어야 합니다. |
|
| HTTP 버전 | http20Enabled |
앱에서 HTTP 2.0이 필요한지 여부를 확인합니다. |
| HTTPS만 | httpsOnly |
앱에 액세스하는 데 TSL/SSL이 필요한지 여부를 확인합니다. |
| 들어오는 클라이언트 인증서 | clientCertEnabledclientCertModeclientCertExclusionPaths |
인증에 인증서를 사용하는 클라이언트 요청에 대한 요구 사항을 설정합니다. |
| 최대 스케일 아웃 제한 | WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT |
스케일 아웃 인스턴스에 대한 제한을 설정합니다. 기본 최대값은 200입니다. 이 값은 앱 설정에서 찾을 수 있지만 Flex Consumption 계획 앱에서는 대신 사이트 설정(maximumInstanceCount)으로 추가됩니다. |
| 최소 인바운드 TLS 버전 | minTlsVersion |
앱에 필요한 최소 버전의 TLS를 설정합니다. |
| 최소 인바운드 TLS 암호화 | minTlsCipherSuite |
앱에 대한 최소 TLS 암호화 요구 사항을 설정합니다. |
| 탑재된 Azure Files 공유 | azureStorageAccounts |
앱에 명시적으로 탑재된 파일 공유가 있는지 확인합니다(Linux 전용). |
| SCM 기본 인증 게시 자격 증명 | scm.allow |
게시 사이트가 활성화되어 있는지 여부를scm 확인합니다. 보안에는 권장되지 않지만 일부 게시 방법에는 필요합니다. |
이 스크립트를 사용하여 기존 앱의 관련 애플리케이션 구성을 가져옵니다.
# Set the app and resource group names
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
echo "Getting commonly used site settings..."
az functionapp config show --name $appName --resource-group $rgName \
--query "{http20Enabled:http20Enabled, httpsOnly:httpsOnly, minTlsVersion:minTlsVersion, \
minTlsCipherSuite:minTlsCipherSuite, clientCertEnabled:clientCertEnabled, \
clientCertMode:clientCertMode, clientCertExclusionPaths:clientCertExclusionPaths}"
echo "Checking for SCM basic publishing credentials policies..."
az resource show --resource-group $rgName --name scm --namespace Microsoft.Web \
--resource-type basicPublishingCredentialsPolicies --parent sites/$appName --query properties
echo "Checking for the maximum scale-out limit configuration..."
az functionapp config appsettings list --name $appName --resource-group $rgName \
--query "[?name=='WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT'].value" -o tsv
echo "Checking for any file share mount configurations..."
az webapp config storage-account list --name $appName --resource-group $rgName
echo "Checking for any custom domains..."
az functionapp config hostname list --webapp-name $appName --resource-group $rgName --query "[?contains(name, 'azurewebsites.net')==\`false\`]" --output table
echo "Checking for any CORS settings..."
az functionapp cors show --name $appName --resource-group $rgName
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요. 사이트 설정 또는 검사가 null이 아닌 값을 반환하는 경우 기록해 둡니다.
관리 ID 및 역할 기반 액세스 식별
마이그레이션하기 전에 앱이 시스템 할당 관리 ID 또는 사용자 할당 관리 ID에 의존하는지 여부를 문서화해야 합니다. 또한 이러한 ID에 부여된 RBAC(역할 기반 액세스 제어) 권한을 결정해야 합니다. 새 앱에서 시스템 할당 관리 ID 및 역할 할당을 다시 만들어야 합니다. 새 앱에서 사용자 할당 관리 ID를 다시 사용할 수 있어야 합니다.
이 스크립트는 시스템 할당 관리 ID와 앱과 연결된 사용자 할당 관리 ID를 모두 확인합니다.
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
echo "Checking for a system-assigned managed identity..."
systemUserId=$(az functionapp identity show --name $appName --resource-group $rgName --query "principalId" -o tsv)
if [[ -n "$systemUserId" ]]; then
echo "System-assigned identity principal ID: $systemUserId"
echo "Checking for role assignments..."
az role assignment list --assignee $systemUserId --all
else
echo "No system-assigned identity found."
fi
echo "Checking for user-assigned managed identities..."
userIdentities=$(az functionapp identity show --name $appName --resource-group $rgName --query 'userAssignedIdentities' -o json)
if [[ "$userIdentities" != "{}" && "$userIdentities" != "null" ]]; then
echo "$userIdentities" | jq -c 'to_entries[]' | while read -r identity; do
echo "User-assigned identity name: $(echo "$identity" | jq -r '.key' | sed 's|.*/userAssignedIdentities/||')"
echo "Checking for role assignments..."
az role assignment list --assignee $(echo "$identity" | jq -r '.value.principalId') --all --output json
echo
done
else
echo "No user-assigned identities found."
fi
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요. 모든 ID 및 해당 역할 할당을 기록해 둡니다.
기본 제공 인증 설정 식별
Flex Consumption로 마이그레이션하기 전에 기본 제공 인증 구성에 대한 정보를 수집해야 합니다. 앱에서 동일한 클라이언트 인증 동작을 사용하려면 새 앱에서 다시 만들어야 합니다. 자세한 내용은 Azure Functions의 인증 및 권한 부여를 참조하세요.
인증된 사용자를 위한 원활한 전환을 보장하기 위해 리디렉션 URI, 허용된 외부 리디렉션 및 토큰 설정에 특히 주의하세요.
이 az webapp auth show 명령을 사용하여 함수 앱 에서 기본 제공 인증 이 구성되었는지 확인합니다.
az webapp auth show --name <APP_NAME> --resource-group <RESOURCE_GROUP>
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요. 출력을 검토하여 인증이 사용되는지 여부와 구성된 ID 공급자를 확인합니다.
클라이언트가 선호하는 공급자를 사용하여 액세스를 유지할 수 있도록 마이그레이션 후 새 앱에서 이러한 설정을 다시 만들어야 합니다.
인바운드 액세스 제한 검토
소비 계획에서 앱에 대한 인바운드 액세스 제한을 설정할 수 있습니다. 새 앱에서 이러한 제한을 유지할 수 있습니다. 정의된 각 제한 사항에 대해 다음 속성을 캡처해야 합니다.
- IP 주소 또는 CIDR 범위
- 우선 순위 값
- 작업 유형(허용/거부)
- 규칙의 이름
이 az functionapp config access-restriction show 명령은 기존 IP 기반 액세스 제한 목록을 반환합니다.
az functionapp config access-restriction show --name <APP_NAME> --resource-group <RESOURCE_GROUP>
이 예제에서는 <RESOURCE_GROUP>를 리소스 그룹 이름으로, <APP_NAME>를 앱 이름으로 각각 교체하세요.
Flex Consumption 계획에서 실행하는 경우 이러한 인바운드 IP 기반 제한을 다시 만들 수 있습니다. 가상 네트워크 통합 및 인바운드 프라이빗 엔드포인트와 같은 다른 네트워킹 제한을 구현하여 앱을 더욱 안전하게 보호할 수 있습니다. 자세한 내용은 가상 네트워크 통합을 참조하세요.
코드 배포 패키지 가져오기
앱을 다시 배포하려면 프로젝트의 원본 파일 또는 배포 패키지가 있어야 합니다. 새 앱에 함수 코드를 쉽게 다시 배포할 수 있도록 프로젝트 파일이 소스 제어에서 유지 관리되는 것이 가장 좋습니다. 소스 코드 파일이 있는 경우 이 섹션을 건너뛰고 성능 벤치마크 캡처(선택 사항)를 계속 진행할 수 있습니다.
프로젝트 원본 파일에 더 이상 액세스할 수 없는 경우 Azure의 기존 소비 계획 앱에서 현재 배포 패키지를 다운로드할 수 있습니다. 배포 패키지의 위치는 Linux 또는 Windows에서 실행하는지 여부에 따라 달라집니다.
Linux의 소비 계획 앱은 다음 위치 중 하나에서 배포 zip 패키지 파일을 유지 관리합니다.
기본 호스트 스토리지 계정(
scm-releases)에 명명된AzureWebJobsStorageAzure Blob Storage 컨테이너입니다. 이 컨테이너는 Linux의 소비 계획 앱에 대한 기본 배포 원본입니다.앱에 URL인
WEBSITE_RUN_FROM_PACKAGE설정이 있는 경우 패키지는 사용자가 유지 관리하는 외부에서 액세스할 수 있는 위치에 있습니다. 외부 패키지는 액세스가 제한된 Blob Storage 컨테이너에서 호스트되어야 합니다. 자세한 내용은 외부 패키지 URL을 참조하세요.
팁 (조언)
스토리지 계정이 관리 ID에만 접근 가능한 경우, 역할 Storage Blob Data Reader에 Azure 계정을 추가하여 스토리지 컨테이너에 대한 읽기 권한을 부여해야 할지도 모릅니다.
배포 패키지는 squashfs 형식을 사용하여 압축됩니다. 패키지 내의 내용을 확인하려면 이 형식을 풀 수 있는 도구를 사용해야 합니다.
다음 단계를 사용하여 현재 앱에서 배포 패키지를 다운로드합니다.
이
az functionapp config appsettings list명령을 사용하여 앱 설정을 가져옵니다WEBSITE_RUN_FROM_PACKAGE(있는 경우).az functionapp config appsettings list --name <APP_NAME> --resource-group <RESOURCE_GROUP> \ --query "[?name=='WEBSITE_RUN_FROM_PACKAGE'].value" -o tsv이 예제에서는
<RESOURCE_GROUP>를 리소스 그룹 이름으로,<APP_NAME>를 앱 이름으로 각각 교체하세요. 이 명령이 URL을 반환하는 경우 해당 원격 위치에서 배포 패키지 파일을 다운로드하고 다음 섹션으로 건너뛸 수 있습니다.값이
WEBSITE_RUN_FROM_PACKAGE이거나1아무것도 아닐 때, 이 스크립트를 사용하여 기존 앱의 배포 패키지를 가져오세요.appName=<APP_NAME> rgName=<RESOURCE_GROUP> echo "Getting the storage account connection string from app settings..." storageConnection=$(az functionapp config appsettings list --name $appName --resource-group $rgName \ --query "[?name=='AzureWebJobsStorage'].value" -o tsv) echo "Getting the package name..." packageName=$(az storage blob list --connection-string $storageConnection --container-name scm-releases \ --query "[0].name" -o tsv) echo "Download the package? $packageName? (Y to proceed, any other key to exit)" read -r answer if [[ "$answer" == "Y" || "$answer" == "y" ]]; then echo "Proceeding with download..." az storage blob download --connection-string $storageConnection --container-name scm-releases \ --name $packageName --file $packageName else echo "Exiting script." exit 0 fi다시
<RESOURCE_GROUP>를 당신의 리소스 그룹 이름으로,<APP_NAME>를 당신의 앱 이름으로 대체합니다. 패키지 .zip 파일은 명령을 실행한 디렉터리에 다운로드됩니다.
프로젝트 원본 파일의 위치는 다음과 같이 앱 설정에 WEBSITE_RUN_FROM_PACKAGE 따라 달라집니다.
WEBSITE_RUN_FROM_PACKAGE 값 |
원본 파일 위치 |
|---|---|
1 |
파일은 설정에서 정의된 스토리지 계정의 Azure Files 공유에 저장된 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING zip 패키지에 있습니다. 파일 공유의 이름은 설정에 의해 정의됩니다 WEBSITE_CONTENTSHARE . |
| 엔드포인트 URL | 파일은 사용자가 유지 관리하는 외부에서 액세스할 수 있는 위치에 있는 zip 패키지에 있습니다. 외부 패키지는 액세스가 제한된 Blob Storage 컨테이너에서 호스트되어야 합니다. 자세한 내용은 외부 패키지 URL을 참조하세요. |
이
az functionapp config appsettings list명령을 사용하여 앱 설정을 가져옵니다WEBSITE_RUN_FROM_PACKAGE(있는 경우).az functionapp config appsettings list --name <APP_NAME> --resource-group <RESOURCE_GROUP> \ --query "[?name=='WEBSITE_RUN_FROM_PACKAGE'].value" -o tsv이 예제에서는
<RESOURCE_GROUP>를 리소스 그룹 이름으로,<APP_NAME>를 앱 이름으로 각각 교체하세요. 이 명령이 URL을 반환하는 경우 해당 원격 위치에서 배포 패키지 파일을 다운로드하고 다음 섹션으로 건너뛸 수 있습니다.값이
WEBSITE_RUN_FROM_PACKAGE이거나1아무것도 아닐 때, 이 스크립트를 사용하여 기존 앱의 배포 패키지를 가져오세요.appName=<APP_NAME> rgName=<RESOURCE_GROUP> echo "Getting the storage account connection string and file share from app settings..." json=$(az functionapp config appsettings list --name $appName --resource-group $rgName \ --query "[?name=='WEBSITE_CONTENTAZUREFILECONNECTIONSTRING' || name=='WEBSITE_CONTENTSHARE'].value" -o json) storageConnection=$(echo "$json" | jq -r '.[0]') fileShare=$(echo "$json" | jq -r '.[1]') echo "Getting the package name..." packageName=$(az storage file list --share-name $fileShare --connection-string $storageConnection \ --path "data/SitePackages" --query "[?ends_with(name, '.zip')] | sort_by(@, &properties.lastModified)[-1].name" \ -o tsv) echo "Download the package? $packageName? (Y to proceed, any other key to exit)" read -r answer if [[ "$answer" == "Y" || "$answer" == "y" ]]; then echo "Proceeding with download..." az storage file download --connection-string $storageConnection --share-name $fileShare \ --path "data/SitePackages/$packageName" else echo "Exiting script." exit 0 fi다시
<RESOURCE_GROUP>를 당신의 리소스 그룹 이름으로,<APP_NAME>를 당신의 앱 이름으로 대체합니다. 패키지 .zip 파일은 명령을 실행한 디렉터리에 다운로드됩니다.
성능 벤치마크 캡처(선택 사항)
Flex Consumption 계획으로의 마이그레이션에 따라 앱의 성능 향상에 대한 유효성을 검사하려는 경우(선택적으로) 현재 계획의 성능 벤치마크를 캡처해야 합니다. 그런 다음 비교를 위해 Flex Consumption 계획에서 실행되는 앱에 대해 동일한 벤치마크와 비교할 수 있습니다.
팁 (조언)
항상 하루 중 시간, 요일 및 클라이언트 로드와 같은 유사한 조건에서 성능을 비교합니다. 두 벤치마크를 가능한 한 가깝게 실행해 보세요.
다음은 구조적 성능 테스트에 대해 고려해야 할 몇 가지 벤치마크입니다.
| 제안된 벤치마크 | 주석 |
|---|---|
| 콜드 스타트 | 유휴 기간 후 첫 번째 요청에서 첫 번째 응답까지의 시간을 측정합니다. |
| 처리량 | 부하 테스트 도구를 사용하여 초당 최대 요청 수를 측정하여 앱이 동시 요청을 처리하는 방법을 결정합니다. |
| 대기 시간 |
P50다양한 부하 조건에서 , P95및 P99 응답 시간을 추적합니다. Application Insights에서 이러한 메트릭을 모니터링할 수 있습니다. |
이 Kusto 쿼리를 사용하여 Application Insights에서 제안된 대기 시간 응답 시간을 검토할 수 있습니다.
requests
| where timestamp > ago(1d)
| summarize percentiles(duration, 50, 95, 99) by bin(timestamp, 1h)
| render timechart
마이그레이션 단계
소비 계획 앱에서 Flex Consumption 계획 앱으로 함수를 마이그레이션하는 작업은 다음 주요 단계를 따릅니다.
Flex Consumption 앱 생성 및 구성 확인
az functionapp flex-migration start 명령을 실행한 후 새 Flex Consumption 앱이 성공적으로 생성되고 제대로 구성되었는지 확인해야 합니다. 마이그레이션 결과의 유효성을 검사하는 몇 가지 단계는 다음과 같습니다.
새 앱이 있고 실행 중인지 확인합니다.
az functionapp show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \ --query "{name:name, kind:kind, sku:properties.sku}" --output table마이그레이션된 앱 설정을 검토합니다.
az functionapp config appsettings list --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \ --output table이러한 설정을 원본 앱과 비교하여 중요한 구성이 전송되었는지 확인합니다.
관리 ID 구성을 확인합니다.
az functionapp identity show --name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP>사용자 지정 도메인이 마이그레이션되었는지 확인합니다.
az functionapp config hostname list --webapp-name <NEW_APP_NAME> --resource-group <RESOURCE_GROUP> \ --output table
마이그레이션 요약 검토
자동화된 마이그레이션 명령은 대부분의 구성을 전송해야 합니다. 그러나 이러한 항목이 마이그레이션되지 않았으며 수동으로 구성해야 할 수도 있는지 수동으로 확인해야 합니다.
- 인증서: TSL/SSL 인증서는 Flex Consumption에서 아직 지원되지 않습니다.
- 배포 슬롯: Flex 사용에서 지원되지 않음
- 기본 제공 인증 설정: 수동으로 다시 구성해야 합니다.
- CORS 설정: 구성에 따라 수동 확인이 필요할 수 있습니다.
중요한 설정이 없거나 잘못된 경우 이 문서의 Windows 마이그레이션 프로세스 섹션에 설명된 단계를 사용하여 수동으로 구성할 수 있습니다.
계획의 최종 검토
마이그레이션 프로세스를 진행하기 전에 잠시 다음 마지막 준비 단계를 수행합니다.
수집된 모든 정보를 검토합니다. 이전 평가 및 사전 배포 섹션에서 문서화한 모든 노트, 구성 세부 정보 및 애플리케이션 설정을 살펴봅니다. 명확하지 않은 경우 Azure CLI 명령을 다시 실행하거나 포털에서 정보를 가져옵니다.
마이그레이션 계획 정의: 결과에 따라 다음을 강조 표시하는 마이그레이션에 대한 검사 목록을 만듭니다.
- 특별한 주의가 필요한 모든 설정
- 트리거 및 바인딩 또는 마이그레이션 중에 영향을 받을 수 있는 기타 종속성
- 마이그레이션 후 유효성 검사를 위한 테스트 전략
- 예기치 않은 문제가 있는 경우 롤백 계획
가동 중지 시간 계획: 원래 함수 앱을 중지하여 이벤트의 데이터 손실 및 중복 처리를 방지하는 시기와 이것이 사용자 또는 다운스트림 시스템에 어떤 영향을 미칠 수 있는지를 고려합니다. 경우에 따라 전체 앱을 중지하기 전에 특정 함수를 사용하지 않도록 설정 해야 할 수 있습니다.
신중한 최종 검토는 마이그레이션 프로세스를 원활하게 하고 중요한 구성을 간과할 위험을 최소화하는 데 도움이 됩니다.
Flex 소비 계획에서 앱 만들기
Flex Consumption 계획에서 다른 필수 Azure 리소스와 함께 함수 앱을 만드는 다양한 방법이 있습니다.
| 옵션 만들기 | 참조 문서 |
|---|---|
| Azure 커맨드 라인 인터페이스 (CLI) | Flex Consumption 앱 만들기 |
| Azure 포털 | Azure Portal에서 함수 앱 만들기 |
| 코드로서의 인프라 |
ARM 템플릿 azd Bicep Terraform |
| 비주얼 스튜디오 코드 | Visual Studio Code 배포 |
| 비주얼 스튜디오 | Visual Studio 배포 |
팁 (조언)
가능하면 공유 키를 포함하는 연결 문자열 대신 인증에 Microsoft Entra ID를 사용해야 합니다. 관리 ID를 사용하는 것은 애플리케이션 설정에 공유 비밀을 직접 저장할 필요가 없도록 하여 보안을 향상시키는 모범 사례입니다. 원래 앱에서 연결 문자열을 사용한 경우 Flex Consumption 계획은 관리 ID를 지원하도록 설계되었습니다. 이러한 링크의 대부분은 함수 앱에서 관리 ID를 사용하도록 설정하는 방법을 보여 줍니다.
새 앱에서 마이그레이션된 앱 설정 적용
코드를 배포하기 전에 원래 함수 앱의 관련 Flex Consumption 계획 앱 설정을 사용하여 새 앱을 구성해야 합니다.
중요합니다
Flex Consumption 계획에서 실행할 때 모든 소비 계획 앱 설정이 지원되는 것은 아닙니다. 자세한 내용은 Flex 사용량 플랜 사용 중단을 참조하세요.
다음 작업을 수행하는 이 스크립트를 실행합니다.
- Flex 소비 계획에 적용되지 않거나 새 앱에 이미 있는 설정을 무시하고 이전 앱에서 앱 설정을 가져옵니다.
- 수집된 설정을 임시 파일에 로컬로 씁니다.
- 파일의 설정을 새 앱에 적용합니다.
- 임시 파일을 삭제합니다.
sourceAppName=<SOURCE_APP_NAME>
destAppName=<DESTINATION_APP_NAME>
rgName=<RESOURCE_GROUP>
echo "Getting app settings from the old app..."
app_settings=$(az functionapp config appsettings list --name $sourceAppName --resource-group $rgName)
# Filter out settings that don't apply to Flex Consumption apps or that will already have been created
filtered_settings=$(echo "$app_settings" | jq 'map(select(
(.name | ascii_downcase) != "website_use_placeholder_dotnetisolated" and
(.name | ascii_downcase | startswith("azurewebjobsstorage") | not) and
(.name | ascii_downcase) != "website_mount_enabled" and
(.name | ascii_downcase) != "enable_oryx_build" and
(.name | ascii_downcase) != "functions_extension_version" and
(.name | ascii_downcase) != "functions_worker_runtime" and
(.name | ascii_downcase) != "functions_worker_runtime_version" and
(.name | ascii_downcase) != "functions_max_http_concurrency" and
(.name | ascii_downcase) != "functions_worker_process_count" and
(.name | ascii_downcase) != "functions_worker_dynamic_concurrency_enabled" and
(.name | ascii_downcase) != "scm_do_build_during_deployment" and
(.name | ascii_downcase) != "website_contentazurefileconnectionstring" and
(.name | ascii_downcase) != "website_contentovervnet" and
(.name | ascii_downcase) != "website_contentshare" and
(.name | ascii_downcase) != "website_dns_server" and
(.name | ascii_downcase) != "website_max_dynamic_application_scale_out" and
(.name | ascii_downcase) != "website_node_default_version" and
(.name | ascii_downcase) != "website_run_from_package" and
(.name | ascii_downcase) != "website_skip_contentshare_validation" and
(.name | ascii_downcase) != "website_vnet_route_all" and
(.name | ascii_downcase) != "applicationinsights_connection_string"
))')
echo "Settings to migrate..."
echo "$filtered_settings"
echo "Writing settings to a local a local file (app_settings_filtered.json)..."
echo "$filtered_settings" > app_settings_filtered.json
echo "Applying settings to the new app..."
output=$(az functionapp config appsettings set --name $destAppName --resource-group $rgName --settings @app_settings_filtered.json)
echo "Deleting the temporary settings file..."
rm -rf app_settings_filtered.json
echo "Current app settings in the new app..."
az functionapp config appsettings list --name $destAppName --resource-group $rgName
이 예제에서는 <RESOURCE_GROUP>, <SOURCE_APP_NAME>, <DEST_APP_NAME>을 각각 리소스 그룹 이름과 이전 및 새로운 앱 이름으로 바꾸십시오. 이 스크립트는 두 앱이 동일한 리소스 그룹에 있다고 가정합니다.
다른 앱 구성 적용
미리 배포하는 동안 수집한 이전 앱에서 다른 앱 구성 목록을 찾고 새 앱에서도 설정합니다.
이 스크립트에서 원래 앱의 각 구성 항목에 대한 값을 설정하고 설정되지 않은 구성에 대한 명령을 주석으로 처리합니다(null).
appName=<APP_NAME>
rgName=<RESOURCE_GROUP>
http20Setting=<YOUR_HTTP_20_SETTING>
minTlsVersion=<YOUR_TLS_VERSION>
minTlsCipher=<YOUR_TLS_CIPHER>
httpsOnly=<YOUR_HTTPS_ONLY_SETTING>
certEnabled=<CLIENT_CERT_ENABLED>
certMode=<YOUR_CLIENT_CERT_MODE>
certExPaths=<CERT_EXCLUSION_PATHS>
scmAllowBasicAuth=<ALLOW_SCM_BASIC_AUTH>
# Apply HTTP version and minimum TLS settings
az functionapp config set --name $appName --resource-group $rgName --http20-enabled $http20Setting
az functionapp config set --name $appName --resource-group $rgName --min-tls-version $minTlsVersion
# Apply the HTTPS-only setting
az functionapp update --name $appName --resource-group $rgName --set HttpsOnly=$httpsOnly
# Apply incoming client cert settings
az functionapp update --name $appName --resource-group $rgName --set clientCertEnabled=$certEnabled
az functionapp update --name $appName --resource-group $rgName --set clientCertMode=$certMode
az functionapp update --name $appName --resource-group $rgName --set clientCertExclusionPaths=$certExPaths
# Apply the TLS cipher suite setting
az functionapp update --name $appName --resource-group $rgName --set minTlsCipherSuite=$minTlsCipher
# Apply the allow scm basic auth configuration
az resource update --resource-group $rgName --name scm --namespace Microsoft.Web --resource-type basicPublishingCredentialsPolicies \
--parent sites/$appName --set properties.allow=$scmAllowBasicAuth
이 예에서는 <RESOURCE_GROUP>과 <APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요. 그리고 새 앱에서 다시 만들려는 기존 설정의 변수 정의에 있는 자리 표시자를 바꾸고, null 설정을 주석 처리합니다.
크기 조정 및 동시성 설정 구성
Flex Consumption 계획은 앱 내의 각 함수가 워크로드에 따라 독립적으로 확장할 수 있는 함수별 크기 조정을 구현합니다. 또한 크기 조정은 현재 동시 실행을 기반으로 크기 조정 결정을 내리는 데 사용되는 동시성 설정과 더 엄격하게 관련됩니다. 자세한 내용은 Flex 소비 계획 관련 문서에서 함수별 크기 조정과 동시성을 모두 참조하세요.
새 앱이 원래 앱과 비슷하게 확장되도록 하려면 먼저 동시성 설정을 고려합니다. 동시성 값을 높게 설정하면 동일한 부하를 처리하기 위해 더 적은 인스턴스가 만들어질 수 있습니다.
원래 앱에 사용자 지정 스케일 아웃 제한이 설정된 경우 새 앱에 적용할 수도 있습니다. 그렇지 않으면 다음 섹션으로 건너뛸 수 있습니다.
기본 최대 인스턴스 수는 100이며 40 이상 값으로 설정해야 합니다.
이 az functionapp scale config set 명령을 사용하여 최대 스케일 아웃을 설정합니다.
az functionapp scale config set --name <APP_NAME> --resource-group <RESOURCE_GROUP> \
--maximum-instance-count <MAX_SCALE_SETTING>
이 예에서는 <RESOURCE_GROUP>과 <APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요.
<MAX_SCALE_SETTING>을(를) 설정하려는 최대 배율 값으로 바꾸세요.
사용자 지정 도메인 및 CORS 액세스 구성
원래 앱에 바인딩된 사용자 지정 도메인 또는 CORS 설정이 정의된 경우 새 앱에서 다시 만듭니다. 사용자 지정 도메인에 대한 자세한 내용은 Azure App Service에서 기존 사용자 지정 도메인 설정을 참조하세요.
이
az functionapp config hostname add명령을 사용하여 사용자 지정 도메인 매핑을 앱에 다시 바인딩합니다.az functionapp config hostname add --name <APP_NAME> --resource-group <RESOURCE_GROUP> \ --hostname <CUSTOM_DOMAIN>이 예에서는
<RESOURCE_GROUP>과<APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요. 사용자 지정 도메인 이름으로 대체<CUSTOM_DOMAIN>합니다.CORS 설정을 바꾸려면 다음
az functionapp cors add명령을 사용합니다.az functionapp cors add --name <APP_NAME> --resource-group <RESOURCE_GROUP> \ --allowed-origins <ALLOWED_ORIGIN_1> <ALLOWED_ORIGIN_2> <ALLOWED_ORIGIN_N>이 예에서는
<RESOURCE_GROUP>과<APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요. 허용된 출처로<ALLOWED_ORIGIN_*>를 대체하십시오.
관리 ID 구성 및 역할 할당
새 앱에서 관리 ID를 구성하는 방법은 관리 ID의 종류에 따라 달라집니다.
| 관리 ID 유형 | ID 만들기 | 역할 할당 |
|---|---|---|
| 사용자 할당 | 선택적 | 새 앱에서 동일한 사용자 할당 관리 ID를 계속 사용할 수 있습니다. 이러한 ID를 Flex Consumption 앱에 다시 할당하고 원격 서비스에서 올바른 역할 할당이 여전히 있는지 확인해야 합니다. 새 앱에 대한 새 ID를 만들도록 선택하는 경우 기존 ID와 동일한 역할을 할당해야 합니다. |
| 시스템에 의해 할당됨 | 예 | 각 함수 앱에는 고유한 시스템 할당 관리 ID가 있으므로 새 앱에서 시스템 할당 관리 ID를 사용하도록 설정하고 원래 앱과 동일한 역할을 다시 할당해야 합니다. |
역할 할당을 올바르게 다시 만드는 것은 마이그레이션 후 함수 앱이 Azure 리소스에 동일한 액세스 권한을 가지도록 하는 데 중요합니다.
팁 (조언)
원래 앱에서 인증에 연결 문자열 또는 기타 공유 비밀을 사용한 경우 관리 ID에서 Microsoft Entra ID 인증을 사용하도록 전환하여 앱의 보안을 개선할 수 있는 좋은 기회입니다. 자세한 내용은 자습서: 비밀 대신 ID를 사용하여 Azure 서비스에 연결하는 함수 앱 만들기를 참조하세요.
이
az functionapp identity assign명령을 사용하여 새 앱에서 시스템 할당 관리 ID를 사용하도록 설정합니다.az functionapp identity assign --name <APP_NAME> --resource-group <RESOURCE_GROUP>이 예에서는
<RESOURCE_GROUP>과<APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요.이 스크립트를 사용하여 시스템 할당된 개체 ID의 주체 ID를 획득하여 필요한 역할에 추가하도록 합니다.
# Get the principal ID of the system identity principalId=$(az functionapp identity show --name <APP_NAME> --resource-group <RESOURCE_GROUP> \ --query principalId -o tsv) # Assign a role in a specific resource (scope) to the system identity az role assignment create --assignee $principalId --role "<ROLE_NAME>" --scope "<RESOURCE_ID>"이 예에서는
<RESOURCE_GROUP>과<APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요.<ROLE_NAME>및<RESOURCE_ID>을 원래 앱에서 캡처한 역할 이름 및 특정 리소스로 대체합니다.새 앱에 필요한 각 역할에 대해 이전 명령을 반복합니다.
네트워크 액세스 제한 구성
원래 앱에 IP 기반 인바운드 액세스 제한이 있는 경우 새 앱에 유지하려는 것과 동일한 인바운드 액세스 규칙을 다시 만들 수 있습니다.
팁 (조언)
Flex 소비 계획은 가상 네트워크 통합을 완벽하게 지원합니다. 이 때문에 마이그레이션 후 인바운드 프라이빗 엔드포인트를 사용하는 옵션도 있습니다. 자세한 내용은 프라이빗 엔드포인트를 참조하세요.
새 앱에서 복제하려는 각 IP 액세스 제한에 대해 다음 az functionapp config access-restriction add 명령을 사용합니다.
az functionapp config access-restriction add --name <APP_NAME> --resource-group <RESOURCE_GROUP> \
--rule-name <RULE_NAME> --action Deny --ip-address <IP_ADDRESS> --priority <PRIORITY>
이 예제에서는 이러한 자리 표시자를 원래 앱의 값으로 바꿉다.
| 플레이스홀더 | 가치 |
|---|---|
<APP_NAME> |
함수 앱 이름입니다. |
<RESOURCE_GROUP> |
귀하의 리소스 그룹입니다. |
<RULE_NAME> |
IP 규칙의 친숙한 이름입니다. |
<Priority> |
제외 우선 순위입니다. |
<IP_Address> |
제외할 IP 주소입니다. |
원래 앱에서 문서화된 각 IP 제한에 대해 이 명령을 실행합니다.
모니터링 활성화
Flex Consumption 계획에서 새 앱을 시작하기 전에 Application Insights가 사용하도록 설정되어 있는지 확인합니다. Application Insights를 구성하면 코드 배포 및 시작 중에 발생할 수 있는 문제를 해결하는 데 도움이 됩니다.
앱 메트릭, 로그 및 비용을 포괄하는 포괄적인 모니터링 전략을 구현합니다. 이러한 전략을 사용하면 마이그레이션 성공의 유효성을 검사하고, 문제를 즉시 식별하고, 새 앱의 성능과 비용을 최적화할 수 있습니다.
이 새 앱을 현재 앱과 비교하려는 경우 스키마가 비교에 필요한 벤치마크도 수집해야 합니다. 자세한 내용은 모니터링 구성을 참조하세요.
기본 제공 인증 구성
원래 앱에서 기본 제공 클라이언트 인증(간편 인증이라고도 함)을 사용한 경우 새 앱에서 다시 만들어야 합니다. 동일한 클라이언트 등록을 다시 사용하려는 경우 인증 공급자에서 새 앱의 인증된 엔드포인트를 설정해야 합니다.
이전에 수집한 정보에 따라 이 명령을 사용하여 az webapp auth update 앱에 필요한 각 기본 제공 인증 등록을 다시 만듭니다.
새 Flex Consumption 앱에 앱 코드 배포
원래 앱의 설정에 따라 완전히 구성된 새 Flex Consumption 계획 앱을 사용하면 Azure의 새 앱 리소스에 코드를 배포할 차례입니다.
주의
배포에 성공하면 새 앱의 트리거가 연결된 서비스의 데이터 처리를 즉시 시작합니다. 중복된 데이터를 최소화하고 새 앱을 시작하고 원래 앱을 종료하는 동안 데이터 손실을 방지하려면 트리거 유형별로 완화에 정의한 전략을 검토해야 합니다.
Functions는 코드 프로젝트에서 또는 즉시 실행 가능한 배포 패키지로 코드를 배포하는 여러 가지 방법을 제공합니다.
팁 (조언)
프로젝트 코드가 소스 코드 리포지토리에서 유지 관리되는 경우 이제 지속적인 배포 파이프라인을 구성하기에 완벽한 시기입니다. 지속적인 배포를 사용하면 연결된 리포지토리의 변경 내용에 따라 애플리케이션 업데이트를 자동으로 배포할 수 있습니다.
새 앱에 소스 코드를 배포하도록 기존 배포 워크플로를 업데이트해야 합니다.
새 앱에 대한 새 연속 배포 워크플로를 만들 수도 있습니다. 자세한 내용은 Azure Functions에 대한 지속적인 배포를 참조하세요.
마이그레이션 후 작업
마이그레이션에 성공하면 다음 후속 작업을 수행해야 합니다.
기본 기능 확인
새 앱이 Flex 소비 계획에서 실행되고 있는지 확인합니다.
다음
az functionapp show명령을 사용하여 호스팅 계획에 대한 세부 정보를 확인합니다.az functionapp show --name <APP_NAME> --resource-group <RESOURCE_GROUP> --query "serverFarmId"이 예에서는
<RESOURCE_GROUP>과<APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요.HTTP 클라이언트를 사용하여 새 앱에서 하나 이상의 HTTP 트리거 엔드포인트를 호출하여 예상대로 응답하는지 확인합니다.
성능 벤치마크 캡처
새 앱이 실행되면 다음과 같이 원래 앱에서 수집한 것과 동일한 성능 벤치마크를 실행할 수 있습니다.
| 제안된 벤치마크 | 주석 |
|---|---|
| 콜드 스타트 | 유휴 기간 후 첫 번째 요청에서 첫 번째 응답까지의 시간을 측정합니다. |
| 처리량 | 부하 테스트 도구를 사용하여 초당 최대 요청 수를 측정하여 앱이 동시 요청을 처리하는 방법을 결정합니다. |
| 대기 시간 |
P50다양한 부하 조건에서 , P95및 P99 응답 시간을 추적합니다. Application Insights에서 이러한 메트릭을 모니터링할 수 있습니다. |
이 Kusto 쿼리를 사용하여 Application Insights에서 제안된 대기 시간 응답 시간을 검토할 수 있습니다.
requests
| where timestamp > ago(1d)
| summarize percentiles(duration, 50, 95, 99) by bin(timestamp, 1h)
| render timechart
비고
Flex 소비 계획의 메트릭은 소비 계획의 메트릭과 다릅니다. 마이그레이션 전후의 성능을 비교할 때는 서로 다른 메트릭을 사용하여 유사한 성능 특성을 추적해야 합니다. 자세한 내용은 모니터링 구성을 참조하세요.
사용자 지정 대시보드 만들기
Azure Monitor 메트릭 및 Application Insights를 사용하면 Azure Portal에서 플랫폼 메트릭과 런타임 로그 및 분석의 차트를 표시하는 대시보드를 만들 수 있습니다.
Azure Portal에서 주요 메트릭에 대한 대시보드 및 경고를 설정하는 것이 좋습니다. 자세한 내용은 Azure에서 앱 모니터링을 참조하세요.
계획 설정 구체화
실제 성능 향상 및 마이그레이션의 비용 영향은 앱별 워크로드 및 구성에 따라 달라질 수 있습니다. Flex 소비 계획은 앱의 성능을 구체화하기 위해 조정할 수 있는 몇 가지 설정을 제공합니다. 원래 앱의 동작과 더 밀접하게 일치하거나 비용과 성능의 균형을 맞추기 위해 조정할 수 있습니다. 자세한 내용은 Flex Consumption 문서에서 앱 미세 조정 을 참조하세요.
원래 앱 제거(선택 사항)
새 Flex Consumption 함수 앱을 철저히 테스트하고 모든 것이 예상대로 작동하는지 유효성을 검사한 후에는 불필요한 비용을 방지하기 위해 리소스를 정리할 수 있습니다. 원래 앱의 트리거는 이미 사용하지 않도록 설정되어 있을 수 있지만, 원래 앱을 완전히 제거하기까지 며칠 또는 몇 주를 기다릴 수 있습니다. 애플리케이션의 사용 패턴에 따라 달라지는 이 지연은 드문 시나리오를 비롯한 모든 시나리오가 제대로 테스트되도록 합니다. 마이그레이션 결과에 만족한 후에만 원래 함수 앱을 제거해야 합니다.
중요합니다
이 작업은 원래 함수 앱을 삭제합니다. 다른 앱에서 사용 중인 경우 소비 계획은 그대로 유지됩니다. 계속하기 전에 모든 기능을 새 Flex Consumption 앱으로 성공적으로 마이그레이션하고, 원래 앱으로 전송되는 트래픽이 없는지 확인하고, 참조에 필요할 수 있는 관련 로그, 구성 또는 데이터를 백업했는지 확인합니다.
명령을 az functionapp delete 사용하여 원래 함수 앱을 삭제합니다.
az functionapp delete --name <ORIGINAL_APP_NAME> --resource-group <RESOURCE_GROUP>
이 예에서는 <RESOURCE_GROUP>과 <APP_NAME>을 각각 리소스 그룹 및 함수 앱 이름으로 바꾸세요.
문제 해결 및 복구 전략
신중한 계획에도 불구하고 마이그레이션 문제가 발생할 수 있습니다. 마이그레이션 중에 잠재적인 문제를 처리하는 방법은 다음과 같습니다.
| 문제 | 해결 방법 |
|---|---|
| 콜드 스타트 성능 문제 | • 동시성 설정 검토 • 누락된 종속성 확인 |
| 바인딩 누락 | • 확장 번들 확인 • 바인딩 구성 업데이트 |
| 권한 오류 | • ID 할당 및 역할 권한 확인 |
| 네트워크 연결 문제 | • 액세스 제한 및 네트워킹 설정 유효성 검사 |
| 누락된 애플리케이션 인사이트 | • Application Insights 연결 다시 만들기 |
| 앱을 시작하지 못함 | 일반 문제 해결 단계 참조 |
| 트리거가 이벤트를 처리하지 않음 | 일반 문제 해결 단계 참조 |
프로덕션 앱을 마이그레이션하는 데 문제가 발생하는 경우 문제를 해결하는 동안 마이그레이션을 원래 앱으로 롤백할 수 있습니다.
일반적인 문제 해결 단계
새 앱이 시작되지 않거나 함수 트리거가 이벤트를 처리하지 않는 경우 다음 단계를 사용합니다.
Azure Portal의 새 앱 페이지에서 앱 페이지의 왼쪽 창에서 진단 및 문제 해결을 선택합니다. 가용성 및 성능을 선택하고 함수 앱 다운 또는 보고 오류 탐지기를 검토 합니다. 자세한 내용은 Azure Functions 진단 개요를 참조하세요.
앱 페이지에서 모니터링>Application Insights>Application Insights 데이터 보기를 선택한 다음 조사>오류를 선택하고 오류 이벤트를 확인합니다.
모니터링> 선택하고 이 Kusto 쿼리를 실행하여 이러한 테이블에 오류가 있는지 확인합니다.
traces | where severityLevel == 3 | where cloud_RoleName == "<APP_NAME>" | where timestamp > ago(1d) | project timestamp, message, operation_Name, customDimensions | order by timestamp desc이 쿼리에서는
<APP_NAME>를 당신의 새 앱 이름으로 교체하십시오. 이러한 쿼리는 지난 날(where timestamp > ago(1d))의 오류를 확인합니다.앱 페이지로 돌아가 서 설정>환경 변수를 선택하고 모든 중요한 애플리케이션 설정이 올바르게 전송되었는지 확인합니다. 잘못 마이그레이션되었을 수 있는 사용되지 않는 설정 이나 오타 또는 잘못된 연결 문자열을 찾습니다. 기본 호스트 스토리지 연결을 확인합니다.
설정>ID를 선택하고 필요한 ID가 있는지와 올바른 역할에 할당되었는지 다시 확인합니다.
코드에서 모든 바인딩 구성이 올바른지 확인하여 Event Hubs 트리거의 연결 문자열 이름, 스토리지 큐 및 컨테이너 이름 및 소비자 그룹 설정에 특히 주의를 기울입니다.
중요한 프로덕션 앱에 대한 롤백 단계
문제를 성공적으로 해결할 수 없는 경우 문제 해결을 계속하는 동안 원래 앱 사용으로 되돌릴 수 있습니다.
원래 앱이 중지된 경우 다시 시작합니다.
이
az functionapp start명령을 사용하여 원래 함수 앱을 다시 시작합니다.az functionapp delete --name <ORIGINAL_APP_NAME> --resource-group <RESOURCE_GROUP>새 큐/토픽/컨테이너를 만든 경우 클라이언트가 원래 리소스로 다시 리디렉션되는지 확인합니다.
DNS 또는 사용자 지정 도메인을 수정한 경우 이러한 변경 내용을 원래 앱을 가리키도록 되돌려 줍니다.
사용자 의견 제공
이 문서를 사용하여 마이그레이션에 문제가 발생하거나 이 지침에 대한 다른 피드백을 제공하려는 경우 다음 방법 중 하나를 사용하여 도움을 받거나 피드백을 제공합니다.
-
Microsoft Q&A에서 도움말 보기
-Azure Functions 리포지토리에서 문제 만들기
-
제품 피드백 제공
-
지원 티켓 만들기