AWS S3 バケットで保存する

S3でファイルがアップロードされる領域を準備しましょう
ファイルのバックアップであったり、ファイル処理の加工前、もしくは加工後のファイルを保存する、画像ファイルやCSSなどWebで使う静的なファイルをS3に置いて配信するなど、使い方は無限大になります

S3(Simple Storage Serviceを略してS3)で、実際にデータが格納される場所のことをバケットと呼びます。バケットの名前はアクセスするときのURLとして使用されるため、まだ誰も付けたことがない名前を使う必要があります。

# S3を利用してバケットを作成
1. [AWSコンソールを開く](https://ap-northeast-1.console.aws.amazon.com/console/home?)


2. ストレージの項目にある「S3」を開く

[![Image from Gyazo](https://i.gyazo.com/04adc09288030f2f07afe876efb3bc98.gif)](https://gyazo.com/04adc09288030f2f07afe876efb3bc98)
3. 「バケットを作成」をクリック(オレンジのボタン)

![スクリーンショット 2020-04-06 9.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/5027d87e-e9d1-48c3-8f60-d0b279daaf7e.png)
4. バケットの名前を入力

![スクリーンショット 2020-04-06 9.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/98db2513-e10c-6536-8368-352834ed3f8d.png)
5. リージョン「アジアパシフィック」を選択
![スクリーンショット 2020-04-06 18.33.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/205b48ff-4a88-e942-6d16-fe5cdffdd0df.png)
6. 画像のような設定にします。今回はバケットポリシーを使用してセキュリティ設定を行いますので下の2つにチェックを入れます。ここの設定が誤っているとファイルのアップロードができなくなりますので注意

![スクリーンショット 2020-04-06 18.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/3d55350b-8241-15a7-5ca7-6c9bdc54a5a2.png)
7. 作成したバケットを開く
![スクリーンショット 2020-04-06 19.11.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/c3e4d676-43b6-21e9-14c4-798e8b4e534c.png)
8. アクセス権限＞バケットポリシーを開く

![スクリーンショット 2020-04-06 19.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/e4c9964e-9f57-4f82-a19a-fb4722e3277f.png)
9. 表示されたエディターに下記を入力

```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "************①IAMUserなどのアカウント****************"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::②バケット名"
        }
    ]
}
```
10.まず②から埋めます。②はバケット名を入力するだけですが、よく見ると画像の場所に記載されています
![スクリーンショット 2020-04-06 19.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/4afcc2a6-9b4a-f986-3bf6-b66620c354b7.png)
バケットポリシーエデイターの隣に「ARN:arn:aws:s3:::exampleadmin」と記述されています。
このaws:s3:::exampleadminが入った状態が②です。

11.①はIAMのページに記載されています
まずIAMの管理ページを開きます![スクリーンショット 2020-04-06 19.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/9239cc84-2c19-5a70-3da1-612c59c75eaa.png)
そして、作成したユーザーを開きます。この例の場合exampleを開きます
続いて、「ユーザーのARN」をコピーします
[![Image from Gyazo](https://i.gyazo.com/bec27b5b7a2322139080451fd6d5cc59.gif)](https://gyazo.com/bec27b5b7a2322139080451fd6d5cc59)

では、S3に戻ってバケットを開き①の項目に入れましょう

```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789123:user/example"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::example"
        }
    ]
}
```

これで作成完了しました

# ローカル環境（開発環境）からS3にアップロード

ActiveStorageの場合は下記を参考にしてください
[RailsアプリでActiveStorage + AWS S3を使ってみよう！](https://qiita.com/daichi41/items/af2a56ea46c13ca55fd3)

[CarrierWaveによる画像のアップロード]
(https://qiita.com/Tatsu88/items/be3209154a88b35be1c5)

二つの違いに関する記事
https://www.fundely.co.jp/blog/tech/2019/12/11/180024/

CarrierWaveによる画像のアップロード先がアプリ内のpublicフォルダですが、
これをS3に変更していきます。



```ruby:Gemfile
gem 'carrierwave'
gem 'fog-aws'
```
```
$ bundle install
```
storageを「:file」から「:fog」に変更する

```ruby:app/uploaders/image_uploader.rb
# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  process resize_to_fit: [800, 800]

  # Choose what kind of storage to use for this uploader:
  storage :fog #ここを変更

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
```

fogのアップロード先の設定

```ruby:config/initializers/carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.secrets.aws_access_key_id,
    aws_secret_access_key: Rails.application.secrets.aws_secret_access_key,
    region: 'ap-northeast-1'
  }

  config.fog_directory  = 'ここにバケット名を入れます'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/ここにバケット名を入れます'
end

```

### Mojave以前の場合

```
$ vim ~/.bash_profile

# iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。
export AWS_ACCESS_KEY_ID='ここにCSVファイルのAccess key IDの値をコピー'
export AWS_SECRET_ACCESS_KEY='ここにCSVファイルのにSecret access keyの値をコピー'
#ここで保存完了

$ source ~/.bash_profile
```

### catarina以降の場合

````
# ローカル環境
$ vim ~/.zshrc

# iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。
export AWS_ACCESS_KEY_ID='ここにCSVファイルのAccess key IDの値をコピー'
export AWS_SECRET_ACCESS_KEY='ここにCSVファイルのにSecret access keyの値をコピー'
#ここで保存完了

#読み込みさせる
$ source ~/.zshrc
````

あとは資料と同じです
参考になるQiita
https://qiita.com/Tatsu88/items/be3209154a88b35be1c5
https://qiita.com/junara/items/1899f23c091bcee3b058