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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

AWS(Amazon Web Services)

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

Q&A

解決済

2回答

7223閲覧

awsS3のamazonS3クラスのputObject()でエラー

jiro-sima

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2019/07/08 21:00

編集2019/07/09 00:11

amazonawsS3に画像ファイル(ストリーム処理されたもの)をアップロードする際にエラーが発生します
なお、既に手動でアップロードしたコンテンツのダウンロード(client.getObject())は問題なく作動しています
s3は使い始めたばかりで仕様を把握しきれていません
もし当たり前に設定されていると思われる物でも思い当たることがあればご指摘ください

java

1import java.io.InputStream; 2 3import com.amazonaws.SdkClientException; 4import com.amazonaws.auth.AWSStaticCredentialsProvider; 5import com.amazonaws.auth.BasicAWSCredentials; 6import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration; 7import com.amazonaws.services.s3.AmazonS3; 8import com.amazonaws.services.s3.AmazonS3ClientBuilder; 9import com.amazonaws.services.s3.model.ObjectMetadata; 10import com.amazonaws.services.s3.model.S3Object; 11 12public class S3Access { 13 public void upload(InputStream stream, String title, String fileName) { 14 String region = "ap-northeast-1"; //リージョン,東京 15 String bucketName = "バケット名"; 16 String endpointUrl = "https://s3-ap-northeast-1.amazonaws.com"; 17 String accessKey = "アクセスキー"; 18 String secretKey = "シークレットキー"; 19 String objectKey = title; 20 try { 21 //エンドポイント設定 22 EndpointConfiguration endpoint = new EndpointConfiguration(endpointUrl, region); 23 24 AmazonS3 client = AmazonS3ClientBuilder 25 .standard() 26 .withCredentials (new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) 27 .withEndpointConfiguration(endpoint) 28 .build(); 29 ObjectMetadata metadata = new ObjectMetadata(); 30 metadata.setContentType("image/jpeg"); 31 metadata.addUserMetadata("キー", "値"); 32 client.putObject(bucketName, objectKey, stream, metadata); 33 } catch(SdkClientException e) { 34 e.printStackTrace(); 35 } 36 } 37} 38

client.putObject()の行で以下のエラー
警告はオブジェクトサイズを設定していない為であると思われますが今は例外の対処を優先します

警告: No content length specified for stream data. Stream contents will be buffered in memory and could result in out of memory errors. [火 7 09 05:43:30 GMT+09:00 2019] com.amazonaws.services.s3.model.AmazonS3Exception: There were headers present in the request which were not signed (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: D7F346A9556C9B07; S3 Extended Request ID: ZIMjW1sGjlYmzFh0Lw0i1fB6+BH/xcS87GM5NB086baBl/Dxx/DZtugmud5GSjvNfjG9khpVhEY=), S3 Extended Request ID: ZIMjW1sGjlYmzFh0Lw0i1fB6+BH/xcS87GM5NB086baBl/Dxx/DZtugmud5GSjvNfjG9khpVhEY= at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1367) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686) at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:532) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:512) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4921) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4867) at com.amazonaws.services.s3.AmazonS3Client.access$300(AmazonS3Client.java:389) at com.amazonaws.services.s3.AmazonS3Client$PutObjectStrategy.invokeServiceCall(AmazonS3Client.java:5801) at com.amazonaws.services.s3.AmazonS3Client.uploadObject(AmazonS3Client.java:1789) at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1749) at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1687) at amazonS3.S3Access.upload(S3Access.java:36) at servlet.Upload.doPost(Upload.java:61) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)

追記

権限周りの問題ではないかとの指摘を頂いたのでと確認したことと結果を追記します
1.IAMユーザーの権限確認
現在使用しているIAMユーザーは"AdministratorAccess"権限を有するグループに属しています
IAMポリシーシミュレータにて確認したところ、アクション"PutObject"で許可の判定が出ました

2.バケットポリシーの確認
バケット>アクセス権限>ブロックパブリックアクセスは4つの項目全てオン、
アクセスコントロールリストは[オブジェクトの一覧, オブジェクトの書き込み, バケットのアクセス権限の読み取り, バケットのアクセス権限書き込み]すべてに「はい」と表示、
バケットポリシーは未入力の空欄、となっています

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

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

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

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

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

papinianus

2019/07/08 22:10

ダウンロードができてアップロードができない、かつこのエラーなら権限だと思います。コードを見てもわかりません
guest

回答2

0

自己解決

アップロードに成功したので経緯を示します
まず原因についてですがユーザーの権限等は関係ありませんでした
エラー前半のThere were headers present in the request which were not signed(ヘッダーの署名云々)、
こちらが本命だったようです
調べたところ数か月前からawsの署名バージョンが更新されており、SDKのバージョンが1.~~の場合
署名を手動で設定するなりしなければならなくなったようです(これに関してはより簡単なやり方がありそうですが割愛します)
相変わらずデータサイズは要求されますが以下の方法で成功します

java

1package amazonS3; 2 3import java.io.InputStream; 4import java.net.URL; 5 6import com.amazonaws.HttpMethod; 7import com.amazonaws.SdkClientException; 8import com.amazonaws.auth.AWSStaticCredentialsProvider; 9import com.amazonaws.auth.BasicAWSCredentials; 10import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration; 11import com.amazonaws.services.s3.AmazonS3; 12import com.amazonaws.services.s3.AmazonS3ClientBuilder; 13import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; 14import com.amazonaws.services.s3.model.PresignedUrlUploadRequest; 15import com.amazonaws.services.s3.model.PresignedUrlUploadResult; 16 17public class S3Access { 18 public void upload(InputStream stream, String title, String fileName) { 19 String region = "ap-northeast-1"; //リージョン,東京 20 String bucketName = "バケット名"; 21 String endpointUrl = "https://s3-ap-northeast-1.amazonaws.com"; 22 String accessKey = "アクセスキー"; 23 String secretKey = "シークレットキー"; 24 String objectKey = title; 25 try { 26 //エンドポイント設定 27 EndpointConfiguration endpoint = new EndpointConfiguration(endpointUrl, region); 28 29 //クライアント生成 30 AmazonS3 client = AmazonS3ClientBuilder 31 .standard() 32 .withCredentials (new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) 33 .withEndpointConfiguration(endpoint) 34 .build(); 35 36 //署名設定 37 HttpMethod method = HttpMethod.PUT; 38 GeneratePresignedUrlRequest signedUrl = new GeneratePresignedUrlRequest(bucketName, objectKey, method); 39 URL url = client.generatePresignedUrl(signedUrl); 40 PresignedUrlUploadRequest uploadRequest = new PresignedUrlUploadRequest(url) 41 .withInputStream(stream); 42 43 PresignedUrlUploadResult result = client.upload(uploadRequest); 44 45 } catch(SdkClientException e) { 46 e.printStackTrace(); 47 } 48 } 49}

投稿2019/07/09 15:38

jiro-sima

総合スコア20

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

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

0

403なので権限だと思います。アクセスキーを払い出したIAMユーザを確認してみてください。

投稿2019/07/08 22:27

michi_h

総合スコア158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問