839の日記

業務とは関係ない趣味の話を書くブログです。

GKEのsentryでfilesにGCSを使う

Sentry(sentry:9.1.1-onbuild)をGKE上で構築しようとした際にfilesをGCSに置きたかったので調べてみた。 9.1.1のimageを使うとsentry.conf.pyにはデフォルトでは以下のように書かれている。

    ################
    # File storage #
    ################
    # Uploaded media uses these `filestore` settings. The available
    # backends are either `filesystem` or `s3`.
    SENTRY_OPTIONS['filestore.backend'] = 'filesystem'
    SENTRY_OPTIONS['filestore.options'] = {
        'location': env('SENTRY_FILESTORE_DIR'),
    }

上記のデフォルトではlocalにファイルが置かれるようになっているが、volumeを割り当ててやる方法でも回避できる。 ただvolumeマウントはお金も高いのであまりやりたくなかった。

s3が指定できるならGCSもいけるのでは?と思って調べてみるとどうやらいけるっぽい。 9.1.1にもgcs周りのソースファイルは入っているようだったので設定するだけで行けそうということで試してみた。

    # Uploaded media uses these `filestore` settings. The available
    # backends are either `filesystem` or `s3`.
    SENTRY_OPTIONS['filestore.backend'] = 'gcs'
    SENTRY_OPTIONS['filestore.options'] = {
        'bucket_name': env('SENTRY_FILES_BUCKET'),
    }
    ##############

設定を見てもらうとわかる通り、credential系の設定はしていないのでSA経由で権限確認をするらしい。 GitHub上のコードを確認すると以下のように書かれている。

# NOTE: See docs/filestore for instructions on configuring the shell environment
#       with authentication credentials for Google Cloud.

権限はGKEのnodeに与えておき、動かしてみると以下のエラーが出た。

Error importing module sentry.filestore.gcs: "No module named google.cloud.storage.client"

どうやらデフォルトではgcs関係のライブラリが入っていない模様。 sentryのdocker onbuild版はカスタムイメージを簡単に作れるようになっているので以下のようにしてgcsのライブラリを入れたイメージを作成。

ファイル構成

sentry
    ├── Dockerfile
    └── requirements.txt

Dockerfile

ARG TAG
FROM sentry:${TAG}-onbuild

requirements.txt

google-cloud-storage>=1.13.2,<1.14

sentryディレクトリに入って

docker build  --build-arg TAG=9.1.1 -t sentry:9.1.1 -f Dockerfile .

とすればgcsのライブラリが入った9.1.1のイメージができるのでGCRのほうにアップロードしてGKEから使うようにした。 その後、sentry上でプロフィールやorganizationの画像を適当に変更するとGCSにちゃんとアップロードできることを確認。

これでvolumeを使わず安く画像を永続化できるようになった。 なんだかんだいってpv/pvcの管理は割と面倒なので使わないに越したことはない。