rails6.1.0 / aws sdk v3
railsからですが、s3バケット内のファイルを移動(コピー・削除)しました。
そのファイルを読み込もうとすると、AccessDeniedエラーになりました。
This XML file does not appear to have any style information associated with it. The document tree is shown below.
調べたところ、別バケット間の移動をすると権限でこのエラーが出るとありますが今回は同一バケット、同一アカウントです。
2 つの Amazon S3 バケット間でオブジェクトをコピーできないのはなぜですか?
railsから以下のようにコピーしました。
画像を一時領域から本番領域に移動(コピー・削除)しました。
ruby
1def s3_copy_image 2 if self.avatar_changed? 3 4 target_key = "uploads/user/avatar/#{self.id}/#{File.basename(self.avatar)}" 5 temp_key = self.avatar.gsub("#{S3_BUCKET.url}/", '') 6 object = S3_BUCKET.object(temp_key) 7 8 # コピー先を初期化 9 S3_BUCKET.objects(prefix: "uploads/user/avatar/#{self.id}/").batch_delete! 10 11 # コピー 12 object.copy_to(bucket: S3_BUCKET.name, key: target_key) 13 14 # コピー元を削除 15 S3_BUCKET.object(temp_key).delete 16 17 # URL更新 18 self.avatar = "#{S3_BUCKET.url}/uploads/user/avatar/#{self.id}/#{File.basename(self.avatar)}" 19 end 20 end 21
調べてますが情報見つからず原因分かりません。
分かる方教えていただけると幸いです。
宜しくお願い致します。
追記
画像ファイルのコピーはバックエンド(rails)から行っておりますが、
作成自体はフロントエンドから行っております。
これが関係してるでしょうか?
以下に追記致します。
画像の選択時にブラウザからダイレクトアップロードするようにしてます。
heroku公式のまんまですが。
javascript
1 2<script> 3$(function() { 4 $('.directUpload').find("input:file").each(function(i, elem) { 5 var fileInput = $(elem); 6 var form = $(fileInput.parents('form:first')); 7 var submitButton = form.find('input[type="submit"]'); 8 var progressBar = $("<div class='bar'></div>"); 9 var barContainer = $("<div class='progress'></div>").append(progressBar); 10 fileInput.after(barContainer); 11 fileInput.fileupload({ 12 fileInput: fileInput, 13 url: '<%= @s3_direct_post.url %>', 14 type: 'POST', 15 autoUpload: true, 16 formData: <%= @s3_direct_post.fields.to_json.html_safe %>, 17 paramName: 'file', 18 dataType: 'XML', 19 replaceFileInput: false, 20 progressall: function (e, data) { 21 var progress = parseInt(data.loaded / data.total * 100, 10); 22 progressBar.css('width', progress + '%') 23 }, 24 start: function (e) { 25 submitButton.prop('disabled', true); 26 27 progressBar. 28 css('background', 'green'). 29 css('display', 'block'). 30 css('width', '0%'). 31 text("Loading..."); 32 }, 33 done: function(e, data) { 34 submitButton.prop('disabled', false); 35 progressBar.text("Uploading done"); 36 37 // extract key and generate URL from response 38 var key = $(data.jqXHR.responseXML).find("Key").text(); 39 var url = '<%= @s3_direct_post.url %>/' + key; 40 41 42 // create hidden field 43 var input = $("<input />", { type:'hidden', name: fileInput.attr('name'), value: url }) 44 form.append(input); 45 }, 46 fail: function(e, data) { 47 submitButton.prop('disabled', false); 48 49 progressBar. 50 css("background", "red"). 51 text("Failed"); 52 } 53 }); 54 }); 55}); 56</script> 57 58
####追記
今さらながら、AWSの管理画面で画像を確認しました。
画像のアクセス許可からアクセスコントロールリスト (ACL)を確認しました。
問題の画像は、オブジェクトの読み込みが空白になってました。
コピー時に権限を与えてない?のが原因でしょうか?
回答1件
あなたの回答
tips
プレビュー