Azure Container Apps Microsoft SQL(MSSQL) 스토리지 공급자 사용할 때 Durable Functions 대한 이벤트 기반 자동 크기 조정(0으로 확장)을 지원하는 유일한 호스팅 옵션입니다. 다른 스토리지 백 엔드를 사용하는 경우 최소 복제본 수를 0보다 크게 설정해야 합니다.
팁 (조언)
새 프로젝트의 경우 지속성 워크플로에 권장되는 Azure 관리 백 엔드인 ururable Task Scheduler를 사용하는 것이 좋습니다. 이 가이드에서는 MSSQL 백 엔드에 대해 구체적으로 설명합니다.
일반적으로 Container Apps에서 Azure Functions 실행하는 방법에 대한 자세한 내용은 Azure Container Apps Azure Functions 호스팅을 참조하세요.
이 문서에서는 다음 방법을 알아봅니다.
- 로컬 Durable Functions 프로젝트에서 Docker 이미지를 만듭니다.
- Azure Container App 및 관련 리소스를 만듭니다.
- Azure Container App에 이미지를 배포하고 인증을 설정합니다.
사전 요구 사항
- Visual Studio Code 설치되었습니다.
- .NET 8.0 SDK.
- Docker 및 Docker ID
- Azure CLI버전 2.47 이상.
- Azure Functions 핵심 도구
- 활성 구독이 있는 Azure 계정 무료로 계정을 만듭니다.
- 데이터를 안전하게 유지하는 HTTP 테스트 도구입니다. 자세한 내용은 HTTP 테스트 도구를 참조하세요.
로컬 Durable Functions 프로젝트 만들기
이 가이드에서는 MSSQL 백 엔드로 구성된 .NET 격리된 Durable Functions 작업 프로젝트가 있다고 가정합니다. 아직 없는 경우 MSSQL 빠른 시작 에 따라 로컬로 만들고 테스트한 다음, 여기로 돌아갑니다.
계속하기 전에 다음을 확인합니다.
- 프로젝트는 격리된 작업자 모델을 사용하여 .NET 8.0을 대상으로 합니다.
- MSSQL 스토리지 공급자는
host.json에 구성됩니다. - 앱이
func start을(를) 사용하여 성공적으로 실행됩니다.
Docker 관련 파일 추가
컨테이너에서 함수 앱을 실행하는 데 필요한 최소 환경을 설명하는 Dockerfile 을 프로젝트 루트에 만듭니다.
프로젝트 루트 디렉터리에서 Dockerfile이라는 새 파일을 만듭니다.
다음 콘텐츠를 복사하여 Dockerfile에 붙여넣습니다.
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env COPY . /src/dotnet-function-app RUN cd /src/dotnet-function-app && \ mkdir -p /home/site/wwwroot && \ dotnet publish *.csproj --output /home/site/wwwroot # To enable ssh & remote debugging on app service change the base image to the one below # FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0 ENV AzureWebJobsScriptRoot=/home/site/wwwroot \ AzureFunctionsJobHost__Logging__Console__IsEnabled=true COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]파일을 저장합니다.
다음 콘텐츠를 사용하여 .dockerignore 파일을 추가합니다.
local.settings.json.dockerignore 파일을 저장합니다.
컨테이너 이미지 빌드
Docker 이미지를 빌드합니다. Microsoft의 Azure Functions Base에서 Azure Functions에 대해 지원되는 기본 이미지의 전체 목록을 찾습니다. | Docker 허브
Docker 디먼을 시작합니다.
명령을 사용하여 Docker에 로그인합니다
docker login.메시지가 표시되면 사용자 이름 및 암호를 사용하여 로그인합니다. "로그인 성공" 메시지가 로그인되었음을 확인합니다.
프로젝트 루트 디렉터리로 이동합니다.
다음 명령어를 실행하여 이미지를 빌드하고,
<DOCKER_ID>을(를) Docker Hub 계정 ID로 바꾸십시오.dockerId=<DOCKER_ID> imageName=<IMAGE_NAME> imageVersion=v1.0.0 docker build --tag $dockerId/$imageName:$imageVersion .메모
M 시리즈 Mac에서 실행하는 경우 대신 사용합니다
--platform linux/amd64.Docker에 이미지를 푸시합니다.
docker push $dockerId/$imageName:$imageVersion네트워크 속도에 따라 초기 이미지 푸시에 몇 분 정도 걸릴 수 있습니다. 기다리는 동안 다음 섹션으로 진행합니다.
Container Apps에서 Durable Functions용 Azure 리소스 만들기
컨테이너 앱에서 Durable Functions를 실행하는 데 필요한 Azure 리소스를 만듭니다.
- Azure 리소스 그룹: 생성된 모든 리소스를 포함하는 리소스 그룹입니다.
- Azure Container App 환경: 컨테이너 앱을 호스트하는 환경입니다.
- Azure Container App: Durable Functions 앱을 포함하는 이미지가 이 앱에 배포됩니다.
- Azure Storage 계정: 애플리케이션 코드와 같은 앱 관련 데이터를 저장하려면 함수 앱에서 필요합니다.
초기 설정
새 터미널에서 Azure 구독에 로그인합니다.
az login az account set -s <subscription_name>필요한 명령을 실행하여 Azure Container Apps CLI 확장을 설정합니다.
az upgrade az extension add --name containerapp --upgrade az provider register --namespace Microsoft.App az provider register --namespace Microsoft.OperationalInsights
컨테이너 앱 및 관련 리소스 만들기
워크로드 프로필은 환경에 배포된 컨테이너 앱에 사용할 수 있는 컴퓨팅 및 메모리 리소스의 양을 결정합니다. 제로 스케일링 지원 및 사용량 기반 결제를 위한 소비 워크로드 프로필을 만드세요.
환경 변수를 설정합니다.
location=<REGION> resourceGroup=<RESOURCE_GROUP_NAME> storage=<STORAGE_NAME> containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME> functionApp=<APP_NAME> vnet=<VNET_NAME>리소스 그룹을 만듭니다.
az group create --name $resourceGroup --location $location컨테이너 앱 환경을 만듭니다.
az containerapp env create \ --enable-workload-profiles \ --resource-group $resourceGroup \ --name $containerAppEnv \ --location $location \Durable Functions 이미지를 기반으로 컨테이너 앱을 만듭니다.
az containerapp create --resource-group $resourceGroup \ --name $functionApp \ --environment $containerAppEnv \ --image $dockerId/$imageName:$imageVersion \ --ingress external \ --kind functionapp \ --query properties.outputs.fqdn앱 URL을 적어 두세요. 이 URL은 다음과 유사하게
https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io표시됩니다.
데이터베이스 만들기
함수 앱에 필요한 Azure Storage 계정을 만듭니다.
az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRSAzure Portal에서 상태 정보를 유지하는 Azure SQL 데이터베이스를 만듭니 다. 생성하는 동안:
- Azure 서비스 및 리소스를 사용하여 이 서버에 액세스할 수 있습니다(네트워크 아래). 프로덕션의 경우 더 강력한 방화벽 제한 또는 가상 네트워크 구성을 대신 사용합니다.
-
데이터베이스 데이터 정렬의 값(추가 설정 아래)을 으로
Latin1_General_100_BIN2_UTF8설정합니다.
ID 기반 인증 구성
관리 ID는 연결 문자열의 자격 증명과 같은 앱에서 비밀을 제거하여 앱을 더욱 안전하게 만듭니다. 시스템 할당 관리 ID와 사용자 할당 관리 ID 중에서 선택할 수 있지만 앱 수명 주기에 연결되지 않으므로 사용자 할당 관리 ID를 사용하는 것이 좋습니다.
이 섹션에서는 Azure Storage에 대해 사용자 할당 관리 ID 를 설정합니다.
환경 변수를 설정합니다.
subscription=<SUBSCRIPTION_ID> identity=<IDENTITY_NAME>관리 ID 리소스를 만듭니다.
echo "Creating $identity" az identity create -g $resourceGroup -n $identity --location "$location"컨테이너 앱에 사용자 ID를 할당합니다.
echo "Assigning $identity to app" az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identityRBAC(역할 기반 액세스 제어) 권한의 범위를 설정합니다.
scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"사용자 ID
clientId를 가져옵니다.# Get the identity's ClientId clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)스토리지 계정에 액세스할 수 있도록 Storage Blob Data Owner 역할을 할당합니다.
echo "Assign Storage Blob Data Owner role to identity" az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"
앱 설정 설정
메모
관리 ID를 사용하여 MSSQL 데이터베이스에 인증하는 것은 Azure Container Apps에서 Durable Functions 앱을 호스팅할 때 지원되지 않습니다. 지금은 이 가이드에서 연결 문자열을 사용하여 인증합니다.
Azure Portal의 SQL 데이터베이스 리소스에서 연결>설정 문자열 로 이동하여 연결 문자열을 찾습니다.
연결 문자열에는 다음과 유사한 형식이 있어야 합니다.
dbserver=<SQL_SERVER_NAME> sqlDB=<SQL_DB_NAME> username=<DB_USER_LOGIN> password=<DB_USER_PASSWORD> connStr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"이전 데이터베이스 만들기 단계에서 암호를 잊어버린 경우 SQL Server 리소스에서 암호를 다시 설정할 수 있습니다.
SQL 데이터베이스의 연결 문자열을 컨테이너 앱에 sqldbconnection이라는 비밀로 저장합니다.
az containerapp secret set \ --resource-group $resourceGroup \ --name $functionApp \ --secrets sqldbconnection=$connStr앱에 다음 설정을 추가합니다.
az containerapp update \ -n $functionApp \ -g $resourceGroup \ --set-env-vars SQLDB_Connection=secretref:sqldbconnection \ AzureWebJobsStorage__accountName=$storage \ AzureWebJobsStorage__clientId=$clientId \ AzureWebJobsStorage__credential=managedidentity \ FUNCTIONS_WORKER_RUNTIME=dotnet-isolated
배포된 Durable Functions 앱 테스트
HTTP 테스트 도구를 사용하여 HTTP 트리거 지점에 다음과 유사한 요청을 전송합니다
POST.https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStart응답은 지속성 함수 오케스트레이션이 성공적으로 시작되었음을 알려주는 HTTP 함수의 초기 결과입니다. 응답에는 몇 가지 유용한 URL이 포함되어 있지만 오케스트레이션의 최종 결과는 아직 표시되지 않습니다.
브라우저의 주소 표시줄에 대한
statusQueryGetUriURL 값을 복사/붙여넣고 실행합니다. 또는 HTTP 테스트 도구를 계속 사용하여GET요청을 발급할 수 있습니다.요청은 상태에 대한 오케스트레이션 인스턴스를 쿼리합니다. 인스턴스가 완료되고 Durable Functions 앱의 출력 또는 결과가 표시됩니다.
{ "name":"HelloCities", "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2", "runtimeStatus":"Completed", "input":null, "customStatus":null, "output":"Hello, Tokyo! Hello, London! Hello, Seattle!", "createdTime":"2023-01-31T18:48:49Z", "lastUpdatedTime":"2023-01-31T18:48:56Z" }
다음 단계
- Azure Container Apps에서 Azure Functions 호스팅
- MSSQL 스토리지 공급자 아키텍처, 구성 및 워크로드 동작
- 내구성 태스크 스케줄러 - 새 지속성 워크플로 프로젝트에 권장되는 Azure 관리형 백엔드
- Durable Functions 개요