Blob Storage에 연결

BigQuery 관리자는 데이터 분석가가 Azure Blob Storage에 저장된 데이터에 액세스할 수 있도록 연결을 만들 수 있습니다.

BigQuery Omni는 연결을 통해 Blob Storage 데이터에 액세스합니다. BigQuery Omni는 Azure 워크로드 아이덴티티 제휴를 지원합니다. Azure 워크로드 아이덴티티 제휴를 지원하는 BigQuery Omni를 사용하면 테넌트의 Azure 애플리케이션에 대한 액세스 권한을 Google 서비스 계정에 부여할 수 있습니다. 개발자나 Google에서 관리할 애플리케이션 클라이언트 보안 비밀이 없습니다.

BigQuery Azure 연결을 만든 후에는 Blob Storage 데이터를 쿼리하거나 쿼리 결과를 Blob Storage로 내보내기할 수 있습니다.

시작하기 전에

필요한 역할

  • 연결을 만들어 Azure Blob Storage 데이터에 액세스하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트의 BigQuery 연결 관리자(roles/bigquery.connectionAdmin) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

  • 테넌트에 대한 다음 Azure IAM 권한이 있는지 확인합니다.
    • Application.ReadWrite.All
    • AppRoleAssignment.ReadWrite.All

할당량

할당량에 대한 자세한 내용은 BigQuery Connection API를 참조하세요.

Azure 연결 만들기

Azure 연결을 만들려면 다음 단계를 수행하세요.

  1. Azure 테넌트에서 애플리케이션을 만듭니다.
  2. BigQuery Azure 연결 만들기.
  3. 제휴 사용자 인증 정보를 추가합니다.
  4. BigQuery Azure AD 애플리케이션에 역할을 할당합니다.

제휴 ID 사용자 인증 정보를 사용하여 Azure의 데이터에 액세스하는 방법에 대한 자세한 내용은 워크로드 아이덴티티 제휴를 참조하세요.

Azure 테넌트에서 애플리케이션 만들기

Azure 테넌트에서 애플리케이션을 만들려면 다음 단계를 따르세요.

Azure 포털

  1. Azure 포털에서 App registrations(앱 등록)로 이동한 다음 New registration(신규 등록)을 클릭합니다.

  2. Names(이름)에 애플리케이션 이름을 입력합니다.

  3. Supported account types(지원되는 계정 유형)Accounts in this organizational directory only(이 조직 디렉터리의 계정만)를 선택합니다.

  4. 새 애플리케이션을 등록하려면 Register(등록)를 클릭합니다.

  5. 애플리케이션(클라이언트) ID를 기록해 둡니다. 연결 생성 시 이 ID를 제공해야 합니다.

    애플리케이션을 만드는 Azure 포털

Terraform

Terraform 구성 파일에 다음을 추가합니다.

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
  }

  resource "azuread_service_principal" "example" {
    application_id               = azuread_application.example.application_id
    app_role_assignment_required = false
  }

자세한 내용은 Azure에서 애플리케이션을 등록하는 방법을 참조하세요.

연결 만들기

콘솔

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 추가 메뉴에서 외부 데이터 소스를 선택합니다.

  3. 외부 데이터 소스 창에서 다음 정보를 입력합니다.

    • 연결 유형으로 Azure 기반 BigLake(BigQuery Omni를 통해 연결)를 선택합니다.
    • 연결 ID에는 연결 리소스의 식별자를 입력합니다. 문자, 숫자, 대시, 밑줄을 사용할 수 있습니다.
    • 연결을 만들려는 위치를 선택합니다.
    • (선택사항) 별칭에 사용자 친화적인 연결 이름(예: My connection resource)을 입력합니다. 사용자 친화적인 이름으로 나중에 수정해야 하는 경우 연결 리소스를 식별하는 데 도움이 되는 모든 값을 사용할 수 있습니다.
    • (선택사항) 설명에 연결 리소스에 대한 설명을 입력합니다.
    • Azure 테넌트 ID에 디렉터리(테넌트) ID라고도 하는 Azure 테넌트 ID를 입력합니다.
    • 제휴 ID 사용 체크박스를 사용 설정한 후 Azure 제휴 애플리케이션(클라이언트) ID를 입력합니다.

      Azure ID를 가져오는 방법은 Azure 테넌트에서 애플리케이션 만들기를 참조하세요.

  4. 연결 만들기를 클릭합니다.

  5. 연결로 이동을 클릭합니다.

  6. 연결 정보 섹션에서 서비스 계정 ID인 BigQuery Google ID 값을 확인합니다. 이 ID는 애플리케이션 액세스를 승인하는 Google Cloud 서비스 계정의 ID입니다.

Terraform

  resource "google_bigquery_connection" "connection" {
    connection_id = "omni-azure-connection"
    location      = "azure-eastus2"
    description   = "created by terraform"

    azure {
      customer_tenant_id              = "TENANT_ID"
      federated_application_client_id = azuread_application.example.application_id
    }
  }

TENANT_ID를 Blob Storage 계정이 포함된 Azure 디렉터리의 테넌트 ID로 바꿉니다.

bq

bq mk 명령어를 사용합니다. 출력을 JSON 형식으로 가져오려면 --format=json 매개변수를 사용합니다.

bq mk --connection --connection_type='Azure' \
  --tenant_id=TENANT_ID \
  --location=AZURE_LOCATION \
  --federated_azure=true \
  --federated_app_client_id=APP_ID \
  CONNECTION_ID

다음을 바꿉니다.

  • TENANT_ID: Azure Storage 계정이 포함된 Azure 디렉터리의 테넌트 ID
  • AZURE_LOCATION: Azure Storage 데이터가 있는 Azure 리전. BigQuery Omni는 azure-eastus2 리전을 지원합니다.
  • APP_ID: Azure 애플리케이션(클라이언트) ID. 이 ID를 가져오는 방법은 Azure 테넌트에서 애플리케이션 만들기를 참조하세요.
  • CONNECTION_ID: 연결의 이름

출력은 다음과 비슷합니다.

Connection CONNECTION_ID successfully created
Please add the following identity to your Azure application APP_ID
Identity: SUBJECT_ID

이 출력에는 다음 값이 포함됩니다.

  • APP_ID: 사용자가 만든 애플리케이션의 ID

  • SUBJECT_ID: 사용자가 자신의 애플리케이션에 액세스하도록 승인한 Google Cloud 서비스 계정의 ID. Azure에서 제휴 사용자 인증 정보를 만들 때 이 값이 필요합니다.

다음 단계에서 사용할 APP_IDSUBJECT_ID 값을 기록해둡니다.

그런 다음 애플리케이션의 제휴 사용자 인증 정보를 추가합니다.

제휴 사용자 인증 정보 추가

제휴 사용자 인증 정보를 만들려면 다음 단계를 수행합니다.

Azure 포털

  1. Azure 포털에서 App registrations(앱 등록)로 이동한 다음 애플리케이션을 클릭합니다.

  2. Certificates & secrets(인증서 및 보안 비밀) > Federated credentials(제휴 사용자 인증 정보) > Add credentials(사용자 인증 정보 추가)를 선택합니다. 그런 후 다음 작업을 수행합니다.

    1. Federated credential scenario(제휴 사용자 인증 정보 시나리오) 목록에서 Other issuer(다른 발급기관)를 선택합니다.

    2. Issuer(발급기관)https://accounts.google.com을 입력합니다.

    3. Subject identifier(제목 식별자)연결 생성 시 가져온 Google Cloud 서비스 계정의 BigQuery Google ID를 입력합니다.

    4. Name(이름)에 사용자 인증 정보의 이름을 입력합니다.

    5. 추가를 클릭합니다.

Terraform

Terraform 구성 파일에 다음을 추가합니다.

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
  }

  resource "azuread_service_principal" "example" {
    application_id               = azuread_application.example.application_id
    app_role_assignment_required = false
  }

  resource "azuread_application_federated_identity_credential" "example" {
    application_object_id = azuread_application.example.object_id
    display_name          = "omni-federated-credential"
    description           = "BigQuery Omni federated credential"
    audiences             = ["api://AzureADTokenExchange"]
    issuer                = "https://accounts.google.com"
    subject               = google_bigquery_connection.connection.azure[0].identity
  }

자세한 내용은 외부 ID 공급업체를 신뢰하도록 앱 구성을 참조하세요.

BigQuery의 Azure 애플리케이션에 역할을 할당합니다.

BigQuery의 Azure 애플리케이션에 역할을 할당하려면 Azure 포털, Azure PowerShell 또는 Microsoft Management REST API를 사용합니다.

Azure 포털

Microsoft.Authorization/roleAssignments/write 권한이 있는 사용자로 로그인하여 Azure 포털에서 역할 할당을 수행할 수 있습니다. 역할 할당을 통해 역할 정책에 지정된 대로 BigQuery Azure 연결로 Azure Storage 데이터에 액세스할 수 있습니다.

Azure 포털을 사용하여 역할 할당을 추가하려면 다음 단계를 수행합니다.

  1. Azure Storage 계정의 검색창에 IAM을 입력합니다.

  2. Access Control (IAM)(액세스 제어(IAM))을 클릭합니다.

  3. Add(추가)를 클릭하고 Add role assignments(역할 할당 추가)를 선택합니다.

  4. 읽기 전용 액세스 권한을 제공하려면 Storage Blob Data Reader(스토리지 Blob 데이터 리더) 역할을 선택합니다. 읽기-쓰기 액세스 권한을 제공하려면 Storage Blob Data Contributor(스토리지 Blob 데이터 참여자) 역할을 선택합니다.

  5. 액세스 권한 지정사용자, 그룹 또는 서비스 주 구성원으로 설정합니다.

  6. Select members(구성원 선택)를 클릭합니다.

  7. Select(선택) 필드에 Azure 테넌트에서 애플리케이션을 만들 때 지정한 Azure 애플리케이션 이름을 입력합니다.

  8. 저장을 클릭합니다.

자세한 내용은 Azure 포털을 사용한 Azure 역할 할당을 참조하세요.

Terraform

Terraform 구성 파일에 다음을 추가합니다.

  resource "azurerm_role_assignment" "data-role" {
    scope                = data.azurerm_storage_account.example.id
    # Read permission for Omni on the storage account
    role_definition_name = "Storage Blob Data Reader"
    principal_id         = azuread_service_principal.example.id
  }

Azure PowerShell

리소스 범위에서 서비스 주 구성원에 역할 할당을 추가하려면 New-AzRoleAssignment 명령어를 사용하면 됩니다.

  New-AzRoleAssignment`
   -SignInName APP_NAME`
   -RoleDefinitionName ROLE_NAME`
   -ResourceName RESOURCE_NAME`
   -ResourceType RESOURCE_TYPE`
   -ParentResource PARENT_RESOURCE`
   -ResourceGroupName RESOURCE_GROUP_NAME

다음을 바꿉니다.

  • APP_NAME: 애플리케이션의 이름입니다.
  • ROLE_NAME: 할당하려는 역할 이름입니다.
  • RESOURCE_NAME: 리소스 이름입니다.
  • RESOURCE_TYPE: 리소스 유형입니다.
  • PARENT_RESOURCE: 상위 리소스입니다.
  • RESOURCE_GROUP_NAME: 리소스 그룹 이름입니다.

Azure PowerShell을 사용하여 새 서비스 주 구성원을 추가하는 방법에 대한 자세한 내용은 Azure PowerShell을 사용한 Azure 역할 할당을 참조하세요.

Azure CLI

리소스 범위에서 서비스 주 구성원에 대해 역할 할당을 추가하려면 Azure 명령줄 도구를 사용하면 됩니다. 스토리지 계정에 역할을 부여하려면 Microsoft.Authorization/roleAssignments/write 권한이 있어야 합니다.

스토리지 Blob 데이터 리더 역할과 같은 역할을 서비스 주 구성원에게 할당하려면 az role assignment create 명령어를 실행합니다.

  az role assignment create --role "Storage Blob Data Reader" \
    --assignee-object-id ${SP_ID} \
    --assignee-principal-type ServicePrincipal \
    --scope   subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME

다음을 바꿉니다.

  • SP_ID: 서비스 주 구성원 ID입니다. 이 서비스 주 구성원은 생성한 애플리케이션을 위한 것입니다. 제휴 연결의 서비스 주 구성원을 가져오려면 서비스 주 구성원 객체를 참조하세요.
  • STORAGE_ACCOUNT_NAME: 스토리지 계정 이름입니다.
  • RESOURCE_GROUP_NAME: 리소스 그룹 이름입니다.
  • SUBSCRIPTION_ID: 구독 ID입니다.

자세한 내용은 Azure CLI를 사용한 Azure 역할 할당을 참조하세요.

Microsoft REST API

서비스 주 구성원에 대해 역할 할당을 추가하려면 Microsoft Management에 HTTP 요청을 전송하면 됩니다.

Microsoft Graph REST API를 호출하려면 애플리케이션의 OAuth 토큰을 검색합니다. 자세한 내용은 사용자 없이 액세스 권한 가져오기를 참조하세요. Microsoft Graph REST API를 호출한 애플리케이션에는 Application.ReadWrite.All 애플리케이션 권한이 있어야 합니다.

OAuth 토큰을 생성하려면 다음 명령어를 실행합니다.

  export TOKEN=$(curl -X POST \
    https://login.microsoftonline.com/TENANT_ID/oauth2/token \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/x-www-form-urlencoded' \
    --data-urlencode "grant_type=client_credentials" \
    --data-urlencode "resource=https://graph.microsoft.com/" \
    --data-urlencode "client_id=CLIENT_ID" \
    --data-urlencode "client_secret=CLIENT_SECRET" \
  | jq --raw-output '.access_token')

다음을 바꿉니다.

  • TENANT_ID: Azure Storage 계정이 포함된 Azure 디렉터리의 ID와 일치하는 테넌트 ID
  • CLIENT_ID: Azure 클라이언트 ID
  • CLIENT_SECRET: Azure 클라이언트 보안 비밀번호

서비스 주 구성원에게 할당하려는 Azure 기본 제공 역할의 ID를 가져옵니다.

일반적인 역할은 다음과 같습니다.

서비스 주 구성원에 역할을 할당하려면 Microsoft Graph REST API를 Azure Resource Management REST API에 호출합니다.

  export ROLE_ASSIGNMENT_ID=$(uuidgen)
  curl -X PUT \
'https://management.azure.com/subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleAssignments/ROLE_ASSIGNMENT_ID?api-version=2018-01-01-preview' \
    -H "authorization: Bearer ${TOKEN?}" \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/json' \
    -d '{
        "properties": {
            "roleDefinitionId": "subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleDefinitions/ROLE_ID",
            "principalId": "SP_ID"
        }
    }'

다음을 바꿉니다.

  • ROLE_ASSIGNMENT_ID: 역할 ID입니다.
  • SP_ID: 서비스 주 구성원 ID입니다. 이 서비스 주 구성원은 생성한 애플리케이션을 위한 것입니다. 제휴 연결의 서비스 주 구성원을 가져오려면 서비스 주 구성원 객체를 참조하세요.
  • SUBSCRIPTION_ID: 구독 ID입니다.
  • RESOURCE_GROUP_NAME: 리소스 그룹 이름입니다.
  • STORAGE_ACCOUNT_NAME: 스토리지 계정 이름입니다.
  • SUBSCRIPTION_ID: 구독 ID입니다.

이제 연결을 사용할 수 있습니다. 그러나 Azure에서 역할 할당의 전파가 지연될 수 있습니다. 권한 문제로 인해 연결을 사용할 수 없다면 잠시 후에 다시 시도하세요.

사용자와 연결 공유

데이터를 쿼리하고 연결을 관리할 수 있도록 사용자에게 다음 역할을 부여할 수 있습니다.

  • roles/bigquery.connectionUser: 사용자가 연결을 사용하여 외부 데이터 소스에 연결하고 쿼리를 실행할 수 있습니다.

  • roles/bigquery.connectionAdmin: 사용자가 연결을 관리할 수 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

    이러한 연결은 프로젝트의 외부 연결 그룹에 나열됩니다.

  2. 탐색기 창에서 프로젝트 이름 > 외부 연결 > 연결을 클릭합니다.

  3. 세부정보 창에서 공유를 클릭하여 연결을 공유합니다. 다음 작업을 수행합니다.

    1. 연결 권한 대화상자에서 주 구성원을 추가하거나 수정하여 다른 주 구성원과 연결을 공유합니다.

    2. 저장을 클릭합니다.

bq

bq 명령줄 도구로 연결을 공유할 수 없습니다. 연결을 공유하려면 Google Cloud 콘솔 또는 BigQuery Connections API 메서드를 사용하여 연결을 공유합니다.

API

BigQuery 연결 REST API 참조 섹션의 projects.locations.connections.setIAM 메서드를 사용하고 policy 리소스의 인스턴스를 지정합니다.

Java

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참고 문서를 확인하세요.

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

다음 단계