Help us understand the problem. What is going on with this article?

LaravelでS3を使用する

ポートフォリオサイトへの導入です。
ALBで運用しているため、public/storageへの保存ではロードされない場合があるということにようやく気づきました。おばか。

IAMユーザー作成

当初はAmazonS3FullAccessをアタッチしていたのですが、権限が多すぎるため変更します。

参考にさせていただきました。ありがとうございます。
Laravel による S3 操作に必要な最小限の IAM ポリシー

The required IAM permissions are:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1420044805001",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:ReplicateObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        }
    ]
}

スクリーンショット 2020-02-13 22.12.11.jpg

上記をjsonで指定し、ポリシーを新規作成。

作成したポリシーを早速アタッチ。
スクリーンショット 2020-02-13 22.15.44.jpg

OK!!

S3バケット作成

アクセス権については、ACLブロックをオフに設定。
新しいアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
オフ
任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする
オフ

Laravelへ組み込む

パッケージインストール。

composer require league/flysystem-aws-s3-v3
composer.json
    "require": {
        "php": "^7.1.3",
        "barryvdh/laravel-debugbar": "^3.2",
        "doctrine/dbal": "^2.9",
        "fideloper/proxy": "^4.0",
        "fzaninotto/faker": "^1.4",
        "laravel/framework": "5.7.*",
        "laravel/tinker": "^1.0",
        "league/flysystem-aws-s3-v3": "^1.0" // 追加を確認
    },

configからfilesystems.phpを確認

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'),
      ],

環境変数に登録

AWS_ACCESS_KEY_ID= アクセスキーID
AWS_SECRET_ACCESS_KEY= IAMユーザーのシークレットアクセスキー
AWS_DEFAULT_REGION= ap-northeast-1
AWS_BUCKET= バケット名

アップロード周り

コントローラーに追記

Controller.php
$name = time().'_'.$file->getClientOriginalName();
$disk = Storage::disk('s3')->putFileAs('/', $file, $name,'public');

引数にpublicを指定することで、URLによるアクセスが可能になるとのこと。

試しに保存。エラー発生。

Aws \ Exception \ CredentialsException

Error retrieving credentials from the instance profile metadata server. (cURL error 28: Connection timed out after 1001 milliseconds (see https://curl.haxx.se/libcurl/c/libcurl-errors.html))

.envfilesystems.phpの変数名が一致していなかったので修正。

→保存できた。

view周り

Controller.php
        $user = User::findOrFail($id);

        if($user->photo_id !== null) {
            $path = Storage::disk('s3')->url('profile/'. $user->photo->filename);
        } else {
            $path = 'img/no_image.png';
        }
<img src="{{ $path }}" alt="ユーザー画像">

→表示された。

なんとか実装できました。
これでALBにも対応できそうです。

参考:
超簡単!LaravelでS3を利用する手順
LaravelのFlysystem-aws-s3でAmazon S3と連携しファイル操作を行う
[Laravel] AWS S3 と連携する 2 つの方法
公式

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした