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

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

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

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon S3

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

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

2544閲覧

herokuで公開しているアプリからAWSのS3に画像をアップロードしようとするとエラーが表示される。

suika11

総合スコア166

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon S3

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

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2020/09/07 09:45

編集2020/09/09 07:13

現在起きていること
タイトルの通り、下記のエラーが表示。

string(798) "Error executing "PutObject" on "https://s3.リージョン.amazonaws.com/%2A%2A%2A%20バケット名%20%2A%2A%2A/s3/sample.png"; AWS HTTP error: Client error: PUT https://s3.リージョン.amazonaws.com/%2A%2A%2A%20バケット名%20%2A%2A%2A/s3/sample.png resulted in a 400 Bad Request response: InvalidBucketNameThe specified bucket is not valid.< (truncated...) InvalidBucketName (client): The specified bucket is not valid. - InvalidBucketNameThe specified bucket is not valid.*** バケット名 ***518DE16D49E9F219fY+flLyc7w+Tg4X+XnwzmEoZg7NFppfEUPikYbGm01vj5DSQRu6zHtWway//MnHy6dUgtqmYB2I=" NULL

コード

php

1<?php 2require_once "./../vendor/autoload.php"; 3 4use Aws\S3\S3Client; 5use Aws\Exception\AwsException; 6use Aws\S3\Exception\S3Exception; 7 8$bucket = '--- バケット名 ---'; 9$key = '--- mykey ---'; 10$secret = '--- mysecret ---'; 11 12$s3 = new S3Client([ 13 'version' => 'latest', 14 'cledentials' => [ 15 'key' => $key, 16 'secret' => $secret 17 ], 18 'region' => 'リージョン', 19]); 20 21$file = $_FILES['img']['tmp_name']; 22if (!is_uploaded_file($file)) { 23 return; 24} 25 26try { 27 $result = $s3->putObject([ 28 'Bucket' => $bucket, 29 'Key' => 's3/sample.png', 30 'Body' => 'pivate-read', 31 'ContentType' => mime_content_type($file) 32 ]); 33} catch(S3Exception $e) { 34 var_dump($e -> getMessage()); 35} 36 37var_dump($result);

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>test</title> 7</head> 8<body> 9 <form action="s3.php" method="POST" enctype="multipart/form-data"> 10 <input type="file" name="img"> 11 <button type="submit">アップロード</button> 12</form> 13 14</body> 15</html> 16

したいこと
エラーを解決し、S3に画像をアップロードしたい。

試したこと
バケット名の確認→問題なし

環境
macOS Mojave 10.14.6
Visual Studio Code 1.48.2
PHP 7.1.33

追記
別途、環境変数設定した上でgetenv関数で値を指定し、再度読み込んだら下記のエラーが発生しました。

PHP Fatal error: Uncaught Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata service. (cURL error 28: Connection timed out after 1000 milliseconds (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)) in /app/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php:240

まだ解決はできておりません。引き続き調べます。

追記
修正後のコード

php

1<?php 2require_once "./../vendor/autoload.php"; 3 4use Aws\S3\S3Client; 5use Aws\Exception\AwsException; 6use Aws\S3\Exception\S3Exception; 7 8$bucket = getenv('S3_BUCKET_KEY'); 9$key = getenv('S3_ACCESS_KEY'); 10$secret = getenv('S3_SECRET_KEY'); 11 12$s3 = new S3Client([ 13 'version' => 'latest', 14 'region' => getenv('S3_REGION'), 15 'cledentials' => [ 16 'key' => $key, 17 'secret' => $secret 18 ] 19]); 20 21if (!is_uploaded_file($_FILES['img']['tmp_name'])) { 22 return; 23} 24 25$file = fopen($_FILES['img']['tmp_name'], 'rb'); 26try { 27 $result = $s3->putObject([ 28 'ACL' => 'public-read', 29 'Bucket' => $bucket, 30 'Key' => 'sample.jpg', 31 'Body' => $file, 32 'ContentType' => mime_content_type($_FILES['img']['tmp_name']) 33 ]); 34} catch (S3Exception $e) { 35 var_dump($e->getMessage()); 36} 37 38var_dump($result); 39

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

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

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

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

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

yu_1985

2020/09/07 13:03 編集

これはローカルのMacで動かしているということでしょうか。 また、S3に対するアクセスの権限はどのようにして渡していますか? ※すいません、キーについては記載ありましたね。 権限は十分ですか?
yu_1985

2020/09/07 13:03

> InvalidBucketName ということなので、問題なしとしているバケット名が気になります。
suika11

2020/09/07 13:23

記述不足で申し訳ありません。herokuで公開しています。 該当のバケットのアクセス権限タブの「パブリックアクセスをすべてブロック」のチェックは外しています。 再度確認しましたがバケット名には問題ありませんでしたが、この記事(https://qiita.com/p_s_m_t/items/4f823b01d339b5776627)ではバケット名を$bucket = '--- BUCKET_NAME ---';としていますが、前後の---は必須ですか?
guest

回答1

0

ベストアンサー

を$bucket = '--- BUCKET_NAME ---';としていますが、前後の---は必須ですか?

---を入れているならそれが原因です。実際に作成したバケット名のみを入れてください。
キーについても同様です。
そもそもキーを直接ファイルに書き込むのはよろしくないので環境変数を使うなりしてください。

…念の為確認しますが、作成したバケットの名前ではなく--- BUCKET_NAME ---という文字列を入れてないですよね?

投稿2020/09/08 02:38

yu_1985

総合スコア7588

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

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

suika11

2020/09/08 02:51 編集

ありがとうございます。 BUCKET_NAMEの部分は実際のバケット名です。 環境変数を使った方法がわからないので、教えていただけませんか?
yu_1985

2020/09/08 03:03

構築しているものが素のPHPのみで作っているのか何らかのフレームワークを使っているのかわかりませんが、いずれにしても環境変数を読み込む方法についての詳細はドキュメントをご参照ください。 PHPのみだったら別途環境変数を設定した上で、getenv取得ですかね? Herokuには環境変数を設定するコマンドがあるので、それを使って設定しておくといいでしょう。 https://qiita.com/kazuhikoyamashita/items/2c3c31155e98675f780f フレームワークの場合たとえばLaravelだったら.envに設定すれば変数がセットできます。(他のフレームワークでも同様かもしれないですが、多分何かしらドキュメントに記載があるでしょう。) https://readouble.com/laravel/5.7/ja/configuration.html キーを直接ファイルに書き込むのがよろしくないと言ったのは、リポジトリに誤ってコミットすると悪用されるからなので、.envに記載するのだとしたら.envをコミットしてはいけません。.gitignoreでコミット対象外にしてください。
suika11

2020/09/08 03:14

PHPのみで書いています。 別途環境変数を設定した上で再度試してみます。
suika11

2020/09/08 04:11

別途、環境変数設定した上でgetenv関数で値を指定し、再度読み込んだら下記のエラーが発生しました。 PHP Fatal error: Uncaught Aws\Exception\CredentialsException: Error retrieving credentials from the instance profile metadata service. (cURL error 28: Connection timed out after 1000 milliseconds (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)) in /app/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php:240 対処法がわからず攻めあぐねています。よろしければ助言いただけますでしょうか。
yu_1985

2020/09/09 06:38

どうにもちゃんと鍵を渡せてないような気がするのですが…。 見た感じインスタンスプロファイルを読みに行っている用に見えますが、インスタンスプロファイルを読みに行くのは他に何も権限を渡す設定がなかったときで、キーを渡しているならそちらが優先されるはずなので…。
suika11

2020/09/09 06:56

回答ありがとうございます。 キーというのは、アクセスキーとシークレットアクセスキーのことですか? 環境変数に代入して、PHP側で取得できているのですが、どこか確認すべき場所がございましたらご指摘願えますか?
yu_1985

2020/09/09 06:58

ちょっと書いてある内容だけだとわからないので修正後のコードも貼ってみてください
suika11

2020/09/09 07:13

追記致しました。ご確認よろしくお願いします。
yu_1985

2020/09/10 01:47

よく見たら綴りが違いますね… > 'cledentials'
suika11

2020/09/10 02:06

確かに綴りを直したら画像ファイルはアップロードされました。 認証情報のドキュメントについても勉強します。 助かりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問