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で、画像保存を許可する実体のないユーザーを作成します。アクセスの種類はプログラムによるアクセスです。次に進み、権限をアタッチします。 f:id:hellow_takuya:20200322234556p:plain

ユーザーの作成が終わると、アクセスキー (ENV['AWS_ACCESS_KEY_ID']) とシークレットキー (ENV['AWS_SECRET_ACCESS_KEY']) が表示されます。ユーザー名を選択し、ARNを保存しておきます (画像のユーザーは使用していないため、問題ありません。ご心配なく)。 f:id:hellow_takuya:20200322235846p:plain

次に、アクセスポリシー > パケットポリシーにて、以下を記述します。

{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<ユーザーのARN>"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<パケット名>"
        }
    ]
}

画像が保存されると、S3 パケット内でディレクトリが作成されるようになります (ちなみにローカルでは、public配下です)。