IaC 도구를 사용하여 연결을 만드는 방법
서비스 커넥터를 사용하면 사용자가 몇 번의 클릭 또는 명령만으로 컴퓨팅 서비스를 대상 지원 서비스에 연결할 수 있습니다. 시작 단계에서 프로덕션 단계로 이동하는 경우 사용자는 수동 구성 사용에서 CI/CD 파이프라인의 IaC(Infrastructure as Code) 템플릿 사용으로 전환해야 합니다.
이 가이드에서는 연결된 Azure 서비스를 IaC 템플릿으로 변환하는 방법을 알아봅니다.
필수 조건
- 이 가이드에서는 서비스 커넥터 IaC 제한 사항을 알고 있다고 가정합니다.
솔루션 개요
인프라를 IaC 템플릿으로 변환하는 작업에는 일반적으로 원본 및 대상 서비스를 프로비전하는 논리와 연결을 빌드하는 논리라는 두 가지 주요 부분이 포함됩니다. 원본 및 대상 서비스를 프로비전하는 논리를 구현하는 데는 다음 두 가지 옵션이 있습니다.
- 템플릿을 처음부터 작성
- Azure에서 템플릿을 내보내고 다듬기
연결을 빌드하는 논리를 구현하는 데는 다음 세 가지 옵션이 있습니다.
- App Configuration에서 서비스 커넥터 및 저장소 구성 사용
- 템플릿에서 서비스 커넥터 사용
- 템플릿 논리를 사용하여 원본 및 대상 서비스를 직접 구성
이러한 다양한 옵션의 조합은 서로 다른 솔루션을 생성할 수 있습니다. 서비스 커넥터의 IaC 제한 사항으로 인해 아래에 제시된 순서대로 다음 솔루션을 구현하는 것이 좋습니다. 이러한 솔루션을 적용하려면 IaC 도구와 템플릿 작성 문법을 이해해야 합니다.
솔루션 | 원본 및 대상 프로비전 | 연결 빌드 | 적절한 시나리오 | 장점 | 단점 |
---|---|---|---|---|---|
1 | 처음부터 작성 | Service Connector를 사용하고 App Configuration에 구성 저장 | 라이브 트래픽을 허용하기 전에 클라우드 리소스에 대한 활동성 확인 | - 템플릿은 간단하고 읽을 수 있음 - 서비스 커넥터가 추가 값 제공 - Service Connector에서 IaC 문제가 발생하지 않음 |
- App Configuration에서 구성을 읽기 위한 추가 종속성 필요 - 클라우드 리소스의 활동성을 확인하는 비용 |
2 | 처음부터 작성 | 서비스 커넥터 사용 | 라이브 트래픽을 허용하기 전에 클라우드 리소스에 대한 활동성 확인 | - 템플릿은 간단하고 읽을 수 있음 - 서비스 커넥터가 추가 값 제공 |
- 클라우드 리소스의 활동성을 확인하는 비용 |
3 | 처음부터 작성 | 템플릿에서 직접 원본 및 대상 서비스 구성 | 클라우드 리소스에 대한 활동성 검사 없음 | - 템플릿은 간단하고 읽을 수 있음 | - 서비스 커넥터 기능을 사용할 수 없음 |
4 | 내보내기 및 다듬기 | Service Connector를 사용하고 App Configuration에 구성 저장 | 라이브 트래픽을 허용하기 전에 클라우드 리소스에 대한 활동성 확인 | - 리소스는 클라우드와 정확히 동일함 - 서비스 커넥터가 추가 값 제공 - Service Connector에서 IaC 문제가 발생하지 않음 |
- App Configuration에서 구성을 읽기 위한 추가 종속성 필요 - 클라우드 리소스의 활동성을 확인하는 비용 - ARM 템플릿만 지원 - 템플릿을 이해하고 연마하는 데 필요한 노력 |
5 | 내보내기 및 다듬기 | 서비스 커넥터 사용 | 라이브 트래픽을 허용하기 전에 클라우드 리소스에 대한 활동성 확인 | - 리소스는 클라우드와 정확히 동일함 - 서비스 커넥터가 추가 값 제공 |
- 클라우드 리소스의 활동성을 확인하는 비용 - ARM 템플릿만 지원 - 템플릿을 이해하고 연마하는 데 필요한 노력 |
6 | 내보내기 및 다듬기 | 템플릿에서 직접 원본 및 대상 서비스 구성 | 클라우드 리소스에 대한 활동성 검사 없음 | - 리소스는 클라우드와 정확히 동일함 | - ARM 템플릿만 지원 - 템플릿을 이해하고 연마하기 위한 노력 - 서비스 커넥터 기능을 사용할 수 없음 |
템플릿 작성
다음 섹션에서는 웹앱 및 스토리지 계정을 만들고 Bicep을 사용하여 시스템이 할당한 ID에 연결하는 방법을 보여 줍니다. 서비스 커넥터와 템플릿 논리를 모두 사용하여 이 작업을 수행하는 방법을 보여 줍니다.
원본 및 대상 서비스 프로비전
처음부터 작성
템플릿을 처음부터 작성하는 것은 시작하기 쉽고 템플릿을 간단하고 읽을 수 있도록 하므로 원본 및 대상 서비스를 프로비전하는 기본 설정 및 권장 방법입니다. 다음은 최소한의 매개 변수 집합을 사용하여 웹앱 및 스토리지 계정을 만드는 예제입니다.
// This template creates a webapp and a storage account.
// In order to make it more readable, we use only the minimal set of parameters to create the resources.
param location string = resourceGroup().location
// App Service plan parameters
param planName string = 'plan_${uniqueString(resourceGroup().id)}'
param kind string = 'linux'
param reserved bool = true
param sku string = 'B1'
// Webapp parameters
param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param linuxFxVersion string = 'PYTHON|3.8'
param identityType string = 'SystemAssigned'
param appSettings array = []
// Storage account parameters
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
// Create an app service plan
resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
name: planName
location: location
kind: kind
sku: {
name: sku
}
properties: {
reserved: reserved
}
}
// Create a web app
resource appService 'Microsoft.Web/sites@2022-09-01' = {
name: webAppName
location: location
properties: {
serverFarmId: appServicePlan.id
siteConfig: {
linuxFxVersion: linuxFxVersion
appSettings: appSettings
}
}
identity: {
type: identityType
}
}
// Create a storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
내보내기 및 다듬기
프로비전하는 리소스가 클라우드에 있는 리소스와 정확히 동일한 경우 Azure에서 템플릿을 내보내는 것도 다른 옵션일 수 있습니다. 이 방법의 두 가지 전제는 리소스가 Azure에 있고 IaC에 ARM 템플릿을 사용하는 것입니다. Export template
단추는 일반적으로 Azure Portal의 사이드바 아래쪽에 있습니다. 내보낸 ARM 템플릿은 서비스 커넥터에서 구성한 설정을 포함하여 리소스의 현재 상태를 반영합니다. 일반적으로 내보낸 템플릿을 다듬으려면 리소스 속성에 대해 알아야 합니다.
연결 논리 빌드
서비스 커넥터 사용 및 App Configuration에 구성 저장
App Configuration을 사용하여 구성을 저장하는 것은 기본적으로 IaC 시나리오를 지원합니다. 따라서 가능하면 이 방법을 사용하여 IaC 템플릿을 빌드하는 것이 좋습니다.
간단한 포털 지침은 이 App Configuration 자습서를 참조할 수 있습니다. 이 기능을 bicep 파일에 추가하려면 Service Connector 페이로드에 App Configuration ID를 추가합니다.
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
name: webAppName
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
name: storageAccountName
}
resource appConfiguration 'Microsoft.AppConfiguration/configurationStores@2023-03-01' existing = {
name: appConfigurationName
}
resource serviceConnector 'Microsoft.ServiceLinker/linkers@2022-05-01' = {
name: connectorName
scope: webApp
properties: {
clientType: 'python'
targetService: {
type: 'AzureResource'
id: storageAccount.id
}
authInfo: {
authType: 'systemAssignedIdentity'
}
configurationInfo: {
configurationStore: {
appConfigurationId: appConfiguration.id
}
}
}
}
서비스 커넥터 사용
Service Connector IaC 제한 사항이 시나리오에 부정적인 영향을 주지 않는 경우 Service Connector를 사용하여 원본 서비스와 대상 서비스 간에 연결을 만드는 것이 바람직하고 권장되는 방법입니다. 서비스 커넥터는 템플릿을 간소화하고 템플릿 논리를 통해 직접 연결을 빌드할 때 사용할 수 없는 연결 상태 유효성 검사와 같은 추가 기능을 제공합니다.
// The template builds a connection between a webapp and a storage account
// with a system-assigned identity using Service Connector
param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
param connectorName string = 'connector_${uniqueString(resourceGroup().id)}'
// Get an existing webapp
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
name: webAppName
}
// Get an existing storage
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
name: storageAccountName
}
// Create a Service Connector resource for the webapp
// to connect to a storage account using system identity
resource serviceConnector 'Microsoft.ServiceLinker/linkers@2022-05-01' = {
name: connectorName
scope: webApp
properties: {
clientType: 'python'
targetService: {
type: 'AzureResource'
id: storageAccount.id
}
authInfo: {
authType: 'systemAssignedIdentity'
}
}
}
서비스 커넥터 리소스를 만들 때 필요한 속성 및 값의 형식은 올바른 매개 변수를 제공하는 방법을 확인하세요. Azure Portal에서 서비스 커넥터 리소스를 만들 때 참조용 ARM 템플릿을 미리 보고 다운로드할 수도 있습니다.
템플릿 논리 사용
서비스 커넥터 IaC 제한 사항이 중요한 시나리오의 경우 템플릿 논리를 사용하여 직접 연결을 빌드하는 것이 좋습니다. 다음 템플릿은 시스템이 할당한 ID를 사용하여 스토리지 계정을 웹앱에 연결하는 방법을 보여 주는 예제입니다.
// The template builds a connection between a webapp and a storage account
// with a system-assigned identity without using Service Connector
param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
param storageBlobDataContributorRole string = 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'
// Get an existing webapp
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
name: webAppName
}
// Get an existing storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
name: storageAccountName
}
// Operation: Enable system-assigned identity on the source service
// No action needed as this is enabled when creating the webapp
// Operation: Configure the target service's endpoint on the source service's app settings
resource appSettings 'Microsoft.Web/sites/config@2022-09-01' = {
name: 'appsettings'
parent: webApp
properties: {
AZURE_STORAGEBLOB_RESOURCEENDPOINT: storageAccount.properties.primaryEndpoints.blob
}
}
// Operation: Configure firewall on the target service to allow the source service's outbound IPs
// No action needed as storage account allows all IPs by default
// Operation: Create role assignment for the source service's identity on the target service
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
scope: storageAccount
name: guid(resourceGroup().id, storageBlobDataContributorRole)
properties: {
roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', storageBlobDataContributorRole)
principalId: webApp.identity.principalId
}
}
템플릿 논리를 사용하여 직접 연결을 빌드할 때는 템플릿 논리가 서비스 커넥터 백 엔드 작업과 동일하기 때문에 각 종류의 인증 유형에 대해 서비스 커넥터가 수행하는 작업을 이해하는 것이 중요합니다. 다음 표에서는 각 종류의 인증 유형에 대한 템플릿 논리로 변환해야 하는 작업의 세부 정보를 보여 줍니다.
인증 유형 | 서비스 커넥터 작업 |
---|---|
비밀/연결 문자열 | - 원본 서비스의 앱 설정에서 대상 서비스의 연결 문자열 구성 - 원본 서비스의 아웃바운드 IP를 허용하도록 대상 서비스에서 방화벽 구성 |
시스템 할당 관리 ID | - 원본 서비스의 앱 설정에서 대상 서비스의 엔드포인트 구성 - 원본 서비스의 아웃바운드 IP를 허용하도록 대상 서비스에서 방화벽 구성 - 원본 서비스에서 시스템이 할당한 ID 사용 - 대상 서비스에서 원본 서비스의 ID에 대한 역할 할당 만들기 |
사용자 할당 관리 ID | - 원본 서비스의 앱 설정에서 대상 서비스의 엔드포인트 구성 - 원본 서비스의 아웃바운드 IP를 허용하도록 대상 서비스에서 방화벽 구성 - 원본 서비스에 사용자가 할당한 ID 바인딩 - 대상 서비스에서 사용자가 할당한 ID에 대한 역할 할당 만들기 |
서비스 사용자 | - 원본 서비스의 앱 설정에서 대상 서비스의 엔드포인트 구성 - 원본 서비스의 앱 설정에서 서비스 주체의 appId 및 비밀 구성 - 원본 서비스의 아웃바운드 IP를 허용하도록 대상 서비스에서 방화벽 구성 - 대상 서비스에서 서비스 주체에 대한 역할 할당 만들기 |