---
# System prepended metadata

title: Google Cloud Storage
tags: [GCP, GCS]

---

###### tags: `GCP` `GCS`
# Google Cloud Storage
- 単一の統合型APIで、ストレージをアプリに統合できる
- awsのS3と同じ
- 動画や画像、フロントページの置き場
- オブジェクトのライフサイクル管理を使用して4つのストレージクラスを用意
    - 価格とパフォーマンスの選択

バックアップ、画像、動画

![](https://codimd.s3.shivering-isles.com/demo/uploads/upload_c69fec3fea04cec2a5f7198ba028343d.jpeg)

## Storageクラス
左に行くほど高い/速い
- Multi-Region : 複数地域からアクセスする場合におすすめ
- Regional : 単一リージョンでの運用でアクセスが多い場合
- Nearline : 安いけど遅い
- Coldline : めちゃ安いけどめちゃ遅い


# 1. 流れ
1. GCSを作成
2. 画像を上げて一般公開
3. GCEのhtmlから画像を見る
4. GCSをGCEにマウント、ストレージをサーバーから利用する
  - サービスアカウントを利用
  - Cloud Strage Fuse で接続する

# 2. Cloud Strageバケットを作成
menu > ストレージ. Storage > ブラウザ > バケット作成

**バケット名** は、世界に1つのユニークな名前にしなければならない
-> バケット内のオブジェクトにurlを与えてアクセスできるため

multi-regionでデフォルト設定で作る

## 詳細を見る
バケット名をクリック
### 概要
作成日時やストレージクラス
### 権限
プロジェクトの編集者とオーナー > 所有者(読み書き)
閲覧者 > 読み取りのみ
### バケットロック
ライフサイクルのルール追加
- 年齢(作成してからの時間)
- 作成日
- ストレージクラス
- 新しいバージョン

などなどの状態を指定し、アクションを適用することで料金を安くする
- 安いストレージに移す
- 削除する


# 3. GCSに画像を上げる
プロジェクトのホームからStorageにアクセスしてみる
ホーム > リソース > Storage

## ファイルをアップロード
バケット選択 > ファイルをアップロード

アップロードしたアイテム名をクリックするとアクセスできる。
ただし、公開アクセスは非公開となっているので、外部からはアクセスできない

## オブジェクトの権限の編集
アップロードしたファイル(オブジェクト) 単位で、読み取り権限を編集できる

1. バケット > オブジェクト > メニュー > 権限の編集
2. ユーザー / allUsers / 読み取り を追加

公開アクセスのパラメーターが、公開になり、リンクの鎖マークが表示される
クリックすると、外部公開のurlにアクセスできる



### index.phpから表示する
`<img src="">` で、バケットのurlを指定して表示する




# 4. GCS を GCE のディレクトリにマウントする
いちいち、画像を公開設定にするのは骨が折れる
また、GCPの中だけで使いたい場合もある。
よって、GCE に GCS をマウントして使うことで上記を解決する。


linuxの機能である外部ディスクをディレクトリへマウント
それをCloud Storageで行う

## サービスアカウント
![](https://codimd.s3.shivering-isles.com/demo/uploads/upload_28f96610c2c1afbe30a19c793aa5b4ca.jpeg)

サービスアカウントとは？
GCPで作ったインスタンス(GCE, GCS)には、googleアカウントが作成されて紐付けられる
これがサービスアカウント

GCSのバケットに対し、GCEに紐付けられたgoogleアカウントで読み書きのフルアクセスを許可する

## GCEにストレージをマウント
### Cloud Storage FUSE
仮想サーバーインスタンスにストレージをマウントするためのライブラリ

## 手順
**前半. GCEインスタンスのサービスアカウント権限を編集**
1. Storageのバケットの公開権限を消す(allUsersを消す)
2. VMインスタンス > 停止
3. VMインスタンス > 詳細 > 編集
4. 一番下 > サービスアカウント > **各APIにアクセス権を設定** をチェック
5. ストレージの設定を、 読み取りのみ -> フル に変える
6. インスタンスを起動

**後半. Cloud Storage FUSE をインストールしてストレージをマウント**
1. 講義の添付ファイルのコマンドを実行する
```
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get -y update
sudo apt-get -y install gcsfuse
```
- 環境変数にGCSFUSE_REPOをexport
- aptのリポジトリを追加
- apt key をダウンロードして追加
- aptをupdate
- apt-getでgcsfuseをインストール

2. ストレージをマウント
```
cd /var/www/html/
sudo mkdir udemy-study
sudo gcsfuse -o allow_other -o nonempty <GCS パケット名(urlでない)> ./udemy-study
cd udemy-study 
sudo ls udemy-study/
```
- /var/www/html ディレクトリに異動
- udemy-studyディレクトリを作成(ここにマウントする)
- gcsfuseコマンド
- マウントした中身を確認
ルートフォルダでの作業なので、 sudo(すーどぅー)を忘れない


これで、ローカルのファイルとしてストレージを参照できる
index.htmlの img src にも、相対パスで指定できる



# 5. インスタンス立ち上げと同時にマウント
インスタンスを停止/起動すると、マウントしたストレージが外れてしまう
カスタムメタデータに、startup-scriptのラベルを追加すると、起動時にそのコマンドを実行するので
起動のたびにgcsfuseコマンドを実行する

1. VMインスタンス > 詳細
2. カスタムメタデータを追加
3. keyは "startup-script"
4. 値に以下のコマンドをシバン付きで入れる
```
#! /bin/bash
sudo gcsfuse -o allow_other -o nonempty <GCS パケット名> /var/www/html/udemy-study
```


