LaravelのJobキューをAmazon SQSで実行する

はじめに

Webアプリケーションの開発において、バックグラウンドでの処理は重要な役割を果たします。

メール送信、画像処理、データの集計など、ユーザーのリクエストに直接関係しない処理を効率的に管理するために、キュー(Job Queue)を活用することが一般的です。

本記事では、PHPフレームワークであるLaravelのジョブキューをAmazon SQS(Simple Queue Service)と連携させて実行する方法について解説します。

Laravelのキュー概要

Laravelのキューは、時間のかかる処理をバックグラウンドで非同期に実行するための強力なツールです。

これにより、ユーザーのリクエストに対する応答性を向上させ、アプリケーションのスケーラビリティを高めることができます。

例えば、画面からの登録処理でメールを一斉送信する場合、メールをすべて送信できるまでローディングが続いてしまいます。そんなときに、メール送信をキューを使えばバックグラウンドで実行し、画面上の処理を先に終えることができます。

Amazon SQSとは

Amazon SQSは、AWSが提供する完全マネージド型のメッセージキューサービスです。高い可用性とスケーラビリティを備え、分散システムやマイクロサービス間のメッセージングを簡単に実現できます。

SQSでキュー登録する

AWSにログインし、SQSでキューの登録画面で登録する。

タイプ:標準orFIFOどちらかを選択する
標準:メッセージの順番は保持しない
FIFO:先入れ先出しで実行

名前:キューの名前を適当に設定する

設定は初期状態でひとまずOK

暗号化は有効にする

アクセスポリシー以下も標準でそのままでOK

「キューを作成」ボタンを押してキューを作成する。

登録すると、下記のようになります。

LaravelでAmazon SQSを設定する

必要なパッケージのインストール

LaravelはデフォルトでSQSをサポートしていますが、必要に応じてAWS SDKのインストールを確認します。

composer require aws/aws-sdk-php

環境変数の設定

.envファイルに以下の設定を追加します。

QUEUE_CONNECTION=sqs

AWS_ACCESS_KEY_ID=your_aws_access_key_id
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key
AWS_DEFAULT_REGION=your_aws_region
SQS_QUEUE=https://sqs.your_region.amazonaws.com/your_account_id/your_queue_name

your_aws_access_key_idとyour_aws_secret_access_keyはIAMのアクセスキーを設定する。もし未作成であれば作成する。

your_aws_regionはリージョンを設定する(例:ap-northeast-1)

SQS_QUEUEにはSQSに記載されているURLを貼り付ける

config/queue.phpの設定確認

config/queue.phpファイルを開き、SQSの設定が正しいか確認します。

'sqs' => [
    'driver' => 'sqs',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'prefix' => env('SQS_PREFIX', 'https://sqs.your_region.amazonaws.com/your_account_id'),
    'queue' => env('SQS_QUEUE', 'your_queue_name'),
    'region' => env('AWS_DEFAULT_REGION', 'your_region'),
],

ジョブの作成

Laravelでは、ジョブクラスを作成するためにArtisanコマンドを使用します。

php artisan make:job SendWelcomeEmail

生成されたジョブクラスは app/Jobs/SendWelcomeEmail.php にあります。例として、ユーザーにウェルカムメールを送信するジョブを実装します。

<?php

namespace App\Jobs;

use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Mail;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;

class SendWelcomeEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;

    /**
     * Create a new job instance.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
     Log::debug('TestQue::handle');
     Log::debug($this->user->name);
    }
}

ジョブのディスパッチ

例えば、新規ユーザー登録時にウェルカムメールを送信する場合、コントローラー内で以下のようにジョブをディスパッチします。

use App\Jobs\SendWelcomeEmail;
use App\Models\User;

public function register(Request $request)
{
    // ユーザー登録処理
    $user = User::create([
        'name' => $request->name,
        'email' => $request->email,
        // その他のフィールド
    ]);

    // ジョブをキューに投入
    SendWelcomeEmail::dispatch($user);

    return response()->json(['message' => '登録が完了しました。']);
}

キューワーカーの実行

ジョブをキューに投入しただけでは実行されません。キューワーカーを起動してジョブを処理する必要があります。

キューワーカーの起動

以下のコマンドでキューワーカーを起動します。

php artisan queue:work

これで処理を実行すると、キューが実行されるはずです。

SQS画面の「モニタリング」でも確認することができます。

トラブルシューティング

ジョブがキューに投入されない

  • .envファイルのQUEUE_CONNECTIONsqsに設定されているか確認。
  • AWSのアクセスキーとシークレットキーが正しいか確認。
  • SQSキューのURLが正しいか確認。

キューワーカーがジョブを処理しない

  • キューワーカーが正しく起動しているか確認。
  • ジョブクラスにhandleメソッドが正しく実装されているか確認。
  • ログファイル(storage/logs/laravel.logやキューワーカーのログ)を確認し、エラーがないかチェック。

AWS SQSの権限エラー

  • IAMユーザーにSQSへのアクセス権限が付与されているか確認。
  • 必要に応じて、ポリシーを更新して適切な権限を付与。

まとめ

LaravelのジョブキューをAmazon SQSと連携させることで、高いスケーラビリティと信頼性を持つバックグラウンド処理を実現できます。この記事では、基本的な設定手順とジョブの作成方法、キューワーカーの実行方法について解説しました。これらの手法を活用して、アプリケーションのパフォーマンスとユーザー体験を向上させましょう。