はじめに
画像を保存する機能を持つアプリでは、アプリのディレクトリ内に画像が保存されていました。
今回の記事では画像の保存先をS3に変更してみます。
バケットを作る
バケットとは、S3で画像が保管される場所のことです、まずはバケットというものを作りましょう。
まずはAWSにアクセスし、サービスからS3を選択します。
遷移先でバケットを作成します。
バケットの名前を入力しましょう。この名前は一意になる必要があるため、アプリ名+数字といった名前がおすすめです。
この画面は編集不要なので「次へ」を押下しましょう。
次の画面で赤枠ないのチェックボックスにチェックを入れます。
バケットを作成をクリックして完成です!
IAMユーザー
「AmazonS3FullAccess」の権限を与えたIAMユーザーのARNを取得しておきましょう。
下記画像の赤枠をクリックすれば取得できます。
バケットポリシーの設定
続いてバケットポリシーの設定です。
先ほど作ったバケットをクリックしてポリシーの設定画面に進みましょう。
赤枠内にバケットポリシーを入力します。内容は下記のコードを参考にしてください。
{
"Version": "2012-10-17",
"Id": "Policy1544152951996",
"Statement": [
{
"Sid": "Stmt1544152948221",
"Effect": "Allow",
"Principal": {
"AWS": "ユーザーのARN"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::バケット名"
}
]
}
これでバケット関連の設定は完了です。
各種設定ファイルの修正
fog-awsをインストールするので、Gemfileに「gem 'fog-aws'」を追記してインストールしましょう。
開発・テスト・本番環境いずれでも使えるようにするため、group ~ end で囲まれていない部分に追記します。
~中略〜
gem 'fog-aws'
image_uploader.rbでファイルのアップロードにfogを指定します。
下記のように書くことで、本番環境とローカル環境でアップロード方法を分けることができます。
if Rails.env.production?
storage :fog
else
storage :file
end
次はcarrierwave.rbというファイルを作り、fogのアップロード先の設定を行います。
carrierwave.rbはconfig/initializersの直下に作成してください。
ここでもif文で本番環境の場合とローカル環境の場合で処理を分けています。
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'
CarrierWave.configure do |config|
if Rails.env.production?
config.storage = :fog
config.fog_provider = 'fog/aws'
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
region: 'ap-northeast-1'
}
config.fog_directory = 'バケット名'
config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/バケット名'
else
config.storage :file
config.enable_processing = false if Rails.env.test?
end
end
一旦ここまで
近いうちに続きを書きます。
7/27更新
続きを書きました!
Railsアプリで画像の保存先をS3に変更する。その2