Blob Storage に接続する

BigQuery 管理者は、接続を作成して、データ アナリストが Azure Blob Storage に保存されているデータにアクセスできるようにします。

BigQuery Omni は、接続を介して Blob Storage のデータにアクセスします。Blob Storage のデータに安全にアクセスするには、2 つの方法があります。ID 連携を使用するには、Google Cloud サービス アカウントに Azure アプリケーションへのアクセス権を付与するか、直接テナントの Azure Active Directory(AD)アプリケーションへのアクセスを許可します。

  • Azure 連携 ID を使用するこれはおすすめの方法です。BigQuery Omni は、Azure Workload Identity 連携をサポートしています。BigQuery Omni が Azure Workload Identity 連携をサポートすることで、Google サービス アカウントに、テナント内にある Azure アプリケーションへのアクセス権を付与できます。アプリケーション クライアントは Azure テナント内に存在するため、連携 ID アクセスは非連携のアクセスよりも安全です。アプリケーション クライアントのシークレットは、ユーザーによっても Google によっても管理されません。

    ID 連携では、データへのアクセスを許可したアプリケーションがテナント内に存在するため、アプリケーションをより細かく制御できます。

  • 非連携 ID を使用する2023 年 6 月 20 日、サービスに関する重要なお知らせ(MSA)を、影響を受けるパートナーとお客様にお送りし、Azure アプリケーションへのアクセスに非連携 ID を使用することが非推奨になることをお伝えしました。この通知は、変更が有効になる 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 Connection 管理者roles/bigquery.connectionAdmin)の IAM ロールを付与するように管理者へ依頼してください。ロールの付与の詳細については、アクセス権の管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

  • テナントに次の Azure IAM 権限があることを確認します。
    • Application.ReadWrite.All
    • AppRoleAssignment.ReadWrite.All

割り当て

プロジェクトごとに最大 50 個の Azure 接続を作成できます。割り当てには、連携 Azure 接続と非連携 Azure 接続の両方が含まれます。割り当ての詳細については、BigQuery Connection API をご覧ください。

Azure 連携 ID を使用する

連携 ID を使用してデータにアクセスするには、次の手順を行います。

  1. Azure テナントでアプリケーションを作成します
  2. BigQuery Azure 接続を作成します
  3. 連携認証情報を追加します
  4. BigQuery Azure AD アプリケーションにロールを割り当てます

連携 ID 認証情報を使用して Azure データにアクセスする方法については、Workload Identity 連携をご覧ください。

Azure テナントにアプリケーションを作成する

Azure テナントにアプリケーションを作成するには、次の手順を実行します。

Azure Portal

  1. Azure Portal で、[アプリの登録] に移動し、[新規登録] をクリックします。

  2. [名前] にアプリケーションの名前を入力します。

  3. [サポートされているアカウントの種類] で、[Accounts in this organizational directory only] を選択します。

  4. 新しいアプリケーションを登録するには、[登録] をクリックします。

  5. アプリケーション(クライアント)ID をメモします。接続を作成するときに、この ID を指定する必要があります。

    Azure Portal でのアプリケーションの作成

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] に、接続リソースの識別子を入力します。文字、数字、ダッシュ、アンダースコアを使用できます。
    • 接続を作成するロケーションを選択します。
    • (省略可): [Friendly name] に、わかりやすい接続名を入力します(例: My connection resource)。後で修正が必要になった場合、わかりやすい名前だと接続リソースを簡単に識別できます。
    • (省略可): [説明] に、この接続リソースの説明を入力します。
    • [Azure テナント ID] に Azure テナント ID を入力します。これは、ディレクトリ(テナント)ID とも呼ばれます。
    • [フェデレーション ID を使用する] チェックボックスをオンにして、Azure 連携アプリケーション(クライアント)ID を入力します。

      Azure ID を取得する方法について詳しくは、Azure テナントでアプリケーションを作成するをご覧ください。

  4. [接続を作成] をクリックします。

  5. [接続へ移動] をクリックします。

  6. [接続情報] セクションで、[BigQuery Google ID] の値をメモします。これはサービス アカウント ID です。この ID は、アプリケーションへのアクセスを承認する Google Cloud サービス アカウント用です。

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 Portal

  1. Azure Portal で、[アプリの登録] に移動し、アプリケーションをクリックします。

  2. [証明書とシークレット] > [連携認証情報] > [認証情報を追加] を選択します。次に、以下の操作を行います。

    1. 連携認証情報のシナリオリストから、[その他の発行元] を選択します。

    2. [発行元] に「https://accounts.google.com」と入力します。

    3. [Subject identifier] に、接続の作成時に取得した Google Cloud サービス アカウントの BigQuery Google ID を入力します。

    4. [名前] に認証情報の名前を入力します。

    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 Portal、Azure PowerShell、または Microsoft Management REST API を使用します。

Azure Portal

Azure Portal でロールを割り当てるには、Microsoft.Authorization/roleAssignments/write 権限を持つユーザーとしてログインします。ロールの割り当てにより、BigQuery Azure 接続が、ロールポリシーで指定された Azure Storage データにアクセスできます。

Azure Portal を使用してロールの割り当てを追加する手順は次のとおりです。

  1. Azure Storage アカウントの検索バーに「IAM」と入力します。

  2. [アクセス制御(IAM)] をクリックします。

  3. [追加] をクリックし、[Add role assignments] を選択します。

  4. 読み取り専用権限を付与するには、[Storage Blob Data Reader] ロールを選択します。読み取り / 書き込みアクセスを付与するには、[Storage Blob Data Contributor] ロールを選択します。

  5. [Assign access to] を [User, group, or service principal] に設定します。

  6. [メンバーを選択] をクリックします。

  7. [選択] フィールドに、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 権限が必要です。

Storage Blob Data Contributor などのロールをサービス プリンシパルに割り当てるには、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

サービス プリンシパルのロールの割り当てを追加するには、HTTP リクエストを Microsoft Management に送信します。

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: テナント ID は、Azure Storage アカウントを含む Azure ディレクトリの ID と一致します。
  • CLIENT_ID: Azure クライアント ID。
  • CLIENT_SECRET: Azure クライアント シークレット。

サービス プリンシパルに割り当てる Azure 組み込みのロールの ID を取得します。

一般的なロールは次のとおりです。

サービス プリンシパルにロールを割り当てるには、Azure Resource Management REST API に対して Microsoft Graph 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 アプリケーションにロールを割り当てます

非連携 ID を使用して Azure データにアクセスする方法については、Azure AD アプリケーションをご覧ください。

接続を作成する

Blob Storage に接続するには、Google Cloud コンソールまたは bq コマンドライン ツールを使用します。

コンソール

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [ データを追加] メニューで [外部データソース] を選択します。

  3. [外部データソース] ペインで、次の情報を入力します。

    • [接続タイプ] で、[Azure 上の BigLake(BigQuery Omni 経由)] を選択します。
    • [接続 ID] に、接続リソースの識別子を入力します。文字、数字、ダッシュ、アンダースコアを使用できます。
    • 接続を作成するロケーションを選択します。
    • (省略可): [Friendly name] に、わかりやすい接続名を入力します(例: My connection resource)。後で修正が必要になった場合、わかりやすい名前だと接続リソースを簡単に識別できます。
    • (省略可): [説明] に、この接続リソースの説明を入力します。
    • [Azure テナント ID] に Azure テナント ID を入力します。これは、ディレクトリ(テナント)ID とも呼ばれます。

  4. [接続を作成] をクリックします。

  5. [接続へ移動] をクリックします。

  6. [接続情報] セクションで、[Azure アプリ ID] と [Azure アプリ名] の値をメモします。これらの値は、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 のサービス プリンシパルを作成するには、HTTP リクエストを Microsoft Graph REST API に送信します。

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 Portal

Azure Portal でロールを割り当てるには、Microsoft.Authorization/roleAssignments/write 権限を持つユーザーとしてログインします。ロールの割り当てにより、BigQuery Azure 接続が、ロールポリシーで指定された Azure Storage データにアクセスできます。

Azure Portal を使用してロールの割り当てを追加する手順は次のとおりです。

  1. Azure Storage アカウントの検索バーに「IAM」と入力します。

  2. [アクセス制御(IAM)] をクリックします。

  3. [追加] をクリックし、[Add role assignments] を選択します。

  4. 読み取り専用権限を付与するには、[Storage Blob Data Reader] ロールを選択します。読み取り / 書き込みアクセスを付与するには、[Storage Blob Data Contributor] ロールを選択します。

  5. [Assign access to] を [User, group, or service principal] に設定します。

  6. [メンバーを選択] をクリックします。

  7. [選択] フィールドに、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 権限が必要です。

Storage Blob Data Contributor などのロールをサービス プリンシパルに割り当てるには、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

サービス プリンシパルのロールの割り当てを追加するには、HTTP リクエストを Microsoft Management に送信します。

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: テナント ID は、Azure Storage アカウントを含む Azure ディレクトリの ID と一致します。
  • CLIENT_ID: Azure クライアント ID。
  • CLIENT_SECRET: Azure クライアント シークレット。

サービス プリンシパルに割り当てる Azure 組み込みのロールの ID を取得します。

一般的なロールは次のとおりです。

サービス プリンシパルにロールを割り当てるには、Azure Resource Management REST API に対して Microsoft Graph 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 Connections 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");
    }
  }
}

次のステップ