Laravelのファイル保存先をS3に変更してみた

2020.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。  

PHP LaravelにはSFTPやRackspace、Amazon S3などにファイルを保存をするパッケージが用意されています。 今回はAmazon S3に保存できる状態まで試してみたいと思います。

構成イメージ

今回、新規でS3バケットの作成とEC2からアクセスする用にIAMロール、ポリシーの作成をしております。
構成図

検証用のS3バケット作成

S3バケットを作成

ファイルの保存先としてS3を新規作成します。
AWSマネージメントコンソール上からサービス > S3を選択します。
S3画面に移動したら一覧上部の[バケットを作成]をクリックします。

S3バケットの新規作成

設定を入力

S3バケットに設定する内容を入力します。
今回はバケット名のみ設定をして[バケットを作成]をクリックします。

S3バケットの設定を入力

作成完了

バケットの作成成功のメッセージが表示されたら、作成は完了です。

S3バケットの作成完了

S3アクセス用のIAMロール・ポリシー作成

IAMロール作成

作成したS3にEC2からアクセスするためにロールの登録をします。
AWSマネージメントコンソール上からサービス > IAM を選択、サブメニューからロールを選択します。
ロール画面に移動したら[ロールの作成]をクリックします。

S3アクセス用のIAMロール作成

ロールの種類を選択

ユースケースの選択に表示されている[EC2]を選択します。
選択後、画面下の[次のステップ]をクリックします。

ロールの種類を選択

ポリシーの作成

今回は作成したS3のみアクセスできる権限を準備するため独自のポリシーを設定します。
上部の[ポリシーの作成]をクリックします。

独自ポリシーの作成

ポリシーの設定

JSONタブを選択して、ポリシーの内容を入力します。
ポリシーは作成したS3の権限を付与するように設定します。
入力後、[ポリシーの確認]をクリックします。

// ポリシーの内容
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": "*",
            "Resource": [
                "arn:aws:s3:::[許可をするバケット名]",
                "arn:aws:s3:::[許可をするバケット名]/*"
            ],
            "Effect": "Allow"
        }
    ]
}

ポリシーの確認

内容を確認して問題なければポリシー名を入力して[ポリシーの作成]をクリックします。

ポリシーの確認

ポリシーの作成完了

ポリシーの作成が完了します。 完了をしたらウィンドウを閉じて先ほどのロール作成画面に戻ります。

ポリシーの作成完了

作成したポリシーの選択

先ほど作成したポリシーを表示するため右の更新ボタンを押して一覧内容を更新してください。
検索に先ほど指定したポリシー名を入力して選択をします。
選択後、[次のステップ]をクリックします。

独自ポリシーの選択

タグの指定

内容は変更せず、[次のステップ]をクリックします。

ロール作成の確認

内容を確認して問題なければロール名を入力して[ロールの作成]をクリックします。

ロール作成の確認

ロール作成の完了

上記でロールの作成は完了なります。

EC2にIAMロールをアタッチ

対象のEC2を選択してIAMロールの選択へ

AWSマネージメントコンソール上からサービス > EC2を選択します。
EC2画面に移動したらLaravelが導入されているインスタンスを選択してアクション > セキュリティ > IAMロールの変更を選択します。

対象のEC2を選択してIAMロールの選択へ

IAMロールの選択

IAMロールの選択肢に先ほど作成した物が表示されます。
選択をした状態で[保存]をクリックします。

IAMロールの選択

IAMロールの変更完了

上記でインスタンスに設定されているIAMロールの設定は変更完了となります。
インスタンス詳細のIAMロール欄を確認して設定できているかを合わせて確認します。

LaravelにS3を設定する

S3用のパッケージをインストール

Laravelの公式サイトで掲載されているleague/flysystem-aws-s3-v3をインストールします。

cd [Laravelの保存ディレクトリ]
composer require league/flysystem-aws-s3-v3

S3の環境情報を登録

同ディレクトリ内にある.envファイルにS3の環境情報を入力します。
EC2にS3アクセス用のIAMロールを設定しているためアクセスキーとシークレットキーは空白で登録します。

cd [Laravelの保存ディレクトリ]
vi .env

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1 ※東京リージョン
AWS_BUCKET=[バケット名]

ファイル保存処理を変更

プログラム内のファイル保存処理をS3に格納するように変更します。

vi [Controllerディレクトリ内のファイルアップ処理]

// $request->file('file')->store('');

$file = $request->file('file');
Storage::disk('s3')->putFile('/', $file);

実際に試してみる

テストデータをLaravelのファイルアップロードで上げたところ、EC2のストレージではなく、S3に保存されている事を確認しました。

S3の中身

さいごに

Laravelのファイル保存先をS3に変更してみた。
今回はプライベートのS3に保存しているためファイルを掲載する事ができない状態になっています。
ファイルを掲載する場合は追加で対応する事がございますので別記事でご案内できればと思います。