🧑‍✈️

Airbyte を使った Shopify/Google スプレッドシート → BigQuery データ転送

に公開

こんにちは🐍

株式会社 Tsuzucle SPRING 開発事業部にフリーランスインフラエンジニアとして参画している はらしゅん です。

今回は案件で Airbyte を使って、Shopify や Google スプレッドシート上のデータを BigQuery や RDB に転送する仕組みを構築しました。

  • 最新の Airbyte 1.5.0 を IaaS(GCE, EC2 等)にインストールする方法
  • Shopify データを BigQuery に転送する設定方法
  • Google スプレッドシート データを RDB に転送する設定方法

についてご紹介したいと思います。

今回の構成図

STEP1️⃣:Airbyte インストール

インスタンス起動

今回、私は GCE で以下のような OS とインスタンスサイズにしました。(※ 当初はね)

  • OS:debian-12-bookworm-v20250113
  • マシンタイプ:e2-standard-2 (vCPU: 2 / RAM: 8 GB)
  • ディスクサイズ:50 GB

ポイント①:マシンタイプ

マシンタイプは、最低でも e2-standard-2 (vCPU: 2 / RAM: 8 GB) にしましょう。
e2-medium (vCPU: 2 (shared) / RAM: 4 GB) だと、Airbyte を起動させることができませんでした・・

ポイント②:ディスクサイズ

ディスクサイズは、最低でも 30GB できれば、50GB ぐらいにしましょう。
デフォルトで 20個以上のコンテナが起動し、初期状態で 25GB ぐらいのディスクを消費します。

Airbyte インストール

まずはじめに Docker をインストールする必要があります🐋

Docker のインストール方法は、その時々や OS 等々によって様々バリエーションがありますし、
本題ではないので、ここでは割愛させていただきます。

Docker インストール完了後、以下のコマンドを実行して、Airbyte 管理コマンドラインツール abctl をインストール

# curl -LsfS https://get.airbyte.com | bash -

以下のコマンドを実行してAirbyteをインストール

# abctl local install

インストールと言っても、終わると Airbyte が起動してくれます。
10数分かかりますので、コーヒーでも淹れて待ちましょう。☕

ログインパスワードを取得するには、以下のコマンドを実行します。

# abctl local credentials

ログイン ID を設定するには、以下のコマンドを実行します。

# abctl local credentials --email {メールアドレス}

この状態で、http://{サーバーのグローバル IP}:8000 にアクセスすると、
Airbyte のログイン画面が見れるのですが、

ログインできません・・😢

Secure Cookie をオフにして、ログインできる方法もこのあと後述しますが、
カスタムドメインを与えて、プロキシとして Nginx を入れ、Let`s Encript で SSL 化すれば、ログインできるようになりますので、そちらの方をおすすめします。

以下のような 2つの YAML ファイルを用意

values.yaml

global:
  auth:
    cookieSecureSetting: "false"

secrets.yaml

apiVersion: v1
kind: Secret
metadata:
  name: airbyte-auth-secrets
type: Opaque
stringData:
  instance-admin-password: {設定したいパスワード}

今一度、abctl local install を実行

# abctl local install --values values.yaml --secret secrets.yaml

これで、Secure Cookie 機能がオフになり、HTTP でもログインできるようになります。

小話

ちなみにこの Airbyte どのように動いているかと言うと・・

GCE のホスト OS 上で、docker ps で確認できる1つの Docker コンテナの中で、
なんと Kubernetes クラスターが動いています。

Docker コンテナに、SSH し、

$ docker exec -it <container_id> /bin/bash

そのコンテナ内で、

root@airbyte-abctl-control-plane:/# kubectl get po --all-namespaces

と打つと・・

NAMESPACE            NAME                                                      READY   STATUS      RESTARTS       AGE
airbyte-abctl        airbyte-abctl-airbyte-bootloader                          0/1     Completed   0              40h
airbyte-abctl        airbyte-abctl-connector-builder-server-676dcbdb9f-jp5lj   1/1     Running     12 (16h ago)   2d
airbyte-abctl        airbyte-abctl-cron-698769c87f-cxjsw                       1/1     Running     5 (16h ago)    2d
airbyte-abctl        airbyte-abctl-pod-sweeper-6f867c5b7d-msfps                1/1     Running     5 (16h ago)    2d
airbyte-abctl        airbyte-abctl-server-6b4cc7bcf4-8q725                     1/1     Running     5 (16h ago)    40h
airbyte-abctl        airbyte-abctl-temporal-84857c78b5-fgslh                   1/1     Running     5 (16h ago)    2d
airbyte-abctl        airbyte-abctl-webapp-7d6f996994-jrdhw                     1/1     Running     15 (16h ago)   2d
airbyte-abctl        airbyte-abctl-worker-7cccc9475d-prjd6                     1/1     Running     12 (16h ago)   2d
airbyte-abctl        airbyte-abctl-workload-api-server-7686bfb84-nsz5q         1/1     Running     12 (16h ago)   2d
airbyte-abctl        airbyte-abctl-workload-launcher-84b4995f86-hhqh9          1/1     Running     14 (16h ago)   2d
airbyte-abctl        airbyte-db-0                                              1/1     Running     4 (16h ago)    41h
airbyte-abctl        airbyte-minio-0                                           1/1     Running     4 (16h ago)    41h
ingress-nginx        ingress-nginx-controller-5f54f7f779-2vzn2                 1/1     Running     5 (16h ago)    2d
kube-system          coredns-76f75df574-gfx68                                  1/1     Running     5 (16h ago)    2d
kube-system          coredns-76f75df574-skd5h                                  1/1     Running     5 (16h ago)    2d
kube-system          etcd-airbyte-abctl-control-plane                          1/1     Running     5 (16h ago)    2d
kube-system          kindnet-kzkdc                                             1/1     Running     5 (16h ago)    2d
kube-system          kube-apiserver-airbyte-abctl-control-plane                1/1     Running     5 (16h ago)    2d
kube-system          kube-controller-manager-airbyte-abctl-control-plane       1/1     Running     8 (16h ago)    2d
kube-system          kube-proxy-c824h                                          1/1     Running     5 (16h ago)    2d
kube-system          kube-scheduler-airbyte-abctl-control-plane                1/1     Running     7 (16h ago)    2d
local-path-storage   local-path-provisioner-888b7757b-qz4d8                    1/1     Running     10 (16h ago)   2d

20個以上の Pod が稼働していることが確認できます💡

つまり図にするとこうゆうことですね。

今後、このような動かし方をする OSS 、増えそうですね。

Let's Encript で SSL 化

静的 IP 付与

WIP

カスタムドメイン付与

WIP

Nginx インストール

$ sudo apt update -y
$ sudo apt dist-upgrade -y
$ sudo apt autoremove -y
$ sudo apt install nginx -y

Let's Encript で SSL 化

$ apt install certbot python3-certbot-nginx -y
$ certbot --nginx -d {カスタムドメイン名}

/etc/nginx/sites-available/default を編集

変更点のみ記載

- root /var/www/html;
+ # root /var/www/html;

location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
-       try_files $uri $uri/ =404;
+       # try_files $uri $uri/ =404;

+       proxy_pass http://localhost:8000; # Airbyte の UI が動作しているポート
+       proxy_set_header Host $host;
+       proxy_set_header X-Real-IP $remote_addr;
+       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# Nginxの設定ファイルの構文テスト
$ nginx -t 

# 再起動
$ systemctl restart nginx

これで、Secure Cookie をオフにせずとも、
https://{カスタムドメイン名}
で Airbyte にログインできるようになりました💡

crontab に更新ジョブを登録しておきます。

crontabファイルを開きます:

sudo crontab -e

以下の行を追加します:

0 0,12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

この設定により、毎日午前0時と午後12時にCertbotが証明書の更新を試みます123。

--quietオプションは、出力を抑制します。

--post-hookオプションは、更新後にNginxを再読み込みします。

設定したcron jobが正しく機能しているか確認するには、以下のコマンドを使用します:

sudo systemctl status cron

その他

その他、私が行ったこと

  • 日次バックアップ設定
  • パッチ当てスケジュール設定

STEP2️⃣:データソース、データディスティネーション、同期設定同期実行

データソースとして Shopify を設定

Shopify アクセストークン発行方法は、こちら ↓ を参考にしてください。

https://zenn.dev/tsuzucle_tech/articles/e02c4aba372e54

shpat_xxx という Shopify アクセストークンが発行されます。

データソースとして Google Spread Sheet を設定

GCP にアクセスして、Google Sheets API を有効化

「+認証情報を作成」をクリック

[サービスアカウント]を選択

生成された JSON を入力

次にスプシへの閲覧権限を付与

参考
https://zenn.dev/gon9a/articles/01f74229ea5957

いざ転送設定を設定しようとプライマリーキーが無いと言われる(こともある)

その場合は、手動でプライマリーキーとしたい列にチェックをいれましょう。

データデスティネーションとして BigQuery を設定

WIP

データデスティネーションとして RDB を設定

WIP

同期設定

WIP

同期ジョブ実行

WIP

同期ジョブが始まらない問題発生とその解消方法

以下のように、インスタンススペックを1つ上げることで、成功するようになりました。

Head Before After
GCE e2-standard-2 e2-standard-4
EC2 t3.xlarge t3.x2large

Airbyte バージョンアップ

1.4.0 以降で、abctl を使用してインストールした場合、

$ abctl local install 

とするだけ。

values.yamlsecret.yaml で設定をしている場合は、

$ abctl local install --values values.yaml --secret secret.yaml

とする。

株式会社Tsuzucle Tech Blog

Discussion