開発しているウマ育ノートという育成支援サイト、
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系を利用するように設定した。
以上!!