基礎Ruby on Rails #24 Chapter13 クラウドスレレージサービス（Amazon S3）の利用

前 [基礎Ruby on Rails #23 Chapter13 複数画像のアップロード／順番の入れ替え](https://qiita.com/tseno/items/5fcc1625625de0acc851)
次 [基礎Ruby on Rails #25 Chapter14 多対多の関連付け](https://qiita.com/tseno/items/d5856e1ec33e51109d0a)

# クラウドストレージサービスの利用

## CA証明書の設置

- 全サービスに共通する準備作業として、SSL接続で使用するCA証明書を設置する。
- ターミナルで以下の2つのコマンドを実行する。

```sh
$ CERT_PATH=$(ruby -ropenssl -e "puts OpenSSL::X509::DEFAULT_CERT_FILE")
$ sudo curl "https://curl.haxx.se/ca/cacert.pem" -o $CERT_PATH
```

## Amazon S3

### Amazon S3の概要

- Amazon S3はAmazon Web Services (AWS) が提供するストレージサービス

### AWSアカウントの取得

- クレジットカードの登録が必要。アカウント作成から12ヶ月間はAmazon S3の無料利用枠が使える。（最大5GB）

### IAMユーザーの作成

- AWSコンソールでIAMユーザーを作成する。このIAMユーザーに対して、アクセスキーを作成する。アクセスキーとは、アクセスキーIDとシークレットアクセスキーを組み合わせたもの。
- また、このIAMユーザーに対してAmazonS3FullAccessという名前のポリシーを付与（アタッチ）する。

#

- IAMをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/079cd84e-c6a8-37b7-b073-723dcdd211b3.png)

- ユーザーをクリック → ユーザーを作成をクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/70d757cc-b94a-ccb4-8a4d-8c35ae0e9d04.png)

- ユーザー名にasagaoを入力 → プログラムによるアクセスをチェックして、次のステップ：アクセス権限ボタンを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/aef7f05e-c7ae-0939-1d26-2cfe4b8a2f64.png)

- 既存のポリシーと直接アタッチを選択 → AmazonS3FullAccessをチェック → 次のステップ：確認ボタンを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/67ca8a45-3ab5-3196-ecfb-e5d526b662f5.png)

- 確認して、ユーザーの作成ボタンを押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/d3a4fdd7-9da4-847f-52bc-4bb25ab5b48b.png)

- ユーザー作成後、アクセスIDとシークレットアクセスキーをメモして閉じる。

### バケットの作成

- バケットとはオブジェクトを格納するための入れ物。
- バケットにはリージョンという属性がある。Active Storageの資格情報に使用するのは、`ap-northeast-1`のような文字列。
- バケット自体のアクセス制限に関する設定はデフォルトのままでOK。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/5de1a7d2-9bc2-9441-f82f-81cabc64f5e5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/0f99f98c-1e95-d6d9-e022-23af8946699d.png)


### 準備作業

- Gemfileに`gem 'aws-sdk-s3', require: false`を追加する。

```rb:Gemfile
gem 'aws-sdk-s3', require: false
```

```sh
$ bundle install
```

- 資格情報を入力する。

```sh
$ echo 'export EDITOR=vim' >> ~/.bashrc
$ source ~/.bashrc
$ bin/rails credentials:edit
```


```yml:config/credentials.yml.enc（一部）
aws:
  access_key_id: XXXXXXXXXXXXXXXXXX
  secret_access_key: yyyyyyyyyyyyyyyyyyy
```

- コメントアウトを外して、regionとbuketを入力する。（コメントアウトを外した時に、先頭に空白が入っているのでフォーマットすること）

```rb:config/storage.yml（一部）
# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
 amazon:
   service: S3
   access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
   secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
   region: ap-northeast-1
   bucket: tseno-asagao
```

- `config.active_storage.service`の設定を`:local`から`:amazon`に変更する。

```rb:config/environments/development.rb（一部）
  # Store uploaded files on the local file system (see config/storage.yml for options)
  config.active_storage.service = :amazon
```


### 動作確認

- データベースの画像を一旦クリアしてから、サーバーを起動する。

```sh
$ bin/rails db:rebuild
$ bin/rails s
```

- 画像を登録する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/54fcefb3-cb14-5212-c489-32f849b65b12.png)

- S3に入ったことを確認した。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/756c151f-d7fc-99c7-2e33-75d37ff177c3.png)


**Google Cloud Storage、Microsoft Azure Storageは今回は省略する**

#### まとめ

- DBに入れないファイルをS3に入れておけば管理が楽なので、この機能は使えそうですね。

参考
[改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)](https://www.amazon.co.jp/%E6%94%B9%E8%A8%824%E7%89%88-Ruby-Rails-IMPRESS-KISO/dp/429500460X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1536666358&sr=1-1)