RailsアプリでS3にファイルをアップロードする場合、Carrierwaveとfog-awsを使用することが多いと思います。複数アプリをS3バケットを切り替えて使用する際に、ユーザーごとにバケットのアクセス権限を与えることで、思わぬ事故を防いだり、セキュリティを向上させることができます。
今回は、特定バケットのみアクセスできる権限を持ったCarrierwaveとfog-aws周り環境設定を解説いたします。
インストールとアプリ側の設定
Gem
- carrierwaveとfog-awsをインストールします
- 環境変数管理用のdotenvもインストールします
gem 'carrierwave' gem 'fog-aws' gem 'dotenv'
Carrierwave設定ファイル
- Carrierwaveの設定ファイルを作成します
config/initializers/carrierwave.rb
require 'carrierwave/storage/abstract' require 'carrierwave/storage/fog' CarrierWave.configure do |config| config.storage :fog config.fog_provider = 'fog/aws' config.fog_directory = ENV['S3_BUCKET_NAME'] config.fog_public = true config.fog_credentials = { provider: 'AWS', aws_access_key_id: ENV['S3_ACCESS_KEY'], aws_secret_access_key: ENV['S3_SECRET_ACCESS_KEY'], region: 'ap-northeast-1', path_style: true } end
Modelへのマウント
- 例として、Paymentモデルのreceipt_fileにReceiptUploaderをマウントします
app/models/payment.rb
class Payment < ApplicationRecord mount_uploader :receipt_file, ReceiptUploader end
app/uploaders/receipt_uploader.rb
class ReceiptUploader < CarrierWave::Uploader::Base def extension_white_list %w[pdf] end end
AWSの設定
AWSではS3とIAMのサービスを使用します。
S3の設定
S3バケットの作成を作成します。
S3バケットの作成
任意の名前でバケットを作成します。
パブリックアクセスはデフォルトのオフのままにしておきます。それ以外の項目は要件に応じて任意で変更してください。私の場合はデフォルトのままであることが多いです。
IAMの設定
huzzah-bucketのみにアクセスできる権限(ポリシー)を作成して、ユーザーに付与します。
ポリシーの作成
- ポリシーを使用すると、ユーザーに対して権限を割り当てることができます。JSONエディターで、特定バケットに対してアクセスを許可する操作を設定します。
JSONエディターの内容
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": "arn:aws:s3:::huzzah-bucket" }, { "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::huzzah-bucket/*" } ] }
- 任意のポリシー名を入力してポリシーを作成します
ユーザーの作成
任意のユーザー名を設定します。コンソールへのアクセスは無効のままにしておきます。
「ポリシーを直接アタッチする」を選択して、先程作成したポリシーにチェックしてユーザーを作成します。
ユーザーに対してアクセスキーの設定
ユーザーの作成が完了したら、再度ユーザーの詳細画面を開きます。「セキュリティ認証情報」タブに移動して「アクセスキーを作成」をクリックします。
「コマンドラインインターフェース」にチェックを入れてアクセスキーを作成します。
アクセスキーとシークレットアクセスキーが作成されますので、忘れないように控えておきます。
環境変数の設定
.envに先程控えたアクセスキーとシークレットアクセスキーとバケット名を登録します。
S3_BUCKET_NAME=huzzah-bucket S3_ACCESS_KEY=xxxxxxx S3_SECRET_ACCESS_KEY=zzzzzz
お疲れ様でした
作業は以上となります。お疲れ様でした!