Visual Studio를 사용하여 Azure Container Apps 에 다중 컨테이너 앱을 배포할 수 있습니다. 일반적으로 각 컨테이너를 별도의 컨테이너 앱 인스턴스에 배포하지만, 쉽고 안전하게 서로 통신할 수 있도록 동일한 컨테이너 앱 환경에 모든 앱의 컨테이너를 포함합니다. 컨테이너 환경 내에서 요청을 수락하거나 외부 트래픽을 허용하도록 각 컨테이너 앱을 구성할 수 있습니다. Azure Container Apps는 매우 유연하고 구성 가능하므로 가능한 많은 마이크로 서비스 시나리오와 전체 고급 모니터링 도구 집합을 사용할 수 있습니다. Docker Compose를 사용하여 온-프레미스 컨테이너 앱을 관리하는 경우 Azure의 컨테이너 앱 환경으로 포팅하는 것이 좋습니다.
이 프로세스에는 Visual Studio 및 Azure Portal을 사용하는 몇 가지 단계가 포함됩니다. Azure CLI를 사용하여 이러한 작업을 수행할 수도 있지만 이 자습서의 범위를 벗어납니다. 먼저 다중 컨테이너 앱 만들기를 사용하여 빌드한 앱을 사용하고 게시 프로세스를 사용하여 배포합니다. Visual Studio에서는 첫 번째 컨테이너 앱, 컨테이너 앱 환경을 만들고 컨테이너 이미지를 저장할 컨테이너 레지스트리를 만드는 단계를 안내합니다. 그런 다음 다른 컨테이너 앱을 사용하여 게시 프로세스를 다시 실행합니다. 특히 게시 프로세스에서 동일한 컨테이너 앱 환경을 선택해야 합니다. 마지막으로 Azure Redis Cache 서비스에서 작동하도록 Redis 캐시를 구성해야 합니다. 캐시 구성 코드를 수정하고 Web API를 다시 게시합니다. 그런 다음, 앱의 시스템 할당 관리 ID 액세스 권한을 캐시에 부여하도록 권한을 구성합니다.
필수 조건
- Azure 구독. 무료 평가판에 등록합니다.
- Azure 개발 및 ASP.NET 및 웹 개발 워크로드가 설치된 Visual Studio.
-
https://github.com/MicrosoftDocs/vs-tutorial-samples폴더의 MulticontainerSample 프로젝트 입니다. 샘플 솔루션에는 다른 자습서에서 만든 Web API 백 엔드와 ASP.NET Razor 프런트 엔드라는 두 개의 프로젝트가 포함되어 있습니다. 이 자습서에 따라 기본 템플릿을 매우 간단하게 수정하기 때문에 두 프로젝트를 처음부터 만들 수도 있습니다. Docker Compose 단계를 건너뛸 수 있습니다.
필수 조건
- Azure 구독. 무료 평가판에 등록합니다.
- Azure 개발 및 ASP.NET 및 웹 개발 워크로드가 설치된 Visual Studio 이상.
-
https://github.com/MicrosoftDocs/vs-tutorial-samples폴더의 MulticontainerSample 프로젝트 입니다. 샘플 솔루션에는 다른 자습서에서 만든 Web API 백 엔드와 ASP.NET Razor 프런트 엔드라는 두 개의 프로젝트가 포함되어 있습니다. 이 자습서에 따라 기본 템플릿을 매우 간단하게 수정하기 때문에 두 프로젝트를 처음부터 만들 수도 있습니다. Docker Compose 단계를 건너뛸 수 있습니다.
Web API 백 엔드 배포
솔루션 탐색기에서 Web API 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.
대상 Azure를 선택한 다음, Azure Container Apps를 선택합니다.
Azure 구독과 연결된 계정으로 아직 로그인하지 않은 경우 지금 로그인하거나 필요한 경우 테넌트를 변경할 수 있습니다.
컨테이너 앱을 지정하는 화면에서 새로 만들기 를 선택하여 새 컨테이너 앱을 만듭니다.
Azure Container 앱 만들기 페이지에서 리소스 그룹과 같은 세부 정보를 입력합니다. 이 단계에서는 새 리소스 그룹, 새 컨테이너 환경 및 새 컨테이너 레지스트리를 만듭니다.
리소스를 만드는 데 약간의 시간이 걸릴 수 있습니다. 완료되면 다음 을 클릭하여 다음 단계로 이동합니다.
다음 단계에서는 컨테이너 레지스트리를 만듭니다. 새 컨테이너 레지스트리를 만드는 경우 몇 가지 세부 정보를 묻는 메시지가 표시됩니다. 컨테이너 앱과 동일한 지역 및 리소스 그룹을 선택할 수 있습니다.
다음 단계에서는 컨테이너 빌드 유형을 선택하도록 요청합니다. Dockerfile이 없는 경우 .NET SDK 를 선택하거나 Docker Desktop 을 선택합니다.
배포 유형에 대해 게시(pubxml 파일 생성) 를 선택하여 게시 프로필을 만듭니다.
마침을 선택하여 게시 프로세스를 완료하고 게시 프로필을 만듭니다. 게시된 컨테이너에 액세스하기 위한 추가 구성에 대한 프롬프트가 표시되면 예를 선택합니다.
Azure에서 활동을 보여 주는 페이지가 표시되고, 닫으면 이제 웹 API 수신 URL과 같은 컨테이너 앱의 정보가 게시 화면에 표시됩니다.
게시 단추를 클릭하여 Azure 컨테이너 앱에 게시합니다. Visual Studio는 Azure 리소스를 만들 것을 요청하고 WebAPI 컨테이너 앱에 대한 게시 프로세스를 시작합니다.
Visual Studio에서 새 컨테이너 앱에 대한 페이지를 로드하려고 시도할 수 있지만 이 단계에서는 작동하지 않을 것입니다.
이제 한 번 게시했으므로 게시 프로필(.pubxml 파일)을 만들었으므로 다음에 게시할 때 이러한 단계를 반복할 필요가 없습니다. 다시 시작하거나 지정한 Azure 리소스를 변경하지 않으려면 이 화면에서 게시 단추를 클릭하기만 하면 됩니다.
나중에 Azure 포털을 사용하여 인그레스에 대한 몇 가지 추가 설정을 변경하고 Azure Redis Cache를 지원하도록 구성합니다. 그러나 먼저 다음 섹션에서 웹 프런트 엔드를 배포합니다.
프런트 엔드 배포
Index.cshtml.cs 프런트 엔드 코드 파일을 수정하여 Web API 컨테이너 앱의 새 URL을 참조합니다. Web API 게시 화면의 리소스 이름 아래에 표시되는 이름입니다. 컨테이너 간 통신의 경우 FQDN(정규화된 도메인 이름) 및 포트 번호를 지정하지 않고 컨테이너 앱의 이름으로 HTTP를 직접 사용할 수 있습니다.
OnGet메서드에서, 다음 코드와 같이 Web API 컨테이너 앱 이름을 참조하도록RequestUri을 설정하는 기존 줄을 교체하십시오.request.RequestUri = new Uri("http://<mywebapi-container-app-name>/Counter");솔루션 탐색기에서 Webfrontend 프로젝트의 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다. 다음 화면에서 새로 만들기 를 선택하여 새 컨테이너 앱을 만듭니다.
새 Azure 컨테이너 앱 만들기 화면에서 Web API 프로젝트를 게시할 때 만든 것과 동일한 리소스 그룹 및 동일한 컨테이너 환경을 선택합니다.
중요! 이전에 만든 것과 동일한 컨테이너 레지스트리를 선택합니다.
다른 단계에서 Web API에 대해 수행한 것과 동일한 옵션을 선택합니다. 컨테이너 빌드 유형은 Docker Desktop이고 배포 유형은 Publish(pubxml 파일 생성)입니다.
마침을 선택하여 게시 프로세스를 완료하고 게시 프로필을 만듭니다. Azure에서 활동을 보여 주는 페이지가 표시되고, 닫으면 게시 화면에 Webfrontend 앱 수신 URL과 같은 컨테이너 앱의 정보가 표시됩니다.
Azure Portal에서 컨테이너 앱 보기 및 구성
- Azure Portal에 로그인합니다.
- 컨테이너 앱을 검색하고 방금 만든 앱을 찾습니다.
-
인그레스를 선택하고 다음 옵션을 구성합니다.
수신 화면에서 수신 트래픽을 Container Apps 환경으로 제한합니다. 즉, Webfrontend만 요청을 보낼 수 있습니다. Visual Studio에서도 이 서비스에 액세스할 수 없습니다. 예를 들어 게시 프로세스를 완료하고 Visual Studio에서 페이지를 로드하려고 하면 서비스에 액세스하는 대신 브라우저에서 오류가 발생합니다. 예상된 일입니다.
수신 포트를 확인합니다(8080이어야 합니다). 웹 API 호출에 HTTP를 사용하고 있으며 요청 URI에서 이름으로 컨테이너 앱을 직접 참조할 수 있습니다. Azure Container Apps에서 생성된 FQDN(정규화된 도메인 이름)은 게시 화면의 Visual Studio에 표시된 것처럼 HTTPS URL을 사용하지만 내부 트래픽은 이를 무시할 수 있습니다.
웹 프론트엔드 인그레스의 경우 기본값을 적용할 수 있습니다. 인그레스는 FQDN 및 HTTPS(또는 HTTP를 HTTPS로 리디렉션)을 사용하여 모든 요청을 안전하게 처리하고, HTTP로 컨테이너 포트 8080의 웹 프런트엔드로 전달하기 때문에 목표 포트는 8080입니다.
Azure Redis Cache 만들기
다음 단계에 따라 컨테이너 앱과 동일한 리소스 그룹에 Azure Redis Cache를 만듭니다.
Azure Portal에서 이전에 만든 Web API 컨테이너 앱을 엽니다. 서비스 커넥터 화면을 열고 만들기를 선택합니다. 연결 만들기 섹션이 나타납니다.
연결 만들기 화면에서 서비스 유형을Cache for Redis로 입력하고 새로 만들기를 선택하여 새 Redis 캐시를 만듭니다.
캐시를 선택하거나 새 만들기 링크를 따라 캐시를 만듭니다. 새 캐시를 만드는 경우 컨테이너 앱 및 서비스 커넥터로 돌아가서 이전 단계를 반복하여 연결을 만들어야 할 수 있습니다.
데이터베이스의 경우 "0"을 선택하여 이 캐시에 대한 첫 번째 번호가 매겨진 데이터베이스를 만듭니다.
인증 탭으로 이동합니다. 시스템 할당 관리 ID를 선택합니다. 다른 모든 기본값을 적용하고 만들기를 선택합니다. 그러면 캐시에 대한 연결이 만들어집니다.
Web API 컨테이너 앱의 Service Connector 섹션으로 돌아가 새로 고쳐 새로 연결한 캐시(아직 표시되지 않은 경우)를 확인하고 캐시 옆에 있는 확인란을 선택합니다. 유효성 검사를 선택하여 연결 상태를 확인합니다. 캐시 노드를 확장하여 해당 Azure 캐시에 대한 환경 변수의 값을 볼 수 있습니다. 이 자습서에서는 AZURE_REDIS_HOST 필요하지만 실제 코드에서 또는 보다 완전한 구성을 위해 다른 항목을 사용할 수 있습니다. Web API가 캐시에 연결할 수 있도록 다음 섹션에 설명된 대로 여기 값을 사용하여 Dockerfile에서 환경 변수를 설정합니다.
자세한 내용은 빠른 시작: Azure Portal에서 Azure Container Apps에 대한 서비스 연결 만들기를 참조하세요.
관리 ID에 대한 역할 구성
Azure Portal에서 Azure Redis Cache의 IAM(Access Control) 을 사용하여 컨테이너 앱의 시스템 할당 관리 ID에 대한 기여자 액세스 권한을 부여합니다.
- Azure Portal에서 Azure Redis Cache에 대한 페이지를 열고 IAM(Access Control)을 선택합니다.
- 추가>역할 할당 추가를 선택합니다. 역할 할당 추가 페이지가 열립니다.
- 구성원 탭을 선택하고 관리 ID를 선택합니다.
- 멤버 선택을 선택합니다. 구성원 선택 페이지가 열리고 시스템 할당 관리 ID를 선택합니다.
- 컨테이너 앱을 선택하고 Web API 컨테이너 앱을 선택합니다.
- 역할 탭에서 Redis Cache 기여자를 선택합니다.
- 검토 및 할당을 선택합니다. 시스템에서 요청을 처리합니다.
- 역할 할당을 열어 Redis Cache 기여자 역할에서 시스템 할당 관리 ID를 확인합니다.
다음 단계는 시스템 할당 관리 ID를 사용할 때 인증하는 권장되는 방법인 웹 API 클라이언트에서 캐시 구성을 사용하여 DefaultAzureCredential수정하는 것입니다. 외부에서 애플리케이션에 액세스하는 모든 사용자는 이 형식의 ID 관리를 통해 리소스에 액세스하기 위해 특정 사용자 수준 역할 할당이 필요하지 않습니다. 자세한 내용은 Azure Redis Cache 통합 - 시스템 할당 관리 ID를 참조하세요.
Azure Redis Cache 서비스를 참조하도록 Web API 프로젝트 수정
Azure에서 실행할 Web API 프로젝트를 게시하기 전에 Azure Redis Cache를 참조하고 관리 ID를 사용하여 안전하게 액세스하도록 업데이트합니다. 이를 수용하기 위해 Program.cs 캐시 구성 코드를 수정할 수 있습니다.
Azure Redis Cache의 경우 연결 정보를 사용하여 환경 변수 AZURE_REDIS_HOST 를 설정한 다음 시작 코드에서 읽어 Azure Redis Cache에 연결하고 캐시를 구성합니다.
Azure.Identity를 사용하여 관리 ID로 보안 인증을 처리하는 DefaultAzureCredential을 가져옵니다.
Visual Studio의 Web API 프로젝트에서 NuGet 패키지 및
Azure Identity에 대한 참조를 추가합니다Microsoft.Azure.StackExchange.Redis.방금 추가한 패키지에 using 지시문을 추가하십시오.
using Azure.Identity; using Microsoft.Azure.StackExchange.Redis;Redis Cache에 대한 구성 코드를 업데이트합니다. 이전 코드를 삭제하고 다음 코드로 바꿉다. 나중에 주석을 검토하고 사용자 고유의 고급 시나리오에 맞게 선택적 코드의 주석 처리를 제거할 수 있습니다.
// Check the environment variable for the Redis cache host name var cacheHostName = Environment.GetEnvironmentVariable("AZURE_REDIS_HOST"); if (string.IsNullOrEmpty(cacheHostName)) { throw new InvalidOperationException("The environment variable 'AZURE_REDIS_HOST' is not set."); } var configurationOptions = ConfigurationOptions.Parse($"{cacheHostName}:6380"); // For system-assigned identity. // In the Azure portal, we need to set up Redis service to grant Contributor access to the system-assigned identity // for the container app that hosts this Web API service. await configurationOptions.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential()); var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions); builder.Services.AddStackExchangeRedisCache(options => { options.ConfigurationOptions = configurationOptions; options.InstanceName = "SampleInstance"; }); // Uncomment the following line if you need to use the ConnectionMultiplexer directly // (for example, for advanced Redis operations like Pub/Sub or working with Redis data structures). // builder.Services.AddSingleton<IConnectionMultiplexer>(sp => // ConnectionMultiplexer.Connect(configurationOptions));캐시 연결을 만들 때 이전에 설정한 인증 방법은 시스템 할당 관리 ID이므로 여기에 있는 코드는 해당 선택과 일치합니다. 다른 인증 방법도 사용하려면 여기에서 코드를 변경해야 합니다. Azure Redis Cache 통합 - 시스템 할당 관리 ID를 참조하세요.
Web API 프로젝트를 빌드하여 오류가 없는지 확인합니다.
Dockerfile이 있는 경우 Dockerfile의 기본 단계를 업데이트하여 환경 변수
AZURE_REDIS_HOST를 정의합니다. Azure Portal, Azure Redis Cache를 만들 때 또는 포털의 Web API 컨테이너 앱 페이지의 서비스 커넥터 섹션에서 호스트를 가져옵니다(이전 섹션 참조).ENV AZURE_REDIS_HOST mycache.redis.cache.windows.net(선택 사항) 환경 변수에서 다른 구성 옵션을 정의할 수 있습니다(예
AZURE_REDIS_PORT: 일반적으로 6380). 간단히 하기 위해 이 값은 환경 변수를 사용하는 대신 하드 코딩됩니다.ASPNETCORE_ENVIRONMENT을 개발로 설정하고 싶을 수도 있습니다.Dockerfile 없이 .NET SDK 컨테이너 빌드 형식을 사용하는 경우 아래
profiles > http의launchSettings.json환경 변수를 설정할 수 있습니다."http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "launchUrl": "swagger", "applicationUrl": "http://localhost:5107", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "AZURE_REDIS_HOST": "cache11.redis.cache.windows.net" } }이러한 변경 내용을 게시하고 확인할 준비가 완료되었습니다. 게시 화면에서 게시 단추를 선택합니다. Visual Studio는 페이지를 로드하려고 시도하지만 Web API 컨테이너 앱이 컨테이너 앱 환경 외부의 요청에 액세스할 수 없으므로 실패합니다.
Azure Redis Cache를 사용하여 애플리케이션을 실행하려면 캐시에 액세스할 수 있는 올바른 권한으로 관리 ID를 설정해야 합니다.
애플리케이션 테스트
Webfrontend 프로젝트의 게시 화면으로 돌아가서 Webfrontend URL의 링크를 클릭합니다. 페이지를 새로 고칠 때 업데이트되는 카운터와 함께 Webfrontend 앱이 표시됩니다.
팁 (조언)
Azure Container Apps는 서비스의 가동 시간을 최대화하려고 합니다. 상태 프로브에 실패하는 등 서비스 중 하나에 문제가 있을 경우 Azure Container Apps는 해당 서비스를 활성 수정 버전으로 설정하지 않으며, 요청 처리를 위해 사용하지 않습니다. 따라서 개발 및 테스트 프로세스 중에 최근에 변경한 내용이 라이브 사이트에 반영되지 않는 경우도 있습니다. Azure Portal에서 수정 버전 및 복제본을 선택하여 최근 게시된 수정 버전의 상태를 확인합니다. 여기에서 문제를 해결하는 데 도움이 되는 로그를 열 수 있습니다.
축하합니다! Azure Container Apps에 다중 컨테이너 앱을 성공적으로 게시하고 컨테이너 간의 통신과 앱 내에서 Azure Redis Cache 사용을 확인했습니다.
자원을 정리하세요
이 자습서에서 만든 리소스를 정리하려면 Azure Portal로 이동하여 컨테이너 앱, 캐시 및 컨테이너 레지스트리가 포함된 리소스 그룹을 삭제합니다.
다음 단계
- Azure Container Apps에 대해 자세히 알아봅니다.
- Azure의 다양한 리소스와 통합되는 복잡한 컨테이너화된 앱 및 서비스를 보다 쉽게 개발할 수 있는 기술인 .NET Aspire에 대해 알아봅니다. .NET Aspire는 개발 시간 오케스트레이션, 서비스 배열과의 표준화된 통합, Visual Studio 프로젝트 템플릿을 사용한 도구 지원을 지원합니다.
- Azure CLI(명령줄 인터페이스)를 사용하여 컨테이너 앱을 사용할 수도 있습니다. azcontainerapp up 명령을 사용하여 Azure Container Apps 배포에 따라 Azure CLI를 설치하고 Azure CLI 명령을 사용하여 Azure Container Apps 작업을 시작합니다.