Blob Storage에 연결

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

BigQuery Omni는 연결을 통해 Blob Storage 데이터에 액세스합니다. Blob Storage에서 데이터에 안전하게 액세스하는 방법은 두 가지가 있습니다. Google Cloud 서비스 계정에 Azure 애플리케이션에 대한 액세스 권한을 부여하여 ID 제휴를 사용하거나 테넌트에서 Azure Active Directory(AD) 애플리케이션에 대한 액세스 권한을 직접 부여할 수 있습니다.

  • Azure 제휴 ID 사용. 이것이 권장되는 방법입니다. BigQuery Omni는 Azure 워크로드 ID 제휴를 지원합니다. Azure 워크로드 ID 제휴를 지원하는 BigQuery Omni를 사용하면 테넌트 내에 있는 Azure 애플리케이션에 대한 액세스 권한을 Google 서비스 계정에 부여할 수 있습니다. 애플리케이션 클라이언트가 Azure 테넌트 내에 있으므로 제휴 ID 액세스는 비제휴 액세스보다 안전합니다. 애플리케이션 클라이언트의 보안 비밀은 사용자 또는 Google이 관리하지 않습니다.

    ID 제휴를 사용하면 데이터에 대한 액세스 권한을 부여한 애플리케이션이 테넌트 내에 존재하므로 애플리케이션을 보다 세부적으로 제어할 수 있습니다.

  • 비제휴 ID 사용: 비제휴 ID를 사용하여 Azure 애플리케이션에 액세스하는 것이 지원 중단됨을 고객에게 알리는 필수 서비스 공지(MSA)가 2023년 6월 20일 영향을 받는 파트너 및 고객에게 전송되어, 2024년 1월 8일 변경 사항이 효력을 발생하기 전에 고지되었습니다. 대신 Azure 제휴 ID를 사용하는 것이 좋습니다. 제휴되지 않은 각 연결에는 고유한 Azure Active Directory(Azure AD) 애플리케이션이 있습니다. Azure Identity and Access Management(IAM) 역할을 통해 애플리케이션에 권한이 부여됩니다. 부여된 Azure IAM 역할에 따라 BigQuery가 각 연결에서 액세스할 수 있는 데이터가 결정됩니다.

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

시작하기 전에

필요한 역할

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

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

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

할당량

사용자 프로젝트에서 각 프로젝트에 대해 최대 50개의 Azure 연결을 만들 수 있습니다. 할당량에는 제휴 및 비제휴 Azure 연결이 모두 포함됩니다. 할당량에 대한 자세한 내용은 BigQuery Connection API를 참조하세요.

Azure 제휴 ID 사용

제휴 ID를 사용하여 데이터에 액세스하려면 다음 단계를 따르세요.

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

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

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-contributor-role" {
    scope                = data.azurerm_storage_account.example.id
    # Read-write permission for Omni on the storage account
    role_definition_name = "Storage Blob Data Contributor"
    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 Contributor" \
    --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에서 역할 할당의 전파가 지연될 수 있습니다. 권한 문제로 인해 연결을 사용할 수 없다면 잠시 후에 다시 시도하세요.

비제휴 ID 사용

비제휴 ID를 사용하여 데이터에 액세스하려면 다음 단계를 따르세요.

  1. BigQuery Azure 연결 만들기.
  2. Azure AD 서비스 주 구성원을 만듭니다.
  3. BigQuery의 Azure AD 애플리케이션에 역할을 할당합니다.

Azure에서 비제휴 ID를 사용하여 데이터에 액세스하는 방법에 대한 자세한 내용은 Azure AD 애플리케이션을 참조하세요.

연결 만들기

Blob Storage에 연결하려면 Google Cloud 콘솔 또는 bq 명령줄 도구를 사용합니다.

콘솔

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

    BigQuery로 이동

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

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

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

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

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

  6. 연결 정보 섹션에서 Azure 앱 IDAzure 앱 이름 값을 기록해둡니다. 이러한 값은 BigQuery의 Azure 애플리케이션에 역할을 할당할 때 필요합니다.

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 \
  CONNECTION_ID

다음을 바꿉니다.

  • TENANT_ID: Azure Storage 계정이 포함된 Azure 디렉터리의 테넌트 ID
  • AZURE_LOCATION: Azure Storage 데이터가 있는 Azure 리전. BigQuery Omni는 azure-eastus2 리전을 지원합니다.
  • CONNECTION_ID: 연결의 ID입니다.

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

  Please create a Service Principal in your directory for
  appId: APP_ID,
  and perform role assignment to
  app: APP_NAME
  to allow BigQuery to access your Azure data.

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

  • APP_ID: 사용자가 만든 애플리케이션의 ID
  • APP_NAME: BigQuery가 Azure 데이터에 액세스할 수 있도록 역할을 할당해야 하는 앱 이름

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

자세한 내용은 연결 만들기를 참조하세요.

Azure AD 서비스 주 구성원 만들기

Azure AD 서비스 주 구성원을 만들려면 Google Cloud 콘솔, Azure PowerShell, Azure 명령줄 도구 또는 Microsoft Graph REST API를 사용합니다.

콘솔

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

    BigQuery로 이동

  2. 탐색기 패널에서 앞서 만든 연결을 클릭합니다.

  3. 연결 정보 창에서 Azure 계정에 로그인을 클릭합니다.

  4. Azure 계정에 로그인합니다.

  5. Permissions Requested(요청된 권한) 페이지에서 Accept(수락)를 클릭합니다.

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 PowerShell

이전에 반환된 앱 ID APP_ID에 대해 서비스 주 구성원을 만들려면 사용자에게 Microsoft.directory/servicePrincipals/create 권한이 있어야 합니다.

서비스 주 구성원을 만들려면 New-AzADServicePrincipal 명령어를 실행합니다.

New-AzADServicePrincipal`
-ApplicationId APP_ID`
-SkipAssignment

APP_ID를 이전에 반환된 앱 ID로 바꿉니다.

Azure CLI

이전에 반환된 앱 ID APP_ID의 서비스 주 구성원을 만들려면 Azure 명령줄 도구를 사용하면 됩니다. 서비스 주 구성원을 만들려면 Microsoft.directory/servicePrincipals/create 권한이 있어야 합니다.

서비스 주 구성원을 만들려면 az ad sp 명령어를 실행합니다.

export SP_ID=$(az ad sp create --id APP_ID | jq --raw-output '.objectId')

APP_ID를 이전에 반환된 앱 ID로 바꿉니다.

Microsoft REST API

이전에 반환된 앱 ID APP_ID의 서비스 주 구성원을 만들려면 Microsoft Graph REST API에 HTTP 요청을 전송하면 됩니다.

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

TENANT_ID가 Azure Storage 계정이 포함된 Azure 디렉터리의 ID와 일치해야 합니다.

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
  • CLIENT_ID: Azure 클라이언트 ID
  • CLIENT_SECRET: Azure 클라이언트 보안 비밀번호

다음 명령어를 실행합니다.

export APP_ID=APP_ID

APP_ID를 반환된 앱 ID로 바꿉니다.

Microsoft Graph REST API를 호출하여 서비스 주 구성원을 만들려면 다음 명령어를 실행합니다.

export SP_ID=$(curl -X POST \
https://graph.microsoft.com/v1.0/serviceprincipals \
-H "authorization: Bearer ${TOKEN?}" \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-d "{
  \"appId\": \"${APP_ID?}\"
}" | jq --raw-output '.id')

다음을 바꿉니다.

  • TOKEN: 애플리케이션의 OAuth 토큰입니다.
  • APP_ID: 이전에 반환된 앱 ID입니다.

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

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(선택) 필드에 BigQuery Azure 연결을 만들 때 반환된 Azure 앱 이름을 입력합니다.

  8. 저장을 클릭합니다.

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

Terraform

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

  resource "azurerm_role_assignment" "data-contributor-role" {
    scope                = data.azurerm_storage_account.example.id
    # Read-write permission for Omni on the storage account
    role_definition_name = "Storage Blob Data Contributor"
    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 Contributor" \
    --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");
    }
  }
}

다음 단계