🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Amazon S3

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

AWS(Amazon Web Services)

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

1351閲覧

S3に本番環境で画像をアップロードしたい

kei_0715

総合スコア10

PHP

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Amazon S3

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

AWS(Amazon Web Services)

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/11/19 02:27

編集2019/11/19 23:34

前提・実現したいこと

laravelで構築したサイトを本番環境で運用しています。
その中でS3を使って画像をアップロードしたいです。

発生している問題・エラーメッセージ

ローカル環境では問題なく画像をアップロードできているのですが、
本番環境(ec2)を使用した際にエラーが発生していまいます。

下記がエラーメッセージになります。

GuzzleHttp\Exception\ClientException Client error: `GET http://169.254.169.254/latest/meta-data/iam/security-credentials/` resulted in a `404 Not Found` response: <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. (truncated...)
return new $className($message, $request, $response, $previous, $ctx); } /** * Get a short summary of the response * * Will return `null` if the response is not printable. * * @param ResponseInterface $response * * @return string|null

Controllerの内容

use Storage; --略 public function create(Request $request) { $this->validate($request, News::$rules); $news = new News; $form = $request->all(); if (isset($form['image'])) { $path = Storage::disk('s3')->putFile('/',$form['image'],'public'); $news->image_path = Storage::disk('s3')->url($path); } else { $news->image_path = null; } unset($form['_token']); unset($form['image']); $news->fill($form); $news->save(); return redirect('news/create');

viewの内容

@extends('layouts.news') @section('title','新規ニュースの作成') @section('content') <div class="container"> <div class="row"> <div class="col-md-8 mx-auto"> <h2>新規ニュースの作成</h2> <form action="{{ action('NewsController@create') }}" method="post" enctype="multipart/form-data"> @if (count($errors) > 0) <ul> @foreach($errors->all() as $e) <li>{{ $e }}</li> @endforeach </ul> @endif <div class="form-group row"> <label class="col-md-2" for="title">タイトル</label> <div class="col-md-10"> <input type="text" class="form-control" name="title" value="{{ old('title') }}"> </div> </div> <div class="form-group row"> <label class="col-md-2" for="body">本文</label> <div class="col-md-10"> <textarea class="form-control" name="body" rows="20">{{ old('body') }}</textarea> </div> </div> <div class="form-group row"> <label class="col-md-2" for="title">画像</label> <div class="col-md-10"> <input type="file" class="form-control-file" name="image"> </div> </div> {{ csrf_field() }} <input type="submit" class="btn btn-primary" value="更新"> <a href="{{ action('HomeController@browse') }}" role="button" class="btn btn-primary">TOPへ戻る</a> </form> </div> </div> </div> @endsection

filesystems.php

's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), ],

.env

AWS_ACCESS_KEY_ID=****************** AWS_SECRET_ACCESS_KEY=*************** AWS_DEFAULT_REGION=ap-northeast-1 AWS_BUCKET=portfolio-salon

試したこと

S3バケットのアクセス許可(アカウント、バケット)をオフ。
###考えたこと
エラーが404だったので記述ミスも考えたのですが、ローカルで通っていたので本番用の設定に
何かミスがあるのではないかと考えています。

すみません、どなたかアドバイスあればお願いします。

補足情報(FW/ツールのバージョンなど)

Laravel 6.2.0
PHP 7.2.19
cloud 9(ローカル環境)
ec2(本番環境)

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

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

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

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

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

guest

回答3

0

###IAMロールの作成
タイプ:EC2
パーミッション:Amazon S3 Full Access
以上の内容で作成すると下記画像の様になる。
イメージ説明

###作成したロールをインスタンスに割り当て
参考にした動画

AWS側の設定後、
php artisan cache:clear
php artisan config:clear、で解決しました!

投稿2019/11/21 01:12

kei_0715

総合スコア10

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

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

0

ベストアンサー

IAM 管理画面で、IAMロールを作成してください。
タイプ:EC2
パーミッション:S3バケットへのアクセス許可を設定するかテンプレートから「Amazon S3 Full Access」を選ぶ
次にEC2管理画面で インスタンスを作成するときに 先程作成した IAMロールを選択します。
詳しくは次のナレッジの関連情報のリンクを読んでみてみてください。
IAM ロールを作成しましたが、これを EC2 インスタンスに割り当てたいと思います。

IAMロールを作成すると curl http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name で認証情報が返されるので アクセスできるようになると思います。

投稿2019/11/19 03:04

編集2019/11/19 12:36
take88

総合スコア1467

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

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

kei_0715

2019/11/19 06:19 編集

設定をしたところアクセスはできた様です! ただ、次のエラーがでました。 Aws\S3\Exception\S3Exception Error executing "PutObject" on "https://kvpeoug8ohhtgob70vhbscz42wwgczzezdxzq47t.jpeg"; AWS HTTP error: cURL error 6: Could not resolve host: kvpeoug8ohhtgob70vhbscz42wwgczzezdxzq47t.jpeg (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) .envは見直しました。。。 ローカルではphp artisan cache:clearでは変化が無く、 php artisan config:clearをして、記述ミスを直したところ解決しました。 すみません、本番環境でphp artisan config:clearを実行したら画面が真っ白になり対策中です。
take88

2019/11/19 12:47 編集

エラーのURLに S3 バケットの名前が入ってない(kv~.jpeg はファイル名ですよね?)のですが、バケットの設定は正しいですか? filesystems.php と .env ファイルの内容を、質問に追記できますか?(センシティブな内容は適当にマスクして貰えればと思います)
kei_0715

2019/11/21 00:01 編集

解決しました!S3の設定自体は間違っていなかったようです。 php artisan config:clearでキャッシュクリアしたら通りました。 今回.envに誤った記述をしてしまっていて、キャッシュクリア後に画面が真っ白になっていましたが、 そちらを解消したところ、無事画像の方も反映出来る様になっていました! IAMのロールに関して知識が足りず、本当に助かりました。 ありがとうございました! ベストアンサーですが、お二人の方に回答して頂いて非常に甲乙付け難いのですが。。。 IAMロールの作成に関して詳細を記述して頂いたtake88さんにさせて頂きました。
take88

2019/11/20 23:59

よかったですね。解決したならご自身で回答を書いて、解決済みにしてもらえますか。あとから見た人が解決済みだと分かるので ソッチのほうが親切だと思います。よろしくおねがいします。
guest

0

GET http://169.254.169.254/latest/meta-data/iam/security-credentials

ということなので、EC2インスタンスのクレデンシャル情報を取得しようとして見つからない、という挙動をしている用に見えます。
Cloud9の環境ではどのようにS3にアクセスする権限を与えていましたか?
また本番環境のインスタンスに何らかの形で必要な権限を与えていますか?

投稿2019/11/19 02:37

yu_1985

総合スコア7588

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

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

kei_0715

2019/11/19 02:57

composer require league/flysystem-aws-s3-v3 パッケージをインストールして.envファイルを編集してます。 本番環境の.envにも同様の編集を行いました。 後はAWS側のブロックパブリックアクセスに関しては全てオフにしてます。
yu_1985

2019/11/19 03:14

IAMアクセスキーをどこかで指定してそれを読み取っているのであれば、恐らくそこの権限を先に取得するはずです。 こちらはCLIのものですが、権限の取得には優先順位があり、特に何も設定をしていない場合にインスタンスプロファイルに関連付けられたロールの権限を使用するようになります。 https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html#config-settings-and-precedence つまり、キーの情報を正しく渡せていないのでは、と思います。 ただ、そもそもの話としてEC2インスタンスからAWSのリソースへのアクセスは、IAMアクセスキーではなくIAMロールを使用すべきです。
kei_0715

2019/11/19 04:02

すみません、IAMロールを理解していませんでした。 詳細情報までありがとうございます! 読み取りまでは行われましたがs3バケットに繋がっていない様です。
yu_1985

2019/11/19 04:23

個人的には明らかにおかしなURLが返ってきているのが気になります。
kei_0715

2019/11/19 05:35

ローカルではphp artisan cache:clearでは変化が無く、 php artisan config:clearをして、記述ミスを直したところ解決しました。 すみません、本番環境でphp artisan config:clearを実行したら画面が真っ白になってます。
kei_0715

2019/11/19 05:59 編集

インスタンスの再起動をしてみましたが、変化ありませんでした。。。
yu_1985

2019/11/20 02:25

そういえばS3バケット自体の設定はどうなってますか? Storage::disk('s3')->putFile('/',$form['image'],'public'); と指定していますが、S3バケット自体はインターネットからアクセスできるような設定(静的WEBサイトホスティング)を設定していますでしょうか。
kei_0715

2019/11/20 08:50

この設定はしていませんでした。 ローカルで動作確認がとれた場合でも、本番ではその様な設定をしなければいけないのでしょうか? ちなみにconfig:clear後の画面が、いまだ表示できていません・・・。
yu_1985

2019/11/20 09:04

ローカルからは一応実行できたんですね…。バケット作成時はデフォルトではパブリックに公開できないような設定になっているので、バッティングする可能性があるかもしれないです。 画面が表示できていない理由についてはログを見てみないと何とも言えませんが、何か新しい情報は出ていないですか?
kei_0715

2019/11/20 23:55

解決しました!S3の設定自体は間違っていなかったようです。 php artisan config:clearでキャッシュクリアしたら通りました。 今回.envに誤った記述をしてしまっていて、キャッシュクリア後に画面が真っ白になっていましたが、 そちらを解消したところ、無事画像の方も反映出来る様になっていました! IAMのロールに関して知識が足りず、本当に助かりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問