BigQuery Azure 接続の作成

BigQuery Omni は、接続を介して Azure Storage のデータにアクセスします。接続ごとに、独自の Azure Active Director(Azure AD)アプリケーションがあります。権限は、Azure Identity and Access Management(IAM)ロールを介してアプリケーションに付与されます。付与された Azure IAM ロールによって、BigQuery が各接続でアクセスできるデータが決まります。

始める前に

次のリソースが作成されていることを確認します。

BigQuery Azure 接続の作成

BigQuery Azure 接続を作成するには、Google Cloud Console または bq コマンドライン ツールを使用します。

Google Cloud Console

  1. 接続リソースを作成するには、Google Cloud Console で BigQuery ページに移動します。

    BigQuery に移動

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

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

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

    後で使用できるように、[Azure アプリ ID] フィールドの値と、[Azure アプリ名] フィールドの値をメモしておきます。

bq

bq mk --connection --connection_type='Azure' \
--tenant_id=TENANT_ID \
--location=AZURE_LOCATION \
CONNECTION_NAME

次のように置き換えます。

  • TENANT_ID: Azure Storage アカウントを含む Azure ディレクトリのテナント ID。
  • AZURE_LOCATION: Azure Storage データが配置されている Azure リージョンである必要があります。azure-eastus2 リージョンのみがサポートされています。
  • CONNECTION_NAME: この接続に付ける名前。

コマンドラインで次の出力が表示されます。

  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 の値をメモしておきます。

JSON 形式で出力を取得するには、--format=json パラメータを使用します。

  {"clientId": APP_ID, "application": APP_NAME}

Azure AD サービス プリンシパルの作成

Azure AD サービス プリンシパルを作成するには、Google Cloud Console、Azure PowerShell、Azure コマンドライン ツール、または Microsoft Graph REST API を使用します。

Google Cloud Console

Azure AD サービス プリンシパルを直接作成するには、Google Cloud Console の [接続情報] ペインで [サービス プリンシパルの作成] をクリックします。

Azure アカウントにログインします。表示される [Permissions Requested] ページで、[Accept] をクリックします。

Azure PowerShell

以前に返されたアプリ ID APP_ID のサービス原則を作成するには、Azure PowerShell を使用できます。ユーザーには Microsoft.directory/servicePrincipals/create 権限が必要です。

次のコマンドを実行します。

New-AzADServicePrincipal`
-ApplicationId APP_ID`
-SkipAssignment

APP_ID を以前に返されたアプリ ID に置き換えます。

Azure CLI

以前に返されたアプリ ID APP_ID のサービス プリンシパルを作成するには、Azure コマンドライン ツールを使用します。ユーザーには Microsoft.directory/servicePrincipals/create 権限が必要です。

次のコマンドを実行します。

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 トークンを取得します。使用するアプリケーションに 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: クライアント ID
  • CLIENT_SECRET: クライアント シークレット。

次のコマンドを実行します。

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: 前の手順で取得したトークン
  • APP_ID: 前に返されたアプリ ID。

BigQuery の Azure AD アプリケーションにロールを割り当てる

BigQuery の Azure AD アプリケーションにロールを割り当てるには、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」と入力します。[Access Control (IAM)] をクリックします。

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

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

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

  5. [Select] 入力フィールドで、以前に返されたアプリ名 APP_NAME を検索し、一致する結果を選択します。

  6. [Save] をクリックします。

Azure PowerShell

リソース スコープのサービス プリンシパルのロールの割り当てを追加するには、Azure PowerShell を使用します。

次のコマンドを実行します。

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 CLI

リソース スコープでのサービス プリンシパルのロールの割り当てを追加するには、Azure コマンドライン ツールを使用します。次のコマンドは、ストレージ アカウントに Storage Blob Data Contributor ロールを付与します。ユーザーには、ストレージ アカウントに対する Microsoft.Authorization/roleAssignments/write 権限が必要です。

Storage Blob Data Contributor ロールなどのロールをサービス プリンシパルに割り当てるには、次のコマンドを実行します。

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

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 を取得します。

一般的なロールは次のとおりです。 * Storage Blob Data Contributor: ba92f5b4-2d11-453d-a403-e96b0029c9fe * Storage Blob Data Reader: 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1

サービス原則にロールを割り当てるには、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

これで接続が使用できるようになりました。

次のステップ

  • 接続の操作の詳細については、接続の操作をご覧ください。