Informatica Data LoaderでRedshiftへ楽々データロード

AWS re:Invent 2022にて[Informatica Data Loader for Amazon RedshiftがGA](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-redshift-integration-informatica-data-loader-tool-data-uploads/)されました。

本記事はこれからInformatica Data Loaderを使ってみたい方を対象とし、機能の概要やセットアップの手順、裏側の動きについて記載します。内容は基本的に[AWS公式ブログ: Simplify data loading on the Amazon Redshift console with Informatica Data Loader
](https://aws.amazon.com/blogs/big-data/simplify-data-loading-on-the-amazon-redshift-console-with-informatica-data-loader/)の手順をなぞっていますが、IAMやセキュリティグループの設定まわりで迷ったポイントを独自に追記しています。

本記事ではInformatica Data Loaderの機能の詳細までは触れないため、差分ロードやフィルタリング等の各種機能については公式マニュアル[Informatica Online Help](https://onlinehelp.informatica.com/IICS/prod/IDLF/en/index.htm#page/ab-welcome/Welcome_to_Data_Loader.html)も合わせて参照してください。

## 特徴

Informatica Data Loader for Redshiftは様々なデータソースからAmazon Redshiftへサーバレスなデータ連携が行える機能です。無料で提供されているため、気軽に使い始めることができます。

利用可能なデータソースは以下の41種類で（2022年12月現在）、各種SaaS、OSS/商用データベース、オブジェクトストレージに対応しています。有名どころだとAmazon Aurora, Google Analytics, Google Cloud Spanner, Jira, MongoDB, MySQL, OData, Oracle, PostgreSQL, Salesforce, SqlServerあたりでしょうか。BigQuery, Snowflake, Teradataには対応していませんでした。
連携先はRedshiftのみで、ProvisionedとServerlessいずれも対応しています。
![ScreenShot 2022-11-29 at 16.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/f76366dd-40fa-af47-13d3-f194fdb68345.png)
![ScreenShot 2022-11-29 at 16.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/fd1b5eff-0b73-bf8b-23a2-5be56e16c993.png)
Redshift以外の連携先を使いたい場合はSnowflake, BigQuery, Databricks, Azure用の[Informatica Data Loader](https://www.informatica.com/resources/articles/what-is-a-data-loader.html)も用意されています。

データ連携に特化した様々なオプションが使用できます。ただし、集計や結合などの複雑なETL操作は対応していません。
- オブジェクトレベル、列レベル、行レベルのフィルタリング
- 全件・差分ロード
- 差分キャプチャ (CDC)
- スキーマドリフトの検知

## 準備

以下では[AWS公式ブログ](https://aws.amazon.com/blogs/big-data/simplify-data-loading-on-the-amazon-redshift-console-with-informatica-data-loader/)の手順に沿いSalesforceデータソースをRedshiftに連携してみます。

1. Redshiftクラスターもしくはワークグループを作成します。
    1. プライベートサブネットにある場合はそのままだとInformaticaから接続できないため、パブリックアクセスを有効化します。
![ScreenShot 2023-01-16 at 12.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/a22800ef-993a-5120-aa48-4c9b95ea6173.png)
    1. 上記はRedshift Serverlessの設定画面ですが、Provisionedクラスターでも同様です。
1. Redshiftのセキュリティグループを編集し、Informaticaからのインバウンド通信を許可します。
    1. 許可するIPアドレスは、[Informaticaのリージョンとホワイトリスト対象のIPアドレス](https://knowledge.informatica.com/s/article/FAQ-What-are-the-IP-addresses-I-need-to-whitelist-so-that-Data-Loader-can-access-my-sources-and-targets?language=en_US)に記載があります。Informaticaのリージョン（NA/EMEA/APAC/UK）によってIPアドレスが異なるので、データソース及び使用するAWSリージョンとの距離を考慮しつつInformaticaのリージョンを選んでおきます。NA (North America) は必要なIPアドレスが多いので設定が少々大変ですね。ここではEMEAリージョンを選択しました。
    1. インバウンドルールはType: Redshiftを選びます。InformaticaはRedshiftのPort: 5439へJDBCでアクセスするためです。
![ScreenShot 2022-11-29 at 15.11.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/58ceac86-7275-16a6-c6a5-cde7f798ca5f.png)
1. Redshiftと同じリージョンにS3バケットを作成します。データをロードする前のステージングに使用します。
1. （データソースがSalesforceの場合）Salesforceの開発者用アカウントを作成します。
    1. Salesforceの開発者用アカウントは最初からダミーデータが入っているのでテストするのに便利です。
    1. 初回は[セキュリティトークンの再発行](https://help.salesforce.com/s/articleView?id=sf.user_security_token.htm&type=5)が必要です。Informaticaから接続する際に使用します。
1. IAMユーザを作成し、アクセスキーを発行します。InformaticaからS3へデータを送る際に使用します。
    1. ポリシーはAmazonS3FullAccessをアタッチします。実際はもう少し権限を絞れると思いますが、検証環境のため既存のAWS管理ポリシーを使用しました。

## Informatica Data Loaderへ登録

この機能はAWSコンソールからではなくInformatica Data LoaderのWebコンソールに登録・ログインして利用するため、初回は登録が必要です。

Provisonedクラスター用のRedshiftコンソールへ行き、Informatica Data Loaderをクリックします。Redshift Serverlessを使う場合でも入り口はProvisionedのコンソールです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/0fad00a3-75e4-858a-60e1-e08476490e86.png)

Complete Informatica IntegrationをクリックするとInformaticaのサイトが開きます。
![ScreenShot 2022-11-29 at 13.02.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/6348df91-c9ac-ea4d-ebf7-27bd051ff947.png)

必要な情報を入力し、SUBMITするとメールが飛んできます。メールのリンクをクリックすると登録完了となりInformaticaにログインされます。
![ScreenShot 2022-11-29 at 13.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/755f447d-d953-b7d9-1bc8-da1ec71e5f7c.png)

## データソースへ接続

左上のNewをクリックすると新しいデータ連携タスクを作成する画面になります。New Connectionをクリックします。
![ScreenShot 2022-11-29 at 13.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/c71e34f2-1c4d-350f-8cba-b6ac1b8c4a40.png)

接続したいデータソースを選びます。ここではSalesforceを選びました。
![ScreenShot 2022-11-29 at 13.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/f11a42d4-5bf9-784c-e314-7247fdfd07aa.png)

以下の項目を入力します。
- **Connection Name**: 任意の接続名
- **User Name**: Salesforceのユーザ名
- **Password**: Salesforceのパスワード
- **Security Token**: Salesforceのセキュリティトークン

Testをクリックして接続できることを確認し、Addします。
![ScreenShot 2022-11-29 at 13.22.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/dc98324d-e05e-68f1-24f7-e117f09374c1.png)

データを取ってくる際に特定のオブジェクトやフィールドの除外、データのフィルタ、Primary Keyの定義、ウォーターマークの定義が設定可能です。例として特定のオブジェクトのみを取ってきたい場合はDefine Objectsの"+"をクリックします。
![ScreenShot 2022-11-29 at 13.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/969343e3-c0a7-6e5b-db47-1d0d9e955c4f.png)

Salesforceから特定オブジェクトのみチェックボックスを入れることで、他のオブジェクトはRedshiftへの連携対象外となります。ここではAccountのみチェックします。
![ScreenShot 2022-11-29 at 13.29.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/f9fee14c-232c-33a6-7b00-513de0e15ee7.png)

ちなみにデフォルトだとウォーターマーク（処理済のレコードを識別する情報）がオンになっているため、同じタスクを複数回実行してもRedshiftへは1回しかレコード連携されません。これを無効にしたい場合はDefine Watermark FieldsでWatermark fields not requiredを指定します。
![ScreenShot 2022-11-29 at 15.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/69b59b88-46d3-5bb9-6c3a-12d63f7e1f3a.png)

## Redshiftへの接続

続いてConnect TargetにてNew Connectionをクリックし、Redshiftへの接続を作成します。
![ScreenShot 2022-11-29 at 13.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/5b36be68-5302-5c35-7b17-2f0e992690c5.png)

以下の項目を入力したらTestをクリックして接続できることを確認し、Addします。
- **Connection Name**: 任意の接続名
- **Username**: Redshiftのデータベースユーザ名
- **Password**: Redshiftのデータベースユーザのパスワード
- **Access Key ID**: IAMユーザのアクセスキーID
- **Secret Access Key**: IAMユーザのシークレットアクセスキー
- **JDBC URL**: RedshiftのJDBC接続用URL(jdbc:redshift://*:5439/dev)
![ScreenShot 2022-11-29 at 13.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/af27a0d0-89ac-ece7-4e3d-d014b79a5855.png)

Pathはテーブルを作りたいスキーマ名を指定します。Load to existing tables? は No, create new tables every time を選択しました。
![ScreenShot 2022-11-29 at 14.01.43 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/b5b6c64d-81c2-1dd3-5e77-1f20088d4134.png)

続いてAdvanced Optionsでステージング用のS3バケットを指定し(s3://は不要)、NextをクリックしてからSaveします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/fc4f48f7-67e8-7eb3-0f14-e48e6ec0ab3b.png)

InformaticaはJDBCでRedshiftに接続しているので、INSERTを何度も発行することもできますがデータセットが大きい場合はクエリを何度も発行することになり非効率です。S3バケットを使用することで、Informaticaはデータソースから抽出したデータをS3にステージングし、COPYコマンドを発行してS3からRedshiftへまとめてデータをロードしてくれます。

## ジョブ実行

Runをクリックするとジョブが開始されます。完了するとStatusがSuccessに変わります。
![ScreenShot 2022-11-29 at 14.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/f4836c6a-41b5-4c2e-6a71-1aa376a8a589.png)

## 作成されたテーブルを見てみる

AWSコンソールでQuery Editor V2を開き、テーブルの中身を確認します。

```SQL
select * from スキーマ名."Account";
```
![ScreenShot 2022-11-29 at 14.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327040/baa5081d-3900-2a32-eb14-8645b05e5af3.png)

無事データが入っていることが確認できました。

Redshift側のテーブルは、Informatica Data LoaderがデータソースのスキーマをRedshiftにマッピングして自動生成してくれています。念のためテーブルのDDLを確認してみます。

```SQL
show table スキーマ名."Account";
```

```SQL
CREATE TABLE salesforce.account (
    id character varying(18) NOT NULL ENCODE lzo distkey,
    isdeleted integer NOT NULL ENCODE az64,
    masterrecordid character varying(18) ENCODE lzo,
    name character varying(255) NOT NULL ENCODE lzo,
    type character varying(255) ENCODE lzo,
    parentid character varying(18) ENCODE lzo,
    billingstreet character varying(255) ENCODE lzo,
    billingcity character varying(40) ENCODE lzo,
    billingstate character varying(80) ENCODE lzo,
    billingpostalcode character varying(20) ENCODE lzo,
    billingcountry character varying(80) ENCODE lzo,
    billinglatitude numeric(18,15) ENCODE az64,
    billinglongitude numeric(18,15) ENCODE az64,
    -- ~~ 長いので中略 ~~
    slaserialnumber__c character varying(10) ENCODE lzo,
    slaexpirationdate__c timestamp without time zone ENCODE az64,
    PRIMARY KEY (id)
)
DISTSTYLE AUTO;
```

列ごとに適切なデータ型が使い分けられており良さそうです。

## InformaticaがRedshiftに発行しているクエリ

Informaticaはデータロード時に追加・更新があったレコードだけターゲットのテーブルに反映できるのですが、裏側でどんなクエリを流しているか見てみます。Redshift Serverlessの場合は[SYS_QUERY_HISTORY](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/SYS_QUERY_HISTORY.html)、Provisionedの場合は[STL_QUERY](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_STL_QUERY.html)システムテーブルのquerytxt列で発行されたクエリが取得できます。要約すると以下の流れでした。

1. 適当な名前のTEMPテーブルを作る（ターゲットテーブルと同じスキーマ）
1. TEMPテーブルにS3からデータをCOPYする
1. トランザクション開始
1. ターゲットテーブルのレコードをTEMPテーブルでUPDATEする
1. ターゲットテーブルにないレコードをTEMPテーブルからINSERTする
1. コミット

## 気を付けること

- Informatica Data Loader自体は無料で使えますが、Redshift等の周辺サービスへの課金は発生します。例えばRedshift Serverlessへ定期的にデータをロードする場合、Informatica側でジョブが動くたびにRedshift側でクエリが発行されるので定期的にRPU時間課金が発生します。
- Informatica Data Loaderを使用するには以下の設定が必要なので、セキュリティ要件を満たせるか確認するとよいでしょう。
    - APIキー付きのIAMユーザの作成
    - Redshiftのパブリックアクセス設定（プライベートサブネットの場合）
    - 外部IPアドレスからRedshiftへのインバウンド通信設定
    - データが一度Informaticaの管理するインスタンスを経由する（データソース→Informaticaインスタンス→S3→Redshift）

## まとめ

Informatica Data Loaderを使ってRedshiftへデータを連携する方法について検証しました。Informaticaを触るのは初めてでしたが、特に迷うことなくデータを連携することができました。データ型のマッピングやターゲットテーブルの作成はデータ連携のしくみを作るときに手間がかかる部分なのですが、Informatica側でやってくれるのは楽ですね。外部DBのデータをクイックに持ってきてRedshiftで分析したり、SaaSからRedshiftへ定期的にデータを取り込むなど色々な使い方ができそうです。