RailsアプリケーションからS3に画像をアップロードするケースはよくあるのではないかと思います。
今回はShrineというGemを使ってS3に画像をアップロードする方法を紹介します。
ruby 2.4.1
rails 5.1.0
shrine 2.6.1
Gemの使い方等は下記の記事を御覧ください。
Shrineでアップロードする際に画像を加工する
Shrineを使って画像をアップロードする
AWS側で必要な設定は下記のとおりです。
S3バケットはマネジメントコンソールの「S3」から作成できます。
「バケットを作成する」をクリックして下記の画像のようにバケット名を指定して「次へ」をクリックします。
プロパティの設定は特に変更せず「次へ」をクリックします。
アクセス許可の設定も特に変更せず「次へ」をクリックします。
設定内容を確認して「バケットの作成」をクリックします。
CORSはCross-Origin Resource Sharingの略で「特定のドメインにロードされたクライアントウェブアプリケーションが異なるドメイン内のリソースと通信する方法を定義します」
先程作成したバッケット名をクリックし、「アクセス制限」→「CORSの設定」をクリックします。
「CORS構成エディター」に下記の通り入力して「保存」をクリックします。
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>https://your.domain.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>Authorization</AllowedHeader> </CORSRule> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>Authorization</AllowedHeader> </CORSRule> </CORSConfiguration>
「IAM」からS3にアクセスするためのユーザを作成します。
「IAM」の画面の左のメニューから「ユーザ」をクリックします。
「ユーザを追加」をクリックします。
ユーザ名を入力し、アクセスの種類のプログラムによるアクセスにチェックを入れて「次のステップ」をクリックします。
「既存のポリシーを直接アタッチ」をクリックしてAmazonS3FullAccessにチェックを入れて「次のステップ」をクリックします。
内容を確認して「ユーザの作成」をクリックします。
ユーザが作成できたら「アクセスキーID」と「シークレットアクセスキー」をメモします(CSVをダウンロードすることもできます)
Rails側はInitializerを設定するだけでローカルのサーバへのアップロードと同様に行えます。
shrine.rbを下記のように設定します。
require 'shrine' require 'shrine/storage/file_system' require 'shrine/storage/s3' # アップロードするディレクトリの指定 if Rails.env.production? s3_options = { access_key_id: 'your_access_key_id', secret_access_key: 'your_secret_access_key', region: 'ap-northeast-1', bucket: 'abc.example.com', } Shrine.storages = { cache: Shrine::Storage::S3.new(prefix: 'cache', **s3_options), store: Shrine::Storage::S3.new(prefix: 'store', **s3_options), } else Shrine.storages = { cache: Shrine::Storage::FileSystem.new('public', prefix: 'images/uploads/cache'), store: Shrine::Storage::FileSystem.new('public', prefix: 'images/uploads/store'), } end # 使用するプラグインの宣言 Shrine.plugin :activerecord Shrine.plugin :cached_attachment_data # for forms
Shrineを使ってS3に画像をアップロードする方法をAWS側の設定も含めて紹介しました。