Azure WebJobs 및 Service Bus에서 관리 ID 사용

관리 서비스 ID(또는 줄여서 MSI)를 사용하면 비밀을 사용하지 않고 Azure 리소스가 AD 인증을 지원하는 Azure 서비스에 연결할 수 있습니다(전체 목록here 참조).
이것은 비밀을 올바른 방식으로 처리하기 때문에 매우 유용합니다far from easy.

MSI 작동 방식은 이 문서의 범위를 벗어나며 자세한 정보here를 찾을 수 있지만 간단히 말해서 다음과 같습니다.
  • 서비스를 나타내기 위해 Azure AD에서 서비스 주체 개체 및 애플리케이션을 만듭니다(관리 ID를 켤 때 자동으로 수행됨)
  • .
  • 통신해야 하는 다운스트림 서비스에 액세스할 수 있는 일부 권한을 부여합니다
  • .
  • MSI를 통해 수행할 다운스트림 서비스에 대한 인증을 구성합니다
  • .

    제 경우에는 ServiceBus 대기열을 통해 메시지를 처리하는 WebJob이 있으므로 서비스 주체에게 기본 제공Azure Service Bus Data Receiver 역할을 사용하여 대기열에서 읽을 수 있는 권한을 부여했습니다.

    WebJob SDK는 설명된 대로here MSI를 사용하여 ServiceBus에 연결하는 것을 지원하므로 다음과 같은 방식으로 WebJob을 구성했습니다.

    "ServiceBusConnection__fullyQualifiedNamespace" : "<service_bus_namespace>.servicebus.windows.net"
    "QueueName" : "test-queue"
    


    대기열과 권한은 다음과 같이 terraform에서 정의되었습니다.

    // Define the queue
    resource "azurerm_servicebus_queue" "msi-test-queue" {
      name                = "test-queue"
      namespace_id        = azurerm_servicebus_namespace.msi-test-sb.id
      enable_partitioning = true
    }
    
    // Grant the WebJob Azure Service Bus Data Receiver permissions
    resource "azurerm_role_assignment" "consumer_service_bus_read" {
      scope                = azurerm_servicebus_queue.msi-test-queue.id
      role_definition_name = "Azure Service Bus Data Receiver"
      principal_id         = azapi_resource.consumer_container_app.identity.0.principal_id
      depends_on           = [azapi_resource.consumer_container_app]
    }
    


    C#의 WebJob 정의는 다음과 같습니다.

    [FunctionName("Processor")]
    public async Task ProcessEvent(
        [ServiceBusTrigger("%QueueName%", Connection = "ServiceBusConnection", IsSessionsEnabled = false)]
        ServiceBusReceivedMessage message, ServiceBusMessageActions messageActions)
    {
        ....
    }
    


    여기서 문자열 ServiceBusConnection은 Service Bus에 대한 연결 문자열을 포함하는 구성 값의 이름을 가리키고 %QueueName% 문자열은 큐 이름을 포함하는 구성 값을 가리킵니다.

    If you don't use the percent sign, the string will be the name of the queue and it will be hardcoded, adding the %% allows you to configure dynamically via a configuration lookup.



    안타깝게도 작동하지 않았습니다. WebJob은 시작 시 권한에 대해 불평하는 예외를 발생시켰습니다. 메시지는 다음과 같습니다.

    Unauthorized access. 'Listen' claim(s) are required to perform this operation
    


    권한이 있었고 Azure Portal에서 두 번 확인했기 때문에 이것은 예상치 못한 일이었습니다.

    이 작업을 수행할 수 있는 유일한 방법은 전체 Service Bus 네임스페이스에 대한 Azure Service Bus 데이터 수신기 권한을 부여하는 것이었습니다.

    resource "azurerm_role_assignment" "consumer_service_bus_read" {
      scope                = azurerm_servicebus_namespace.msi-test-sb.id
      role_definition_name = "Azure Service Bus Data Receiver"
      principal_id         = azapi_resource.consumer_container_app.identity.0.principal_id
      depends_on           = [azapi_resource.consumer_container_app]
    }
    


    이 접근 방식의 한 가지 주의 사항은 엄격하게 요구되는 것보다 더 많은 권한을 부여하지만 적어도 차단을 해제할 수 있다는 것입니다.

    소스 코드에 관심이 있는 경우 찾을 수 있습니다here.

    이 정보가 도움이 되었기를 바라며 질문이나 제안 사항이 있으면 아래에 댓글을 달아주세요!

    좋은 웹페이지 즐겨찾기