###実現したいこと
railsとs3を疎通させたい。
最終的にはrailsからS3バケットへ画像がアップロードできるようにしたい。
###前提
[S3バケットの設定]
・リージョン:ap-northeast-1
・バージョニング有効
・Static website hosting有効
・現時点ではパブリックアクセスも全て有効
EC2→S3バケットの接続を可能にするためVPCエンドポイントを設定。
[VPCの設定]
・service category: AWS services
・service name: com.amazonaws.ap-northeast-1.s3
・VPC: EC2が置かれているVPC
・ルートテーブル: EC2およびELBが置かれているサブネットのルートテーブルを選択
[ユーザーの作成]
IAMユーザーを新規作成し、S3bucketfullaccessのみ権限を付与し、アクセスキーを作成。
[EC2(rails)の設定]
aws configure
にてs3バケットのフルアクセスを許可したIAMユーザーのアクセスキーを設定。
$ aws configure AWS Access Key ID [None]: IAMユーザーアクセスキー AWS Secret Access Key [None]: IAMユーザーシークレットキー Default region name [None]: ap-northeast-1 Default output format [None]:
railsでは以下のgemをインストールし、設定。
gemfile
1gem 'carrierwave', '1.2.2' 2gem 'mini_magick', '4.9.4' 3gem 'fog'
carrierwave
1require 'carrierwave/storage/abstract' 2require 'carrierwave/storage/file' 3require 'carrierwave/storage/fog' 4 5unless Rails.env.development? || Rails.env.test? 6 CarrierWave.configure do |config| 7 config.fog_credentials = { 8 provider: 'AWS', 9 aws_access_key_id: Rails.application.credentials.aws[:access_key_id], 10 aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key], 11 region: 'ap-northeast-1' 12 } 13 config.fog_provider = 'fog/aws' 14 config.fog_directory = 'バケット名' 15 config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/バケット名' 16 end 17end 18CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:].\-+]/
uploader
1class PictureUploader < CarrierWave::Uploader::Base 2 3 include CarrierWave::MiniMagick 4 process resize_to_limit: [400, 400] 5 6 if Rails.env.development? 7 storage :file 8 elsif Rails.env.test? 9 storage :file 10 else 11 storage :fog 12 end 13 14 def store_dir 15 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 16 end 17 18 19 def extension_whitelist 20 %w(jpg jpeg gif png) 21 end 22 23 def filename 24 original_filename if original_filename 25 end 26 27 28end
※コードのファイル名に拡張子をつけるとなぜか表記が消えてしまうため省略してあります。
発生している問題・エラーメッセージ
aws s3 ls s3://バケット名/ --recursive An error occurred (SignatureDoesNotMatch) when calling the ListObjectsV2 operation: The request signature we calculated does not match the signature you provided. Check your key and signing method.
何度試しても、SignatureDoesNotMatchというエラーになってしまい接続できない。
「ここの設定がおかしいんじゃないか」など、どのようなアイデアでもいただければ非常に助かります。
試したこと
・アクセスキーの文字に記号が紛れ込んでエスケープされてしまっている説
→アクセスキーを確認したがエスケープされるような記号はなかった。
補足情報
参考にしたサイト:
【AWS S3 + EC2 + CarrierWave + Fog】RailsからS3へ画像アップロード手順
Railsでcarrierwaveを使ってAWS S3に画像をアップロードする手順を画像付きで説明する
関係あるかわかりませんが、EC2はELBを通じて暗号化しています。
WEBサーバはnginx、アプリケーションサーバはpumaを使用しております。
railsのバージョンは5.2です。
あなたの回答
tips
プレビュー