gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

ActiveStorage×GCSで画像アップロード

この記事について

ActiveStorageでアップロードした画像をGCSに保存する手順をメモしたものです。 ActiveStorageを使った開発環境での画像の保存は既に出来ているものとします。

参考にした記事

Active Storage の概要 - Railsガイド

[Rails5.2] Active Storageを使ってGCSに画像を保存・取得する | by Kazuki Shibata | VISITS TechBlog | Medium

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで | 阿佐 志保, 中井 悦司, 中井悦司 | プログラミング | Kindleストア | Amazon

アジェンダ

バケットを作成

バケットとは?

オブジェクトを格納する箱みたなイメージ。

オブジェクトとは?

バケットに格納する画像ファイルやテキストファイル。

バケットを作成する

  • バケットを作成を押下 f:id:hatehate-nazenaze:20200719150743p:plain

  • 名前、保存場所、ストレージクラスを決定する f:id:hatehate-nazenaze:20200723093335p:plain

  • オブジェクトへのアクセスを制御する方法を選択する f:id:hatehate-nazenaze:20200723102249p:plain

    • きめ細かい管理

      Cloud IAM と Access Control Lists(ACL)を併用して権限を管理できます。

    • 均一

      Cloud IAM のみを使用して権限を管理できます。

      • 公式では均一が推奨されている。
      • 個人を特定できる情報などの機密データを含むオブジェクトがある場合は、権限の管理を容易にするために、均一アクセス権を有効にしたバケットにそのようなデータを保管することをおすすめします。

      • 「あれ、このファイルだけ誰でもアクセス可能になってんじゃん!!」ってならないように均一をお勧めしていると理解した↑
    • 参考: アクセス制御の概要  |  Cloud Storage  |  Google Cloud

  • 詳細設定 f:id:hatehate-nazenaze:20200723102557p:plain

    • ここは特に変更しない

サービスアカウントを作成

サービスアカウントとは?

  • アプリケーションからGCPのリソースへアクセスを制御するためのアカウント。
  • 今回で言うと、GCE上にデプロイしているアプリケーションからGCSにアクセスし、オブジェクトの保存や取得を行うためのアカウント。

サービスアカウントを作成する

  • IAMと管理の中のサービスアカウントを押下 f:id:hatehate-nazenaze:20200723103507p:plain

  • アカウント名の入力 f:id:hatehate-nazenaze:20200723104856p:plain

    • サービスアカウントIDはアカウント名を入力すると自動で入力される
  • ロールを選択 f:id:hatehate-nazenaze:20200723105137p:plain

    • 画像の登録・閲覧・削除がしたいためストレージ管理者を選択
  • ユーザーへのアクセス権の付与(特に何もしない) f:id:hatehate-nazenaze:20200723105432p:plain

権限を編集する

  • バケットにアクセスするための権限を編集します f:id:hatehate-nazenaze:20200723102832p:plain

  • メンバーを追加を押下 f:id:hatehate-nazenaze:20200723110549p:plain

  • 先程作成したサービスアカウントを追加 f:id:hatehate-nazenaze:20200723110804p:plain

これでバケットとそのバケットへのアクセス権を持つアカウントを作成する事が出来ました

サービスアカウントにキーを設定

サービスアカウントのキーとは?

  • そのサービスアカウントとしてリソースにアクセスするための情報
  • 今回でいうと、先程作成したサービスアカウントとしてGCSにアクセスするための情報

サービスアカウントの詳細から鍵を追加を押下

f:id:hatehate-nazenaze:20200723111550p:plain

新しい鍵を追加を選択しJSON形式でダウンロードする

f:id:hatehate-nazenaze:20200723111712p:plain

ローカルにサービスアカウントのキー情報がダウンロードされる。 サービスアカウントのキーの設定は完了。

ActiveStorageの設定

先程ダウンロードしたjsonキーをconfig配下に保存

f:id:hatehate-nazenaze:20200723112500p:plain

  • キーの中身はこんな感じ
  • キーは必ずgitignoreに追加する等し、外部に漏れないようにする

storage.ymlの設定

google:
  service: GCS
  project: your_project
  credentials: <%= Rails.root.join("config/XXX.json") %>
  bucket: XXXXX

capistranoの設定

設定の変更

今回のキーファイルはgit管理対象外とするため、capistranolinked_filesに追加する

set :linked_files, fetch(:linked_files, []).push(・・・, 'config/XXXX.json')

shared配下にキーファイルを配置する

  • linked_filesに追加したため、shared配下にキーファイルを配置

この状態でデプロイすればgcsへのアクセスが可能になる