いわりょのBlog

IT関連で学んだことを書いていきます。

自作railsアプリをデプロイする 番外編 本番環境の画像投稿 S3を作成する

ryo10leo.hatenablog.com

上の記事を通して、以下のようなインフラを作成しました。↓

f:id:Ryo10Leo:20200113011243p:plain

EC2の中身はこんな感じです。↓

f:id:Ryo10Leo:20200115230205p:plain

今回はRailsアプリケーションから画像を投稿するためのストレージをAWSの「S3」に設定していきます。

S3を軽く理解する

S3とは「Simple Storage Service」の略で、安価で耐久性に優れたクラウドストレージサービスです。

用語

オブジェクト
 S3に保管するファイルのこと。

バケット
 S3上に存在するフォルダのようなもの。

バケットポリシー
 バケットへのアクセス制限等のセキュリティポリシーです。バケット毎に自由に設定することができます。

マルチパートアップロード
 大きいファイルは複数に分割してアップロードできて、アップロード後に統合することができる機能の名称になります。

WEBサイト機能
 WEBサーバとして公開することができます。

バージョニング
 一度削除したものを復元できる機能の名称になります。

ユースケース

①コンテンツ保存&配信
画像等の静的コンテンツの保存先及び配信

②データ保存用のストレージ
ログ保存用やアプリケースションのストレージとして利用

③バックアップ
サーバのバックアップ、DR用にバックアップ

作成するものを図で理解する

f:id:Ryo10Leo:20200118134334p:plain

EC2インスタンス内のRailsアプリから、作成したS3を利用して画像を保存し、インターネットから閲覧できるようにします。

ここでの「インターネットから閲覧」とは、例えば写真をS3に保存して、アプリの投稿コンテンツを表示する際に、HTMLの<img>でS3で保存した写真などをS3からとってくることです。

S3の利用方法、設定

まずバケットを作成します。

名前とリージョン

コンソールからS3を選択して、移動した画面で「バケットを作成」を選択。

f:id:Ryo10Leo:20200118135342p:plain

バケット
任意の名前を設定します。

リージョン
東京

次へ」を選択。

オプションの設定

f:id:Ryo10Leo:20200118135716p:plain

バージョニング
今回はチェックなし。

サーバーアクセスのログ記録
必要であればログ用のバケットを作成しておき、設定します。

下へ続く↓
f:id:Ryo10Leo:20200118140341p:plain
Tags
今回はなし。

オブジェクトレベルのログ記録
より詳細なログを設定できる
今回はチェックなし

デフォルト暗号化
今回はチェックなし

CloudWatch リクエストメトリクス

バケットのリクエストとデータ転送をモニタリングするかの設定。
今回はチェックなし。

次へ」を選択。

アクセス許可の設定

f:id:Ryo10Leo:20200118140912p:plain

今回は保存したオブジェクトを公開したので、「パブリックアクセスをすべてブロック」をオフにします。

次へ」を選択。

設定が合っていれば「バケットを作成

S3を操作するユーザーを作成

ユーザーの詳細設定、AWS アクセスの種類を選択

コンソールから「IAM」を選択。

ダッシュボードの「ユーザー」から「ユーザーを追加」を選択。

f:id:Ryo10Leo:20200118141415p:plain

ユーザー名」を入力

プログラムによるアクセス」にチェック。

次のステップ」を選択。

アクセス許可の設定

f:id:Ryo10Leo:20200118141738p:plain

既存のポリシーを直接アタッチ」を選択。

ポリシー名」から「AmazonS3FullAccess」にチェック。

次のステップ」を選択。

次の画面のタグは特に設定していません。

確認画面で設定の確認。

ユーザーを作成」をクリック。

f:id:Ryo10Leo:20200118143105p:plain

作成したユーザーに設定される「アクセスキーID」や「シークレットアクセスキー」が必要なので、「csvのダウンロード」でそれらを取得しておき保管しておく。

これでAWS側の設定は完了です。

Rails側の設定

今回は画像投稿にCarrierwaveを使用している場合の設定を行っていきます。こちらの設定に関しては今回詳細には書きません。

railsでcarrierwaveを使って画像をアップロード、表示 - Qiita

必要なgemは以下の通り

gem 'carrierwave'
gem 'fog'

uploaderファイルのstorageの部分を編集します

app/uploaders/image_uploader.rb
・
・
  storage :fog
・
・

設定ファイルのcarrier_wave.rbに以下を追記していきます。

config/carrier_wave.rb

if Rails.env.production?
    CarrierWave.configure do |config|
      config.fog_credentials = {
        # Amazon S3用の設定
        :provider              => 'AWS',
        :region                => ENV['S3_REGION'],   
        :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
        :aws_secret_access_key => ENV['S3_SECRET_KEY']
      }
      config.fog_directory     =  ENV['S3_BUCKET']
    end
end

ENV['xxx']とあるのは、環境変数を読み込みます。
それぞれの変数に、AWS側で設定した時に取得した「アクセスキーID」や「シークレットキー」などを設定します。

環境変数設定の例↓

$ export S3_REGION="ap-northeast-1"
$ export S3_ACCESS_KEY="ユーザー作成時に取得したアクセスキーID"
$ export S3_SECRET_KEY ="ユーザー作成時に取得したシークレットキー"
$ export S3_BUCKET="バケット作成時に設定したバケット名"
$ source ~/.bashrc

あとはCarrirwaveの基本設定ができていていれば、S3に保存ができるはずです。