くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Cloud StorageとCloudflareを使って画像配信サーバを構築する

開発しているウマ育ノートという育成支援サイト、
SSSAPIでソース変更せず、データを更新できるようになったけど、
画像はサーバから配信してたので、画像も配信する形式にしたいなと思って、
いろいろ調べてみたときの備忘録。

公式ドキュメントだとこのあたり
CNAME | カスタムドメイン | リクエスト エンドポイント

https://storage.googleapis.com/img.example.com/image.png
というURLを
https://img.example.com/image.png
でアクセスできるようにする。

設定の流れ

  1. サブドメイン名を決める
  2. バケットを作成する
  3. DNSにCNAMEを追加する

1. サブドメイン名を決める

※※これが重要※※

バケットを作る前に、サブドメインを決める。

CNAMEを設定するために以下の条件がある。

これでハマった...

例として、サブドメイン名をimg.example.comにする

また、

CNAME レコードでは、HTTP リクエストしかサポートされません。

という条件もあるので、Cloudflareじゃないとつらい。

2. バケットを作成する

次にバケットを作成する。
バケット名はimg.example.com

バケット全体を公開するので、
権限タブからallUsersStorageオブジェクト閲覧者で追加。

公開アクセスについてはこのあたり。
データの一般公開 | Cloud Storage

3. DNSにCNAMEを追加する

最後にCloudflareのCDNCNAMEを追加。

  • 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系ではgsutilgcloudも動かない。。
  • python3.8系だとgsutil cpは動くけど、gsutil rsyncはダメ。。
  • gsutil rsyncを使うときは、crcmodが必要
    • Macだとpip install -U crcmodでOK
    • gsutil help crcmodを叩くと、各OSでのインストール方法などが表示される。

このあたりは、pyenvを使って3.7系を利用するように設定した。

以上!!

参考にしたサイト様