FivetranのDestinationにAmazon S3を設定してみた #Fivetran

2024.02.19

こんにちは、スズです。

先日FivetranのAmazon S3のConnectorの追加についてご紹介しましたが、FivetranではAmazon S3をDestinationに追加することもできます。

本記事では、DestinationとしてAmazon S3を設定する方法についてご紹介します。

前提条件

本記事はセットアップガイドの内容を参考に設定を行っていきます。

セットアップガイドには、前提条件として以下が必要と記載されています。

  • 同じAWSリージョン内に複数のリソースグループを持たないAWSアカウント
  • サポートされているAWSリージョンにあるAmazon S3バケット
  • Amazon S3と同じリージョンにあるAWS Glue Data Catalogへのアクセス

事前準備

AWSでのIAMロールの準備は後述の手順の中でご紹介しますが、接続先となるAmazon S3のバケットを用意しておきます。今回、接続先のバケットとしてcm-suzu-fivetran-sydneyを用意しました。AWSリージョンはアジアパシフィック (シドニー) ap-southeast-2を指定しています。
なお、今回はバケットの直下をDestinationと指定するためバケットのみ用意していますが、データの出力先としてバケット配下のフォルダを指定したい場合は、あらかじめフォルダも作成しておきます。

Amazon S3のDestinationのセットアップ

FivetranでDestinationを追加

DestinationにAmazon S3を追加していきます。Fivetranの[Destinations]の画面から[Add destination]をクリックします。

Destinationの名前を入力し、[Add]をクリックします。

[S3 Data Lake]を選択します。

BuketにS3バケットの名前、Bucket RegionにS3バケットのリージョンなどの設定を行います。S3バケットの接続にはIAMロールのARNを使用します。この設定画面にて表示されたExternal IDを使って、AWS上でIAMロールの作成を行います。

IAMロールの作成

S3バケットのポリシーの作成

まずはIAMポリシーを作成します。AWSのIAMの[ポリシー]の画面を開き、[ポリシーの作成]をクリックします。

アクセス許可を指定の画面では[JSON]を選択します。ポリシーの定義はセットアップガイドに以下の記載がありますので、セットアップガイドからコピーして貼り付けます。{your-bucket-name}の部分はFivetranで接続するAmazon S3のバケットの名前に置き換えます。Destinationとしてバケット内の特定のプレフィックスを指定する場合は、{prefix_path}にそのプレフィックスに置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
        "Sid": "AllowListBucketOfASpecificPrefix",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket"
        ],
        "Resource": [
            "arn:aws:s3:::{your-bucket-name}"
        ],
        "Condition": {
            "StringLike": {
                "s3:prefix": [
                    "{prefix_path}/*"
                 ]
             }
          }
        },
        {
        "Sid": "AllowAllObjectActionsInSpecificPrefix",
        "Effect": "Allow",
        "Action": [
            "s3:DeleteObjectTagging",
            "s3:ReplicateObject",
            "s3:PutObject",
            "s3:GetObjectAcl",
            "s3:GetObject",
            "s3:DeleteObjectVersion",
            "s3:PutObjectTagging",
            "s3:DeleteObject",
            "s3:PutObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::{your-bucket-name}/{prefix_path}/*"
        ]
        }
    ]
}

設定後、画面の下の方にある[次へ]をクリックして先に進みます。

ポリシー名を設定します。

必要に応じてタグを設定し、[ポリシーの作成]をクリックします。これでS3バケットのIAMポリシーを作成できました。

AWS Glue Data Catalogのポリシーの作成

続いてAWS Glue Data CatalogのIAMポリシーを作成します。[ポリシー]の画面から[ポリシーの作成]をクリックします。

アクセス許可を指定の画面では[JSON]を選択し、セットアップガイドにあるポリシーをコピーして貼り付けます。セットアップガイドには「全てのGlueデータベースとそのテーブルにアクセスできるようにする」場合と、「アクセスを特定のGlueデータベースに制限する」場合の2種類のポリシーが用意されていますので、要件に適したポリシーをコピーします。今回は「全てのGlueデータベースとそのテーブルにアクセスできるようにする」ポリシーを使用します。ポリシー内の{your-catalog-region}にはS3バケットのリージョンを、{your-account-id}にはAWSアカウントIDを指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
          "Sid": "SetupFormTest",
          "Effect": "Allow",
          "Action": [
              "glue:DeleteDatabase"
           ],
           "Resource": [
               "arn:aws:glue:{your-catalog-region}:{your-account-id}:database/fivetran*",
               "arn:aws:glue:{your-catalog-region}:{your-account-id}:catalog",
               "arn:aws:glue:{your-catalog-region}:{your-account-id}:table/fivetran*/*",
               "arn:aws:glue:{your-catalog-region}:{your-account-id}:userDefinedFunction/fivetran*/*"
           ]
       },
       {
          "Sid": "AllConnectors",
          "Effect": "Allow",
          "Action": [
              "glue:GetDatabase",
              "glue:UpdateDatabase",
              "glue:CreateTable",
              "glue:GetTables",
              "glue:CreateDatabase",
              "glue:UpdateTable",
              "glue:BatchDeleteTable",
              "glue:DeleteTable",
              "glue:GetTable"
           ],
           "Resource": [
               "arn:aws:glue:{your-catalog-region}:{your-account-id}:*"
           ]
       }
    ]
}

設定後、画面の下の方にある[次へ]をクリックして先に進みます。

ポリシー名を設定します。

必要に応じてタグを設定し、[ポリシーの作成]をクリックします。これでAWS Glue Data CatalogのIAMポリシーを作成できました。

IAMロールの作成

IAMロールを作成します。[ロール]の画面を開き、[ロールを作成]をクリックします。

信頼されたエンティティタイプは[AWSアカウント]を選択します。

AWSアカウントでは[別のAWSアカウント]を選択し、セットアップガイドに記載のあるFivetranのアカウントID834469178297を入力します。また、[外部IDを要求する]にチェックを入れます。入力する外部IDは、FivetranのConnectorのセットアップの画面に表示されたExternal IDを入力します。設定後、[次へ]をクリックします。

許可ポリシーとして先ほど作成した2つのIAMポリシーを選択し、[次へ]をクリックします。

ロール名を設定します。

必要に応じてタグを設定し、[ロールを作成]をクリックします。これでIAMロールを作成できました。

ARNの取得

作成したIAMロールからARNを取得します。作成したロールをクリックします。

ARNをコピーして取得します。

Fivetranで接続

Fivetranに戻り、Role ARNに先ほど取得したARNを設定します。その他Time Zoneなどを設定し、[Save & Test]をクリックします。

テストに成功しました。[View Destination]をクリックします。

これでAmazon S3をDestinationに追加することができました。

データの同期を試してみた

Destinationの追加ができましたので、試しにデータの同期を行ってみます。今回はZendesk SupportのConnectorを使ってデータを同期してみます。なお、Connectorで接続したZendeskはサンドボックスを使用しています。

こちらはZendesk SupportのConnectorのStatusの画面です。紫の矢印で指したタイミングで同期が行われています。左から1つ目の矢印のタイミングで初期同期が行われています。初期同期の後、6時間ごとに同期を行うスケジュールになっています。2回目、3回目の同期のタイミングではZendesk側でのデータの変更はありませんが、4回目の同期のタイミングになる前に、Zendeskにてチケットの起票(データが増える操作)を行っています。

S3バケットを確認してみます。バケットの配下には「zendesk」というフォルダが作成されています。

「zendesk」の中を参照すると、「article」や「brand」など、Zendesk SupportのConnectorのスキーマに応じてフォルダが作成されています。

「ticket」というフォルダの中を確認すると、「data」と「metadata」のフォルダがあります。

「data」の中を確認すると、parquet形式でデータが出力されています。最終更新日時が「2024/02/18 08:29:28 PM」となっているファイルと、「2024/02/19 12:46:56 PM」となっているファイルがあります。最終更新日時が「2024/02/18 08:29:28 PM」のファイルはFivetranからConnectorの初期同期を行った際に作成されたファイル、「2024/02/19 12:46:56 PM」のファイルは4回目の同期のタイミングで作成されたファイルです。2回目、3回目の同期のタイミングではデータに変更がなかったため、ファイルが作成されていないものとなります。

最終更新日時が「2024/02/18 08:29:28 PM」と「2024/02/19 12:46:56 PM」のファイルをダウンロードしてデータを確認してみます。parquet形式のデータの確認には、Alteryx Designer Cloudを使用しています。「2024/02/18 08:29:28 PM」のファイルでは初期同期のため、過去の全てのZendesk Supportのデータがファイル内に含まれています。

「2024/02/19 12:46:56 PM」のファイルに含まれるデータは1行となっています。初期同期からのデータの差分が、新しいファイルに出力されていることが確認できました。

最後に

FivetranのDestinationのAmazon S3についてご紹介しました。

参考