実現したいこと
本番環境でAWS S3にアップロードする際に画像からEXIFデータを取得したい
前提
Ruby、Ruby on Railsを使用。
carrierwaveとfog-aws、rmagickのgemを使用しています。
S3バケットの作成、バケットポリシー、IAM、CloudFrontは完了済みです。
herokuを使っています。
発生している問題・エラーメッセージ
S3に切り替える前は、本番環境でも目的の動作が確認できたため、S3に変更したところ、本番環境において以下のエラーが出ます。
herokuのログ: Magick::ImageMagickError (attempt to perform an operation not allowed by the security policy `HTTPS' @ error/delegate.c/InvokeDelegate/1726):
該当のソースコード
AWS S3 バケット アクセス権限 ブロックパブリックアクセス (バケット設定)
パブリックアクセスをすべてブロック オフ 新しいアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする オフ 任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする オフ 新しいパブリックバケットポリシーを介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする オン 任意のパブリックバケットポリシーを介して、バケットとオブジェクトへのパブリックアクセスとクロスアカウントアクセスをブロックする オン
carrierwave.rb
if Rails.env.production? || Rails.env.development? CarrierWave.configure do |config| config.fog_credentials = { provider: 'AWS', aws_access_key_id: ENV['S3_ACCESS_KEY'], aws_secret_access_key: ENV['S3_SECRET_KEY'], region: ENV['S3_REGION'] } config.fog_directory = ENV['S3_BUCKET'] config.asset_host = "https://<バケット名>.s3.amazonaws.com" end end
fish-image_uploader.rb
class FishImageUploader < CarrierWave::Uploader::Base include CarrierWave::RMagick if Rails.env.production? || Rails.env.development? storage :fog else storage :file end process :get_exif_info def get_exif_info exif = Magick::Image.read(self.file.file).first end def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end end
app/controllers/posts_controller.rb
class PostsController < ApplicationController 省略 def confirm @tournament = Tournament.find(params[:tournament_id]) @post = Post.new(post_params) @post.user_id = current_user.id @user = @post.user img = Magick::ImageList.new("#{@post.fish_image}") ←この箇所でエラーになります get_exif = img.get_exif_by_entry('GPSLatitude') if get_exif[0][1].nil? redirect_to new_tournament_post_path(@tournament), alert: "写真にGPSデータが無いため、投稿出来ませんでした。" else exif_lat = Post.get_exif_latitude(img) @latitude = Post.get_exif_gps(exif_lat) exif_lng = Post.get_exif_longitude(img) @longitude = Post.get_exif_gps(exif_lng) dt = img.get_exif_by_entry('DateTimeOriginal') @post.datetime = Time.strptime(dt[0][1], '%Y:%m:%d %H:%M:%S') return if @post.valid? end end 省略 private def post_params params.require(:post).permit(:fish_image, :fish_image_cache, :latitude, :longitude, :datetime).merge(tournament_id: params[:tournament_id]) end end
行ったこと
・開発環境でS3に保存した場合で行ったところ、画面の表示と投稿は正常に行うことができ、AWS S3のバケットに画像は保存されます。
本番環境だけがエラーが発生する。ことを確認。
・attempt to perform an operation not allowed by the security policy "HTTPS"
に関して調べる。(参考サイト)
改善箇所が分からず詰まってしまいました。
S3へ切り替えてからエラーになっているので、AWS S3の権限の問題かと考えて調べておりましたが、具体的な解決策が見つかりません。
恐縮ですが、ご教示いただけますと幸いです。よろしくお願い致します。
参考サイト
https://imagemagick.org/script/security-policy.php
補足情報(FW/ツールのバージョンなど)
ImageMagick 7.0.10-34
Rails 6.0.3.2
あなたの回答
tips
プレビュー