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

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

ただいまの
回答率

87.58%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 877

score 10

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

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
require_once "./../vendor/autoload.php";

use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\S3\Exception\S3Exception;

$bucket = '--- バケット名 ---';
$key = '--- mykey ---';
$secret = '--- mysecret ---';

$s3 = new S3Client([
  'version' => 'latest',
  'cledentials' => [
    'key' => $key,
    'secret' => $secret
  ],
  'region' => 'リージョン',
]);

$file = $_FILES['img']['tmp_name'];
if (!is_uploaded_file($file)) {
  return;
}

try {
  $result = $s3->putObject([
    'Bucket' => $bucket,
    'Key' => 's3/sample.png',
    'Body' => 'pivate-read',
    'ContentType' => mime_content_type($file)
  ]);
} catch(S3Exception $e) {
  var_dump($e -> getMessage());
}

var_dump($result);
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>test</title>
</head>
<body>
  <form action="s3.php" method="POST" enctype="multipart/form-data">
  <input type="file" name="img">
  <button type="submit">アップロード</button>
</form>

</body>
</html>

したいこと
エラーを解決し、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
require_once "./../vendor/autoload.php";

use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\S3\Exception\S3Exception;

$bucket = getenv('S3_BUCKET_KEY');
$key = getenv('S3_ACCESS_KEY');
$secret = getenv('S3_SECRET_KEY');

$s3 = new S3Client([
  'version' => 'latest',
  'region' => getenv('S3_REGION'),
  'cledentials' => [
    'key' => $key,
    'secret' => $secret
  ]
]);

if (!is_uploaded_file($_FILES['img']['tmp_name'])) {
  return;
}

$file = fopen($_FILES['img']['tmp_name'], 'rb');
try {
  $result = $s3->putObject([
    'ACL' => 'public-read',
    'Bucket' => $bucket,
    'Key' => 'sample.jpg',
    'Body' => $file,
    'ContentType' => mime_content_type($_FILES['img']['tmp_name'])
  ]);
} catch (S3Exception $e) {
  var_dump($e->getMessage());
}

var_dump($result);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yu_1985

    2020/09/07 22:01 編集

    これはローカルのMacで動かしているということでしょうか。
    また、S3に対するアクセスの権限はどのようにして渡していますか?

    ※すいません、キーについては記載ありましたね。
    権限は十分ですか?

    キャンセル

  • yu_1985

    2020/09/07 22:03

    > InvalidBucketName

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

    キャンセル

  • suika11

    2020/09/07 22:23

    記述不足で申し訳ありません。herokuで公開しています。

    該当のバケットのアクセス権限タブの「パブリックアクセスをすべてブロック」のチェックは外しています。

    再度確認しましたがバケット名には問題ありませんでしたが、この記事(https://qiita.com/p_s_m_t/items/4f823b01d339b5776627)ではバケット名を$bucket = '--- BUCKET_NAME ---';としていますが、前後の---は必須ですか?

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/10 10:47

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

    キャンセル

  • 2020/09/10 10:48

    ちなみにですが、認証情報の取得方法についてはドキュメントに詳しく書いてあります
    https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/guide_configuration.html#credentials

    キャンセル

  • 2020/09/10 11:06

    確かに綴りを直したら画像ファイルはアップロードされました。

    認証情報のドキュメントについても勉強します。
    助かりました、ありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

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