質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1018閲覧

同一バケット内同一アカウントでファイルコピーしたのにAccessDeniedエラーになる

pecchan

総合スコア592

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/07/08 22:25

編集2021/07/10 01:58

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 バケット間でオブジェクトをコピーできないのはなぜですか?

S3からのファイルコピーでHTTP 403が表示されたとき

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)を確認しました。

問題の画像は、オブジェクトの読み込みが空白になってました。

コピー時に権限を与えてない?のが原因でしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2021/07/09 16:36

元々あった画像を置き換える処理かと思いますが、そもそも元々の画像にはURLでアクセスはできましたか?
pecchan

2021/07/09 21:23

有難う御座います。 はい、元の画像にはURLでアクセスできます。 コピー先の画像は、URLでアクセスしようとするとXMLでエラーが表示されます。 1つしかバケットはなく、バケット内にtempフォルダがあります。 画像選択時にtempフォルダにUploadし、最後の確定でtempフォルダから 同一バケット内の別フォルダに移動させようとしてます。
pecchan

2021/07/09 21:27

画像選択時のアップロードは、フロントエンドから。 確定で画像の移動は、バックエンドから行っております。 これが関係してるでしょうか? その部分を追記致します。
guest

回答1

0

自己解決

登録時はacl追加してたので
試しにコピー時のメソッド
copy_to
の引数にも、aclを追加してみたらいけました。

これはawsのドキュメントにも記載ありませんでした。

投稿2021/07/10 21:55

pecchan

総合スコア592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問