ポートフォリオサイトへの導入です。
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/*"
]
}
]
}

上記をjsonで指定し、ポリシーを新規作成。
OK!!
S3バケット作成
アクセス権については、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
を確認
'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= バケット名
アップロード周り
コントローラーに追記
$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))
.env
とfilesystems.php
の変数名が一致していなかったので修正。
→保存できた。
view周り
$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 つの方法
公式