다음을 통해 공유


가상 네트워크에서 백 엔드 스토리지에 대한 개인 네트워크 액세스 구성

참고 항목

기본, 표준엔터프라이즈 계획은 2025년 3월 중순부터 사용되지 않으며 3년의 은퇴 기간이 있습니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 사용 중지 공지 사항을 참조하세요.

표준 소비 및 전용 계획은 2024년 9월 30일부터 사용되지 않으며 6개월 후에 완전히 종료됩니다. Azure Container Apps로 전환하는 것이 좋습니다. 자세한 내용은 Azure Spring Apps 표준 사용량 및 전용 계획을 Azure Container Apps로 마이그레이션을 참조 하세요.

이 문서는 Standard ✅ Enterprise에✅ 적용됩니다.

이 문서에서는 가상 네트워크 내에서 애플리케이션의 백 엔드 스토리지에 대한 개인 네트워크 액세스를 구성하는 방법을 설명합니다.

가상 네트워크 주입을 사용하여 Azure Spring Apps 서비스 인스턴스에 애플리케이션을 배포하는 경우 서비스 인스턴스는 JAR 파일 및 로그를 포함하여 관련 자산을 저장하기 위해 백 엔드 스토리지를 사용합니다. 기본 구성은 공용 네트워크를 통해 이 백 엔드 스토리지로 트래픽을 라우팅하지만 프라이빗 스토리지 액세스 기능을 켤 수 있습니다. 이 기능을 사용하면 개인 네트워크를 통해 트래픽을 유도하여 보안을 강화하고 잠재적으로 성능을 개선할 수 있습니다.

참고 항목

이 기능은 Azure Spring Apps 가상 네트워크 삽입 서비스 인스턴스에만 적용됩니다.

Azure Spring Apps 서비스 인스턴스에 대해 이 기능을 사용하도록 설정하기 전에 서비스 런타임 서브넷에 사용 가능한 IP 주소가 두 개 이상 있는지 확인합니다.

이 기능을 사용하거나 사용하지 않도록 설정하면 DNS 확인이 백 엔드 스토리지로 변경됩니다. 짧은 기간 동안 백 엔드 스토리지에 대한 연결을 설정하지 못하거나 업데이트 중에 엔드포인트를 확인할 수 없는 배포가 발생할 수 있습니다.

이 기능을 사용하도록 설정한 후에는 백 엔드 스토리지에 비공개로만 액세스할 수 있으므로 가상 네트워크 내에 애플리케이션을 배포해야 합니다.

필수 구성 요소

새 Azure Spring Apps 인스턴스를 만들 때 프라이빗 스토리지 액세스를 사용하도록 설정합니다.

가상 네트워크에서 Azure Spring Apps 인스턴스를 만들 때 다음 명령을 사용하여 인수 --enable-private-storage-access true를 전달하여 프라이빗 스토리지 액세스를 사용하도록 설정합니다. 자세한 내용은 가상 네트워크에 Azure Spring Apps 배포를 참조하세요.

az spring create \
    --resource-group "<resource-group>" \
    --name "<Azure-Spring-Apps-instance-name>" \
    --vnet "<virtual-network-name>" \
    --service-runtime-subnet "<service-runtime-subnet>" \
    --app-subnet "<apps-subnet>" \
    --location "<location>" \
    --enable-private-storage-access true

Azure Spring Apps 인스턴스에 대한 프라이빗 링크 리소스를 호스팅하기 위해 구독에 리소스 그룹이 하나 더 만들어집니다. 이 리소스 그룹의 이름은 ap-res_{service instance name}_{service instance region}입니다.

리소스 그룹에는 두 가지 프라이빗 링크 리소스 집합이 배포되어 있으며, 각각은 다음 Azure 리소스로 구성됩니다.

  • 백 엔드 스토리지 계정의 프라이빗 엔드포인트를 나타내는 프라이빗 엔드포인트입니다.
  • 서비스 런타임 서브넷 내에서 개인 IP 주소를 유지 관리하는 NIC(네트워크 인터페이스)입니다.
  • 이 DNS 영역 내의 스토리지 계정에 대해 만들어진 DNS A 레코드를 사용하여 가상 네트워크에 배포된 프라이빗 DNS 영역입니다.

Important

리소스 그룹은 Azure Spring Apps 서비스에서 완전히 관리됩니다. 이러한 리소스 그룹 내의 리소스를 수동으로 삭제하거나 수정하지 마세요.

기존 Azure Spring Apps 인스턴스에 대한 프라이빗 스토리지 액세스를 사용 또는 사용 안 함으로 설정합니다.

다음 명령을 사용하여 기존 Azure Spring Apps 인스턴스를 업데이트하여 프라이빗 스토리지 액세스를 사용하거나 사용하지 않도록 설정합니다.

az spring update \
    --resource-group "<resource-group>" \
    --name "<Azure-Spring-Apps-instance-name>" \
    --enable-private-storage-access <true-or-false>

중앙 DNS 확인 사용

중앙 집중형 DNS 관리 아키텍처는 대규모 Private Link 및 DNS 통합의 허브 및 스포크 네트워크 아키텍처에 문서화되어 있습니다. 이 아키텍처에서는 모든 프라이빗 DNS 영역이 Azure Spring Apps 서비스 인스턴스와는 다른 중앙 가상 네트워크에 중앙에서 배포되고 관리됩니다. 이 아키텍처를 사용하는 경우 DNS 설정을 적절히 구성하여 프라이빗 스토리지 액세스에 대한 중앙 DNS 확인을 사용하도록 설정할 수 있습니다. 이 설정을 사용하면 다음이 보장됩니다.

  • 프라이빗 엔드포인트가 만들어지면 해당 DNS 레코드가 자동으로 중앙 프라이빗 DNS 영역에 추가됩니다.
  • DNS 레코드는 프라이빗 엔드포인트의 수명 주기에 따라 관리됩니다. 즉, 프라이빗 엔드포인트가 삭제되면 DNS 레코드도 자동으로 제거됩니다.

다음 섹션에서는 중앙 가상 네트워크에 이미 프라이빗 DNS 영역 privatelink.blob.core.windows.net이 설정되어 있다고 가정하고 Azure Policy를 사용하여 Azure Storage Blob에 대한 중앙 DNS 확인을 사용하도록 설정하는 방법을 설명합니다. Azure Storage 파일과 Private Link를 지원하는 다른 Azure 서비스에도 동일한 원칙이 적용됩니다.

정책 정의

프라이빗 DNS 영역 외에도 사용자 지정 Azure Policy 정의를 만들어야 합니다. 자세한 내용은 자습서: 사용자 지정 정책 정의 만들기를 참조하세요. 이 정의는 프라이빗 엔드포인트를 만들 때 중앙 프라이빗 DNS 영역에 필요한 DNS 레코드를 자동으로 만듭니다.

다음 정책은 서비스별 groupId를 사용하여 프라이빗 엔드포인트 리소스를 만들 때 트리거됩니다. groupId는 이 프라이빗 엔드포인트가 연결해야 하는 원격 리소스 또는 서비스에서 가져온 그룹 ID입니다. 이 예에서 Azure Storage Blob의 groupIdblob입니다. 다른 Azure 서비스의 groupId에 대한 자세한 내용은 하위 리소스 열 아래의 Azure 프라이빗 엔드포인트 프라이빗 DNS 영역 값에 있는 표를 참조하세요.

그런 다음 정책은 매개 변수로 지정된 프라이빗 DNS 영역과 프라이빗 엔드포인트를 연결하는 프라이빗 엔드포인트 내에서 privateDNSZoneGroup의 배포를 트리거합니다. 다음 예에서 프라이빗 DNS 영역 리소스 ID는 /subscriptions/<subscription-id>/resourceGroups/<resourceGroupName>/providers/Microsoft.Network/privateDnsZones/privatelink.blob.core.windows.net입니다.

{
  "mode": "Indexed",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Network/privateEndpoints"
        },
        {
          "value": "[contains(resourceGroup().name, 'ap-res_')]",
          "equals": "true"
        },
        {
          "count": {
            "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
            "where": {
              "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
              "equals": "blob"
            }
          },
          "greaterOrEquals": 1
        }
      ]
    },
    "then": {
      "effect": "deployIfNotExists",
      "details": {
        "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
        "evaluationDelay": "AfterProvisioningSuccess",
        "roleDefinitionIds": [
          "/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
        ],
        "deployment": {
          "properties": {
            "mode": "incremental",
            "template": {
              "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
              "contentVersion": "1.0.0.0",
              "parameters": {
                "privateDnsZoneId": {
                  "type": "string"
                },
                "privateEndpointName": {
                  "type": "string"
                },
                "location": {
                  "type": "string"
                }
              },
              "resources": [
                {
                  "name": "[concat(parameters('privateEndpointName'), '/deployedByPolicy')]",
                  "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
                  "apiVersion": "2020-03-01",
                  "location": "[parameters('location')]",
                  "properties": {
                    "privateDnsZoneConfigs": [
                      {
                        "name": "storageBlob-privateDnsZone",
                        "properties": {
                          "privateDnsZoneId": "[parameters('privateDnsZoneId')]"
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "parameters": {
              "privateDnsZoneId": {
                "value": "[parameters('privateDnsZoneId')]"
              },
              "privateEndpointName": {
                "value": "[field('name')]"
              },
              "location": {
                "value": "[field('location')]"
              }
            }
          }
        }
      }
    }
  },
  "parameters": {
    "privateDnsZoneId": {
      "type": "String",
      "metadata": {
        "displayName": "privateDnsZoneId",
        "description": null,
        "strongType": "Microsoft.Network/privateDnsZones"
      }
    }
  }
}

정책 할당

정책 정의를 배포한 후 Azure Spring Apps 서비스 인스턴스를 호스팅하는 구독에 정책을 할당하고 매개 변수로 중앙 프라이빗 DNS 영역을 지정합니다.

중앙 프라이빗 DNS 영역과 Azure Spring Apps 서비스 인스턴스는 서로 다른 구독에 호스트될 수 있습니다. 이 경우, 프라이빗 DNS 영역이 호스트되는 구독 및 리소스 그룹에서 프라이빗 DNS 영역 기여자 역할을 프라이빗 DNS 영역에서 프라이빗 엔드포인트 DNS 레코드를 만들고 관리하는 DeployIfNotExists 정책 할당에 의해 만들어진 관리 ID에 할당하는 것을 잊지 마세요. 자세한 내용은 Azure Policy를 사용하여 비준수 리소스 수정관리 ID 구성 섹션을 참조하세요.

구성을 완료한 후 프라이빗 스토리지 액세스 기능을 사용하거나 사용하지 않도록 설정하면 프라이빗 엔드포인트의 DNS 레코드가 해당 프라이빗 DNS 영역에 자동으로 등록되고, 프라이빗 엔드포인트가 삭제되면 해당 프라이빗 엔드포인트도 제거됩니다.

추가 비용

Azure Spring Apps 인스턴스에는 이 기능에 대한 요금이 발생하지 않습니다. 그러나 이 기능을 지원하는 구독에서 호스트되는 프라이빗 링크 리소스에 대해서는 요금이 청구됩니다. 자세한 내용은 Azure Private Link 가격 책정Azure DNS 가격 책정을 참조하세요.

사용자 지정 DNS 서버 사용

사용자 지정 DNS(도메인 이름 시스템) 서버를 사용 중이고 Azure DNS IP 168.63.129.16이 업스트림 DNS 서버로 구성되지 않은 경우 개인 IP 주소를 확인하려면 리소스 그룹 ap-res_{service instance name}_{service instance region}에 표시된 프라이빗 DNS 영역의 모든 DNS 레코드를 수동으로 바인딩해야 합니다.

다음 단계