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 化すれば、ログインできるようになりますので、そちらの方をおすすめします。
[非推奨] Secure Cookie をオフにして、HTTP でもログインできるようにする
以下のような 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 アクセストークン発行方法は、こちら ↓ を参考にしてください。
shpat_xxx
という Shopify アクセストークンが発行されます。
データソースとして Google Spread Sheet を設定
GCP にアクセスして、Google Sheets API を有効化
「+認証情報を作成」をクリック
[サービスアカウント]を選択
生成された JSON を入力
次にスプシへの閲覧権限を付与
参考
いざ転送設定を設定しようとプライマリーキーが無いと言われる(こともある)
その場合は、手動でプライマリーキーとしたい列にチェックをいれましょう。
データデスティネーションとして 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.yaml
や secret.yaml
で設定をしている場合は、
$ abctl local install --values values.yaml --secret secret.yaml
とする。
Discussion