【ACE】クラウドストレージ

# 概要
このガイドにはGCPの設計に役立つストレージ機能を実行します。

目的、
1. バケットを作成して使用します
2. アクセス制御リストを設定してアクセスを制限します
3. ライフサイクルを管理します
4. オブジェクトバージョンニングを実装します
5. ディレクトリ同期を使用します
6. IAMを使用してプロジェクト間でバケットを共有します

では、始めます（　＾ω＾）・・・

# バケットを作成して使用します
**[BUCKET_NAME_1] を作成します**
:writing_hand: バケット名を作成する方法：
Project_idは、myproj-01-12345→ Bucket nameは、storecore0112345
以下のようにバケットを作成して、残りの値はdefaultで設定します。

| Property       |       Value |
|:-----------------|:-----------------|
|Name|Enter agobally unique name|
|Location type|Multi-region|
|Access control|Fine-grained (object-level permission in addition to your bucket-level permissions)|

例：プロジェクト１にてバケット「storecore04839fbc64ccc5」を作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/33fe8ec8-d36b-5501-4196-3d06d89c06a8.png)

**サンプルファイルをダウンロードします**
[BUCKET_NAME_1]を環境変数に保存します
`export BUCKET_NAME_1=[BUCKET_NAME_1]`
*echo* で確認します。
`echo $BUCKET_NAME_1`
サンプルファイルをダウンロードします（このサンプルファイルは、公開されているHadoopドキュメントのHTMLファイルです。）
`curl http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/ClusterSetup.html > setup.html`
ファイルをコピーします
`cp setup.html setup2.html
cp setup.html setup3.html`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/9c9fa0c2-d830-7a9c-2f7b-d1d74f5e53d3.png)

# [アクセス制御リストを設定してアクセスを制限します（ACL）](https://cloud.google.com/storage/docs/access-control/lists?hl=ja#top_of_page)
:information_desk_person_tone1: ストレージへファイル準備します。
`gsutil cp setup.html gs://$BUCKET_NAME_1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/0ff1290a-9dac-2215-c1e3-88fe039715a3.png)

結果を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/16f0cbb3-17b0-d0fe-e052-94c5badf3b13.png)

:information_desk_person_tone1: バケットオブジェクトのデフォルトのアクセス制限を取得するコマンドは次のようです
アクセス制限リストはacl.txtファイルに記録するコマンド
`gsutil acl get gs://$BUCKET_NAME_1/setup.html > acl.txt`
フィアルの中身を表示するコマンド
`cat acl.txt` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/3dc87e2c-c2d4-1cf3-6097-721dd0902b79.png)

:information_desk_person_tone1: アクセス制限を変更します
**アクセスリストをプライベートへ変更するコマンド**
`gsutil acl get gs://$BUCKET_NAME_1/setup.html`

実装結果を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/3185f2a9-d914-0525-2312-d1e78c5f72d3.png)
オーナーのみアクセスできるようになっています

**アクセスリストを一般に読み取りへ変更するコマンド**
`gsutil acl ch -c AllUsers:R gs://$BUCKET_NAME_1/setup.html`
実装結果を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/0a69dfcb-1318-c169-6bdb-9fdc9c8df4bd.png)

:information_desk_person_tone1: ストレージからファイルをコピーします

削除するコマンド
`rm setup.html`
削除された確認するコマンド
`ls`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/37ee628f-417b-ec8c-7fc1-4239383b62bb.png)

ストレージからファイルをコピーするコマンド
`gsutil cp gs://$BUCKET_NAME_1/setup.html setup.html`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/dcc8713b-0c89-2f44-986b-c5c7fcf6eb9e.png)

:writing_hand: aclのコマンドは[ここに](https://cloud.google.com/storage/docs/gsutil/commands/acl)ご参考下さい。
:writing_hand: 残りのアクセス制限する方法、IAM設定は[ここに](https://cloud.google.com/storage/docs/access-control/iam?hl=ja)ご参考下さい。

# ライフサイクルを管理します
期限時間を過ごしすぎる場合、自動的にバケットを削除する処理はストレージの機能の一つです。
バケットのライフサイクルを設定する方法を説明します。

:information_desk_person_tone1: バケットの現在のライフサイクルポリシーを確認するコマンド
**ディフォルト**にはライフサイクル設定なしです
以下は現在にバケットのライフサイクル設定を確認するコマンドです。
`gsutil lifecycle get gs://$BUCKET_NAME_1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/f88f12a0-1de7-5cd9-6725-7c8419f15561.png)
:information_desk_person_tone1: ライフサイクルを設定する内容をファイルに記録します
*フィアル名：lifecycle.json*、以下のコマンドで作成します
`nano lifecycle.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/ddc6e76c-0915-3d2a-1870-8721dfabdf4a.png)
以下の内情をフィアルにペーストします

```ruby:lifecycle.json
{
  "rule":
  [
    {
      "action": {"type": "Delete"},
      "condition": {"age": 31}
    }
  ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/cfec661f-b05b-b531-18fb-93f1e8640762.png)
**Ctrl+O, Enter**を押してファイルの内容が保存され、
**Ctrl+X**を押してNanoを終了します。
`cat lifecycle.json`を実行して作成したファイルを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/fb89e292-b217-13b7-cd36-f10ebcbbc28c.png)
:information_desk_person_tone1: バケットポリシーを設定します
作成したJSONファイルを使ってコマンドでバケットのライフサイクルを設定します。
`gsutil lifecycle set lifecycle.json gs://$BUCKET_NAME_1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/504ecc37-a1ab-23cf-d163-47bcfba6fd46.png)
バケットポリシーが変更されたのを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/7578b55f-98c5-ef98-59fd-b3053800b7fd.png)
設定が完成しました。31日後BUCKET_NAME_1は自動的に削除されます。

:writing_hand: `lifecycle` command must specify a bucket
:writing_hand: lifecycleのコマンドについて[ここに](https://cloud.google.com/storage/docs/gsutil/commands/lifecycle)ご参考下さい

# オブジェクトバージョンニングを実装します
削除または上書きされたオブジェクトを取得する為、バージョンニング機能があります。

:information_desk_person_tone1: バージョンニング無有を確認します
`gsutil versioning get gs://$BUCKET_NAME_1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b3dd33ce-f727-b8dd-aed3-1b543050fe8a.png)

:information_desk_person_tone1: バージョンニングを有効/無効にします
`gsutil versioning set on|off gs://$BUCKET_NAME_1`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b0207e4c-0785-bfd9-5b8d-a4b857a07fbf.png)

:information_desk_person_tone1: バージョンニング管理を使います
バージョンニング管理を有効してファイルの変更履歴が確認できます。バージョンニング管理を利用してみましょう

**バケットは2つを作成してコンソルラインで利用するためExportします**
`export FROM_BUCKET_NAME=[BUCKET_NAME_1]`
`export TO_BUCKET_NAME=[BUCKET_NAME_2]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/1a03bb3e-b219-8c15-fbb4-0905bc9c5fb0.png)


**バケットのバージョンニングの無有効を設定します**
バケット１：有効
バケット２：無効
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/b08e0c78-1201-8eb3-0926-9eca977e8972.png)

**バケット１のオブジェクトのバージョンニングを構成します**
バケット１へファイルをコピーします
ファイルをコピーします
`gsutil cp setup.html gs://$FROM_BUCKET_NAME/setup.html`
`gsutil cp setup2.html gs://$FROM_BUCKET_NAME/setup.html`
`gsutil cp setup3.html gs://$FROM_BUCKET_NAME/setup.html`
`gsutil cp setup2.html gs://$FROM_BUCKET_NAME/setup2.html`
バケット１のオブジェクトのバージョンニングを取得します
`gsutil ls -a gs://$FROM_BUCKET_NAME`

結果をみましょう～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/aa3d8e3e-a242-9b4b-82fe-bae743262f2c.png)
ファイルが公開するため、まずはフィアルのアクセス制限は設定します
`gsutil acl ch -u AllUsers:R gs://$FROM_BUCKET_NAME/setup.html`
*setup.html* は公開されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/e4279902-914d-4b0a-9692-be424268c5a8.png)
*Public to internet* をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/9af34372-0507-28ff-f248-1532bab4d0c5.png)

**バケット２へバケット１のオブジェクトののバージョンニングをコピーします**

```ruby:versioning
gs://storecore-01-04-bb6ff4dbac3e/setup.html#1585209834741358    // SETUP 1
gs://storecore-01-04-bb6ff4dbac3e/setup.html#1585209837050895    // SETUP 2
gs://storecore-01-04-bb6ff4dbac3e/setup.html#1585209839735716    // sETUP 3
gs://storecore-01-04-bb6ff4dbac3e/setup2.html#1585209865373421
```
バケット２へ *setup.html#1585209834741358* バージョンをコピーします
`gsutil cp gs://$FROM_BUCKET_NAME/setup.html#1585209834741358 gs://$TO_BUCKET_NAME/setup.html`
バケット２へ *setup.html#1585209837050895* バージョンをコピーします
`gsutil cp gs://$FROM_BUCKET_NAME/setup.html#1585209837050895 gs://$TO_BUCKET_NAME/setup.html`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/a93005c8-2e77-d477-5c3c-308bc1012928.png)
ファイルが公開します
`gsutil acl ch -u AllUsers:R gs://$TO_BUCKET_NAME/setup.html`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/73c92afa-476c-a0ab-4e13-b9f6917c6447.png)
*Public to internet* をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/9aa730be-0e1f-fb91-299f-f99ce1784263.png)

**バケット２のオブジェクトのバージョンニングを確認します**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/200529d2-7354-14d8-334d-5289ac06aebd.png)
バージョン履歴が記録されていません。最後の稼働のみが残っています。

:writing_hand: この機能を**有効にするとストレージコストが増加**しますが、オブジェクトのライフサイクル管理を構成して古いオブジェクト バージョンが削除されるようにすれば、コストの増加をある程度軽減できます。
:writing_hand: バージョンニングの利用方法は[ここに](https://cloud.google.com/storage/docs/using-object-versioning?hl=ja)ご参考下さい。

# ディレクトリ同期を使用します
:information_desk_person_tone1: ディレクトリ構造を作成します
次のコマンドで*firstlevel* フォルダ作成します
`mkdir firstlevel`
*firstlevel*へディレクトリして*secondlevel* フォルダを作成します
`mkdir ./firstlevel/secondlevel`
作成したフォルダへ*setup.html* ファイルをコピーしておきます
`cp setup.html firstlevel`
`cp setup.html firstlevel/secondlevel`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/47a56a47-f54a-819f-f5f2-def91b1ac7a2.png)

:information_desk_person_tone1: VMの第1レベルディレクトリをバケットと同期すします
`gsutil rsync -r ./firstlevel gs://$BUCKET_NAME_1/firstlevel`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/7e9100f9-2cc7-e8c8-441a-aaabdde9164e.png)

結果を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/e6583ee0-686b-55fb-3522-602bb8929aaa.png)

*FROM_BUCKET_NAME*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/669a0b60-7c70-b48c-326d-a9bfce78c93b.png)

*FROM_BUCKET_NAME > firstlevel*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/77acefcf-461c-3ffb-f165-97e66bc9461b.png)

*FROM_BUCKET_NAME > firstlevel > secondlevel*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/c39af5c1-3827-ca9b-cd8c-b214ee9ee476.png)

# IAMを使用してプロジェクト間でバケットを共有します
準備して置くもの
*[PROJECT_1] > [BUCKET_NAME_1] > [FILE_NAME]
[PROJECT_2]*
やることは、[PROJECT_2]が[BUCKET_NAME_1]をアクセス権限を付与して利用します。
なぜ、サービスアカウントを作成しないといけないなのかというとサービスアカウントはメンバーとしてアクセス権限を提供します。
（同じグーグルドメインの２つプロジェクの間のアクセス制限ならばサービスアカウントメンバーしなない。IAMメンバーの種類は[ここ記事に](https://qiita.com/huong/items/a9008efdeeaf89d72f9e)ご参考下さい。）

:information_desk_person_tone1: IAMサービスアカウントを作成
[Create service account](https://console.cloud.google.com/iam-admin/serviceaccounts/create)ページを開いてサービスを作成します
サービスアカウント名: `cross-project-storage`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/18421c8f-b632-84af-8602-60a6d20cc33b.png)

*サービスアカウント役割: Storage Object Viewer*
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/e4a640cc-e4dd-8317-b755-c72c698f0a0b.png)


*JSONファイルを作成します*
credentials.jsonという名前へ保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/4d2fa674-2944-cbf8-ba0d-a74640a522f5.png)

:information_desk_person_tone1: [PROJECT_2]へ戻り VMを作成します

| Property|Value | 
|:--|:--|
| VM name|crossproject |
| Region|europe-west1 |
|Zone|europe-west1-d|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/83c7d975-a85c-9c53-2d9c-a719e450c9dd.png)
*SSH* をクリックして[PROJECT_1]のバケットをアクセスしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/237ee30e-0f41-4d64-f3c1-3024dd57a2d9.png)

エラー発生しました。観覧のアクセス権限が提供されていませんというエラーメッセージが出力されますした。

:information_desk_person_tone1: JSONファイルを利用してアクセル権限が付与されます
右上隅にある歯車のアイコンをクリックしてファイルをアップロードをクリックして以前に保留したJSONをアップロードします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/a8e09b36-29e2-72fa-2388-3eef276457b2.png)
認証するJSONをアップロードしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/a620012c-2515-6d55-6fe4-441fb816d7eb.png)

JSONファイルは既にアップロードされた確認です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/85e8e6b2-5e95-3859-cadc-45ce180c0096.png)

VMがGoogle Cloud APIを使用することを承認します。
`gcloud auth activate-service-account --key-file credentials.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/8198071f-2354-7c16-295d-6864c49c42ff.png)

では、もう一度[BUCKET_NAME_1]へアクセスしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/737d5084-c284-f800-1687-9632b48e365f.png)

できましたよね
終了終了〜
ｷﾀ━━━━｡ﾟ+.ヽ(´∀`*)ﾉ ﾟ+.ﾟ━━━━!!

# 一言
更に参考サイト
:writing_hand: [独立の暗号化キーを使用します](https://cloud.google.com/storage/docs/encryption?hl=ja)
:writing_hand: [ストレージの機能を利用します](https://cloud.google.com/storage/docs/using-bucket-labels?hl=ja)

ここまで読んでいただき有難うございます。
間違いとか補足などがあればもしくは結構使える機能がまだ言えなければお教え下さい。
日本語の文法でも！よろしくお願いします〜