

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

AWS Glue for Spark を使用して、AWS Glue 4.0 以降のバージョンの Vertica のテーブルからの読み取りとテーブルへの書き込みを行うことができます。SQL クエリを使用して、Vertica から何を読み取るかを定義できます。AWS Glue 接続を介して AWS Secrets Manager で保存されているユーザー名およびパスワードの認証情報を使用して Vertica に接続します。

Vertica の詳細については、[Vertica ドキュメント](https://www.vertica.com/docs/9.3.x/HTML/Content/Authoring/UsingVerticaOnAWS/UsingVerticaOnAWS.htm)を参照してください。

## Vertica 接続の設定
<a name="aws-glue-programming-etl-connect-vertica-configure"></a>

AWS Glue から Vertica に接続するには、Vertica 認証情報を作成して AWS Secrets Manager シークレットに保存し、そのシークレットを Vertica AWS Glue 接続に関連付ける必要があります。Vertica インスタンスが Amazon VPC 内にある場合は、AWS Glue Vertica 接続にネットワークオプションを提供する必要もあります。データベースの読み取りおよび書き込み時に一時ストレージとして使用する Amazon S3 バケットまたはフォルダが必要です。

AWS Glue から Vertica に接続するには、いくつかの前提条件を満たす必要があります。
+ データベースの読み取りおよび書き込み時に一時ストレージとして使用する Amazon S3 バケットまたはフォルダ。*tempS3Path* によって参照されます。
**注記**  
AWS Glue ジョブデータプレビューで Vertica を使用する場合、一時ファイルは *tempS3Path* から自動的に削除されない場合があります。一時ファイルを確実に削除するには、**[データプレビュー]** ペインで **[セッションの終了]** を選択して、データプレビューセッションを直接終了します。  
データプレビューセッションが直接終了することを保証できない場合は、Amazon S3 ライフサイクル構成を設定して古いデータを削除することを検討してください。ジョブの最大実行時間にマージンを加えた値に基づいて、49 時間を超える時間が経過しているデータを削除することをお勧めします。Amazon S3 ライフサイクルの設定の詳細については、Amazon S3 ドキュメントの「[ストレージのライフサイクルの管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)」を参照してください。
+ AWS Glue ジョブロールに関連付けることができる、Amazon S3 パスに対する適切な許可を持つ IAM ポリシー。
+ Vertica インスタンスが Amazon VPC 内にある場合は、トラフィックがパブリックインターネットを経由することなく、AWS Glue ジョブが Vertica インスタンスと通信できるように Amazon VPC を設定します。

  Amazon VPC で、AWS Glue がジョブの実行中に使用する **[VPC]**、**[サブネット]**、および **[セキュリティグループ]** を特定または作成します。さらに、Vertica インスタンスとこの場所の間のネットワークトラフィックを許可するように Amazon VPC が設定されているようにする必要があります。ジョブは、Vertica クライアントポート (デフォルトは 5433) との TCP 接続を確立する必要があります。ネットワークレイアウトに基づいて、セキュリティグループルール、ネットワーク ACL、NAT ゲートウェイ、およびピアリング接続の変更が必要になる場合があります。

その後、Vertica で使用できるように AWS Glue を設定する作業に進むことができます。

**Vertica に対する接続を設定するには:**

1. AWS Secrets Manager で、Vertica 認証情報、*verticaUsername* および *verticaPassword* を使用してシークレットを作成します。Secrets Manager でシークレットを作成するには、AWS Secrets Manager ドキュメントの [AWS Secrets Manager シークレットを作成する](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html) にあるチュートリアルに従ってください。シークレットを作成したら、次のステップのためにシークレット名 *secretName* を保存しておきます。
   + **[key/value ペア]** を選択する際に、*verticaUsername* という値を持つキー `user` のペアを作成します。
   + **[key/value ペア]** を選択する際に、*verticaPassword* という値を持つキー `password` のペアを作成します。

1. AWS Glue コンソールで、「[AWS Glue 接続の追加](console-connections.md)」にあるステップに従って接続を作成します。接続を作成したら、次のステップのために接続名 *connectionName* を保存しておきます。
   + **[接続タイプ]** を選択する際に、[Vertica] を選択します。
   + **[Vertica ホスト]** を選択する場合は、Vertica インストールのホスト名を入力します。
   + **[Vertica ポート]** を選択すると、Vertica インストールを使用できるポートが選択されます。
   + **[AWS Secret]** をクリックして、*secretName* を入力します。

1. 次の状況では、追加の設定が必要になる場合があります。
   + 

     Amazon VPC の AWS でホストされている Vertica インスタンスの場合
     + Vertica セキュリティ認証情報を定義する AWS Glue 接続に、Amazon VPC 接続に関する情報を提供します。接続を作成または更新する際に、**[ネットワークオプション]** で **[VPC]**、**[サブネット]**、および **[セキュリティグループ]** を設定します。

AWS Glue Vertica 接続を作成した後、接続メソッドを呼び出す前に次のステップを実行する必要があります。
+ AWS Glue ジョブの許可に関連付けられた IAM ロールを *tempS3Path* に付与します。
+ AWS Glue ジョブに関連付けられている IAM ロールに *secretName* を読み取るアクセス許可を付与します。
+ AWS Glue ジョブ設定で、**追加のネットワーク接続**として *connectionName* を指定します。

## Vertica からの読み取り
<a name="aws-glue-programming-etl-connect-vertica-read"></a>

**前提条件:** 
+ 読み取り元とする Vertica テーブル。Vertica データベース名である *dbName* とテーブル名である *tableName* が必要になります。
+ 認証情報を提供するように設定された AWS Glue Vertica 接続。認証情報を設定するには、前の手順「*Vertica に対する接続を設定するには*」のステップを実行します。AWS Glue 接続、*connectionName* の名前が必要になります。
+ 前述した一時ストレージに使用する Amazon S3 バケットまたはフォルダ。*tempS3Path* という名前が必要になります。`s3a` プロトコルを使用してこの場所に接続する必要があります。

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

```
dynamicFrame = glueContext.create_dynamic_frame.from_options(
    connection_type="vertica",
    connection_options={
        "connectionName": "connectionName",
        "staging_fs_url": "s3a://tempS3Path",
        "db": "dbName",
        "table": "tableName",
    }
)
```

SELECT SQL クエリを入力して、DynamicFrame に返された結果をフィルタリングしたり、複数のテーブルからデータセットにアクセスしたりすることもできます。

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

```
dynamicFrame = glueContext.create_dynamic_frame.from_options(
    connection_type="vertica",
    connection_options={
        "connectionName": "connectionName",
        "staging_fs_url": "s3a://tempS3Path",
        "db": "dbName",
        "query": "select * FROM tableName",
    },
)
```

## Vertica テーブルへの書き込み
<a name="aws-glue-programming-etl-connect-vertica-write"></a>

この例では、既存の DynamicFrame である *dynamicFrame* から Vertica に情報を書き込みます。テーブルに既に情報がある場合、AWS Glue は DynamicFrame からのデータを付加します。

**前提条件:** 
+ 書き込み先とする現在または希望のテーブル名である *tableName*。対応する Vertica データベース名である *dbName* も必要になります。
+ 認証情報を提供するように設定された AWS Glue Vertica 接続。認証情報を設定するには、前の手順「*Vertica に対する接続を設定するには*」のステップを実行します。AWS Glue 接続、*connectionName* の名前が必要になります。
+ 前述した一時ストレージに使用する Amazon S3 バケットまたはフォルダ。*tempS3Path* という名前が必要になります。`s3a` プロトコルを使用してこの場所に接続する必要があります。

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

```
glueContext.write_dynamic_frame.from_options(
    frame=dynamicFrame,
    connection_type="vertica",
    connection_options={
        "connectionName": "connectionName",
        "staging_fs_url": "s3a://tempS3Path",
        "db": "dbName",
        "table": "tableName",
    }
)
```

## Vertica 接続オプションのリファレンス
<a name="aws-glue-programming-etl-connect-vertica-reference"></a>
+ `connectionName` — 必須。読み込み/書き込みに使用されます。認証およびネットワークの情報を接続方法に提供するように設定された AWS Glue Vertica 接続の名前。
+ `db` — 必須。読み込み/書き込みに使用されます。接続方法がインタラクションする Vertica 内のデータベースの名前。
+ `dbSchema` — テーブルを識別する必要がある場合は必須です。読み込み/書き込みに使用されます。デフォルト: `public`。接続メソッドがインタラクションするスキーマの名前。
+ `table` — 書き込みの場合は必須。`query` が指定されていない限り、読み取りの場合は必須。読み込み/書き込みに使用されます。接続メソッドがインタラクションするテーブルの名前。
+ `query` — 読み取りに使用。Teradata から読み取るときに何を取得するかを定義する SELECT SQL クエリ。
+ `staging_fs_url` — 必須。読み込み/書き込みに使用されます。有効な値: `s3a` URL。一時ストレージに使用する Amazon S3 バケットまたはフォルダの URL。