開発しているウマ育ノートという育成支援サイト、
SSSAPIでソース変更せず、データを更新できるようになったけど、
画像はサーバから配信してたので、画像も配信する形式にしたいなと思って、
いろいろ調べてみたときの備忘録。
公式ドキュメントだとこのあたり
・CNAME | カスタムドメイン | リクエスト エンドポイント
https://storage.googleapis.com/img.example.com/image.png
というURLを
https://img.example.com/image.png
でアクセスできるようにする。
設定の流れ
1. サブドメイン名を決める
※※これが重要※※
CNAMEを設定するために以下の条件がある。
- バケット名とサブドメイン名が同じ
- サブドメインのみ利用でき、トップレベルドメインは不可
これでハマった...
例として、サブドメイン名をimg.example.com
にする
また、
CNAME レコードでは、HTTP リクエストしかサポートされません。
という条件もあるので、Cloudflareじゃないとつらい。
2. バケットを作成する
次にバケットを作成する。
バケット名はimg.example.com
。
バケット全体を公開するので、
権限タブからallUsers
をStorageオブジェクト閲覧者
で追加。
公開アクセスについてはこのあたり。
・データの一般公開 | Cloud Storage
3. DNSにCNAMEを追加する
最後にCloudflareのCDNにCNAME
を追加。
storage.googleapis.com
ではなく、c.storage.googleapis.com.
なので注意
NAME TYPE DATA img CNAME c.storage.googleapis.com.
これで、https://img.example.com/image.png
でもアクセスできるように(´ω`)
gsutilでファイルをアップロードする
ファイルアップロードをコンソールからするのはつらいのでCLIを利用する。
公式ドキュメントだとこのあたり。
・クイックスタート: gsutil ツールの使用
・Uploading objects | Cloud Storage | Google Cloud
cpでアップロードする
シンプルなアップロードはこんな感じ。
#!/bin/bash BUCKET_NAME="img.example.com" FILE="./image.png" gsutil cp "./${FILE}" "gs://${BUCKET_NAME}/${FILE}"
・cp - Copy files and objects | Cloud Storage | Google Cloud
rsyncで同期する
特定のディレクトリと同期させたいときは、こんな感じ。
#!/bin/bash BUCKET_NAME="img.example.com" gsutil -m rsync -r -x ".*\.sh$|\.DS_Store$" . "gs://${BUCKET_NAME}/${f}"
・rsync - Synchronize content of two buckets/directories | Cloud Storage
ハマったところ
バケット名をサブドメイン名にしないといけない
最初、てきとうにつけてたらダメだった。。
公式ドキュメントをみると
CNAME レコードでは、ホスト名と、対応させる関連バケット名が必要です。
とのこと。。
gsutilでpython3.7系でないとだめ
- python3.9系では
gsutil
もgcloud
も動かない。。 - python3.8系だと
gsutil cp
は動くけど、gsutil rsync
はダメ。。 gsutil rsync
を使うときは、crcmod
が必要- Macだと
pip install -U crcmod
でOK gsutil help crcmod
を叩くと、各OSでのインストール方法などが表示される。
- Macだと
このあたりは、pyenvを使って3.7系を利用するように設定した。
以上!!