

# BigQuery 接続
<a name="aws-glue-programming-etl-connect-bigquery-home"></a>

AWS Glue for Spark を使用して、AWS Glue 4.0 以降のバージョンの Google BigQuery のテーブルからの読み取りとテーブルへの書き込みを行うことができます。Google SQL クエリを使用して BigQuery からの読み取りを行うことができます。AWS Glue 接続を介して AWS Secrets Manager で保存されている認証情報を使用して BigQuery に接続します。

Google BigQuery の詳細については、[Google Cloud BigQuery のウェブサイト](https://cloud.google.com/bigquery)を参照してください。

## BigQuery 接続を設定する
<a name="aws-glue-programming-etl-connect-bigquery-configure"></a>

AWS Glue から Google BigQuery へ接続するには、Google Cloud Platform の認証情報を作成して AWS Secrets Manager シークレットに保存し、そのシークレットを Google BigQuery AWS Glue 接続に関連付ける必要があります。

**BigQuery への接続を設定するには:**

1. Google Cloud Platform で、関連するリソースを作成して特定します。
   + 接続したい BigQuery テーブルを含む GCP プロジェクトを作成または特定します。
   + BigQuery API を有効にします。詳細については、「[Use the BigQuery Storage Read API to read table data](https://cloud.google.com/bigquery/docs/reference/storage/#enabling_the_api)」を参照してください。

1. Google Cloud Platform で、サービスアカウントの認証情報を作成してエクスポートします。

   BigQuery 認証情報ウィザードを使用すると、[認証情報の作成](https://console.cloud.google.com/apis/credentials/wizard?api=bigquery.googleapis.com) というステップを迅速に実行できます。

   GCP でサービスアカウントを作成するには、[サービスアカウントを作成する](https://cloud.google.com/iam/docs/service-accounts-create) にあるチュートリアルに従ってください。
   + **プロジェクト** を選択するときは、BigQuery テーブルを含むプロジェクトを選択します。
   + サービスアカウントの GCP IAM ロールを選択するときは、BigQuery テーブルの読み取り、書き込み、作成を行う BigQuery ジョブを実行するための適切な権限を付与するロールを追加または作成します。

   サービスアカウントの認証情報を作成するには、[サービスアカウントキーを作成する](https://cloud.google.com/iam/docs/keys-create-delete#creating) にあるチュートリアルに従ってください。
   + キータイプを選択するときは、**[JSON]** を選択します。

   これで、サービスアカウントの認証情報が記載された JSON ファイルがダウンロードされたはずです。これは次のように表示されます。

   ```
   {
     "type": "service_account",
     "project_id": "*****",
     "private_key_id": "*****",
     "private_key": "*****",
     "client_email": "*****",
     "client_id": "*****",
     "auth_uri": "https://accounts.google.com/o/oauth2/auth",
     "token_uri": "https://oauth2.googleapis.com/token",
     "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
     "client_x509_cert_url": "*****",
     "universe_domain": "googleapis.com"
   }
   ```

1. 認証情報 JSON ファイルを、適切に安全な Amazon S3 の場所にアップロードします。ファイルへのパス、{{s3secretpath}} は、今後の手順に備えて保持してください。

1. AWS Secrets Manager で、Google Cloud Platform の認証情報を使用してシークレットを作成します。Secrets Manager でシークレットを作成するには、AWS Secrets Manager ドキュメントの [AWS Secrets Manager シークレットを作成する](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html) にあるチュートリアルに従ってください。シークレットを作成したら、次のステップのためにシークレット名 {{secretName}} を保存しておきます。

   キー/値のペアを作成するときは、次のようにキーと値を指定します。
   + `token_uri`、`client_x509_cert_url`、`private_key_id`、`project_id`、`universe_domain`、`auth_provider_x509_cert_url`、`auth_uri`、`client_email`、`private_key`、`type`、`client_id` キーの場合は、ダウンロードした JSON ファイル内の対応する値を指定します。
   + `spark.hadoop.google.cloud.auth.service.account.json.keyfile` キーには、{{s3secretpath}} を指定します。

1. AWS Glue データカタログで、[AWS Glue 接続の追加](console-connections.md) にある手順に従って接続を作成します。接続を作成したら、次のステップのために接続名 {{connectionName}} を保存しておきます。
   + **[接続タイプ]** を選択するときは、Google BigQuery を選択してください。
   + **[AWS Secret]** をクリックして、{{secretName}} を入力します。

1. AWS Glue ジョブに関連付けられている IAM ロールに {{secretName}} を読み取るアクセス許可を付与します。

1. AWS Glue ジョブ設定で、**追加のネットワーク接続**として {{connectionName}} を指定します。

## BigQuery テーブルから読み取る
<a name="aws-glue-programming-etl-connect-bigquery-read"></a>

**前提条件:** 
+ 読み取る対象の BigQuery テーブル。フォーム `[dataset].[table]` には BigQuery のテーブル名とデータセット名が必要です。これに {{tableName}} と名前を付けます。
+ BigQuery テーブルの請求プロジェクト。そのためには、プロジェクトの名前、{{parentProject}} が必要です。請求元の親プロジェクトがない場合は、テーブルを含むプロジェクトを使用してください。
+ BigQuery の認証情報。「**AWS Glue で接続認証情報を管理するには」の手順を実行して、認証情報を設定します。AWS Glue 接続、{{connectionName}} の名前が必要になります。

例えば、次のようになります。

```
bigquery_read = glueContext.create_dynamic_frame.from_options(
    connection_type="bigquery",
    connection_options={
        "connectionName": "{{connectionName}}",
        "parentProject": "{{parentProject}}",
        "sourceType": "table",
        "table": "{{tableName}}",
    }
```

クエリを指定して、DynamicFrame に返される結果をフィルタリングすることもできます。`query`、`sourceType`、`viewsEnabled` および `materializationDataset` を設定する必要があります。

例えば、次のようになります。

**追加の前提条件:**

BigQuery がクエリのマテリアライズドビューを書き込むことのできる BigQuery データセット、{{materializationDataset}} を作成または特定する必要があります。

{{materializationDataset}} にテーブルを作成するには、サービスアカウントに適切な GCP IAM アクセス許可を付与する必要があります。

```
glueContext.create_dynamic_frame.from_options(
            connection_type="bigquery",
            connection_options={
                "connectionName": "{{connectionName}}",
                "materializationDataset": {{materializationDataset}},
                "parentProject": "{{parentProject}}",
                "viewsEnabled": "true",
                "sourceType": "query",
                "query": "select * from bqtest.test"
            }
        )
```

## BigQuery テーブルへ書き込む
<a name="aws-glue-programming-etl-connect-bigquery-write"></a>

この例では BigQuery サービスに直接書き込みます。BigQuery は「間接」書き込み方法もサポートしています。間接書き込みの設定の詳細については、[Google BigQuery での間接書き込みを使用する](#aws-glue-programming-etl-connect-bigquery-indirect-write) を参照してください。

**前提条件:** 
+ 書き込む対象の BigQuery テーブル。フォーム `[dataset].[table]` には BigQuery のテーブル名とデータセット名が必要です。自動的に作成される新しいテーブル名を指定することもできます。これに {{tableName}} と名前を付けます。
+ BigQuery テーブルの請求プロジェクト。そのためには、プロジェクトの名前、{{parentProject}} が必要です。請求元の親プロジェクトがない場合は、テーブルを含むプロジェクトを使用してください。
+ BigQuery の認証情報。「**AWS Glue で接続認証情報を管理するには」の手順を実行して、認証情報を設定します。AWS Glue 接続、{{connectionName}} の名前が必要になります。

例えば、次のようになります。

```
bigquery_write = glueContext.write_dynamic_frame.from_options(
    frame={{frameToWrite}},
    connection_type="bigquery",
    connection_options={
        "connectionName": "{{connectionName}}",
        "parentProject": "{{parentProject}}",
        "writeMethod": "direct",
        "table": "{{tableName}}",
    }
)
```

## BigQuery 接続オプションのリファレンス
<a name="aws-glue-programming-etl-connect-bigquery-reference"></a>
+ `project` — デフォルト: Google Cloud サービスアカウントのデフォルト。読み込み/書き込みに使用されます。テーブルに関連付けられている Google Cloud プロジェクトの名前。
+ `table` — (必須) 読み込み/書き込みに使用されます。`[[project:]dataset.]` フォーマット内の BigQuery テーブルの名前。
+ `dataset` — `table` オプションで定義されていない場合は必須。読み込み/書き込みに使用されます。BigQuery テーブルを含むデータセットの名前。
+ `parentProject` — デフォルト: Google Cloud サービスアカウントのデフォルト。読み込み/書き込みに使用されます。請求に使用される `project` に関連付けられた Google Cloud プロジェクトの名前。
+ `sourceType` — 読み取りに使用。読み取り時には必須です。有効値: `table`、`query` AWS Glue にテーブルで読み取るかクエリで読み取るかを通知します。
+ `materializationDataset` — 読み取りに使用。有効な値: 文字列。ビューのマテリアライゼーションの保存に使用される BigQuery データセットの名前。
+ `viewsEnabled` — 読み取りに使用。デフォルト: false。有効な値: true、false。BigQuery がビューを使用するかどうかを設定します。
+ `query` — 読み取りに使用。`viewsEnabled` が true のときに使用されます。GoogleSQL DQL クエリ。
+ `temporaryGcsBucket` — 書き込みに使用。`writeMethod` がデフォルト (`indirect`) に設定されている場合は必須です。BigQuery への書き込み中に中間形式のデータを保存するために使用される Google Cloud Storage バケットの名前。
+ `writeMethod` - デフォルト: `indirect`。有効な値: `direct`、`indirect`。書き込みに使用。データの書き込みに使用する方法を指定します。
  + `direct` に設定すると、コネクタは BigQuery Storage Write API を使用して書き込みを行います。
  + `indirect` に設定すると、コネクタは Google Cloud Storage に書き込み、読み取り操作を使用して BigQuery に転送します。Google Cloud サービスアカウントには適切な GCS アクセス許可が必要です。

## Google BigQuery での間接書き込みを使用する
<a name="aws-glue-programming-etl-connect-bigquery-indirect-write"></a>

この例では、Google Cloud ストレージにデータを書き込み、それを Google BigQuery にコピーする間接書き込みを使用しています。

**前提条件:**

Google Cloud Storage の一時的なバケット、{{temporaryBucket}} が必要になります。

AWS Glue の GCP サービスアカウントの GCP IAM ロールには、{{temporaryBucket}} にアクセスするための適切な GCS アクセス許可が必要です。

**追加設定:**

**BigQuery による間接書き込みを設定するには:**

1. [BigQuery 接続を設定する](#aws-glue-programming-etl-connect-bigquery-configure) にアクセスして検索するか、GCP 認証情報の JSON ファイルを再ダウンロードします。ジョブで使用する Google BigQuery AWS Glue 接続の AWS Secrets Manager シークレットである {{secretName}} を特定します。

1. 認証情報 JSON ファイルを、適切に安全な Amazon S3 の場所にアップロードします。ファイルへのパス、{{s3secretpath}} は、今後の手順に備えて保持してください。

1. {{secretName}} を編集し、`spark.hadoop.google.cloud.auth.service.account.json.keyfile` キーを追加します。{{s3secretpath}} に値を設定します。

1. AWS Glue ジョブに、{{s3secretpath}} にアクセスするための Amazon S3 IAM アクセス許可を付与します。

一時的な GCS バケットの場所を書き込みメソッドに指定できるようになりました。`indirect` がこれまでデフォルトだったように、`writeMethod` を指定する必要はありません。

```
bigquery_write = glueContext.write_dynamic_frame.from_options(
    frame={{frameToWrite}},
    connection_type="bigquery",
    connection_options={
        "connectionName": "{{connectionName}}",
        "parentProject": "{{parentProject}}",
        "temporaryGcsBucket": "{{temporaryBucket}}",
        "table": "{{tableName}}",
    }
)
```