S3の設定
What
画像ファイル等をAWSの別コンテナに保存し、ec2コンテナを変更しても大丈夫なようにする。
具体的には、carrierwave利用時の画像保存先をS3にします。
Do
Localの設定
config/carrierwave.rbというファイルを作成し、以下記述します。uploaders/image_uploader.rbに書いても良いですが、同じ記述がないようにします。
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_directory = ENV['AWS_S3_PACKET'] config.fog_credentials = { provider: 'AWS', aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], region: ENV['AWS_REGION'], path_style: true } else config.storage :file config.enable_processing = false if Rails.env.test? end end
環境変数については、credentials.ymlかec2コンテナに環境変数用のファイルを作成しておきます。
AWSコンソールでの設定
S3でパケットを作ります。この時のパケット名が、ENV['AWS_S3_PACKET']で、リージョンがENV['AWS_REGION']です。リージョンはURLのregion=<リージョン名>からも確認できます。
サービス利用者に擬似的に権限を与え、S3に保存するように設定します。IAMで、画像保存を許可する実体のないユーザーを作成します。アクセスの種類はプログラムによるアクセスです。次に進み、権限をアタッチします。
ユーザーの作成が終わると、アクセスキー (ENV['AWS_ACCESS_KEY_ID']) とシークレットキー (ENV['AWS_SECRET_ACCESS_KEY']) が表示されます。ユーザー名を選択し、ARNを保存しておきます (画像のユーザーは使用していないため、問題ありません。ご心配なく)。
次に、アクセスポリシー > パケットポリシーにて、以下を記述します。
{ "Version": "2012-10-17", "Id": "Policy1544152951996", "Statement": [ { "Sid": "Stmt1544152948221", "Effect": "Allow", "Principal": { "AWS": "<ユーザーのARN>" }, "Action": "s3:*", "Resource": "arn:aws:s3:::<パケット名>" } ] }
画像が保存されると、S3 パケット内でディレクトリが作成されるようになります (ちなみにローカルでは、public配下です)。