AWS Laravel

【AWS SQS + Laravel】LaravelからSQSにメッセージを送信する方法

開発環境

  • Laravel9
  • AWS SQS(Simple Queue Service)

概要

LaravelでAWS SQS(Simple Queue Service)にキューを送信して、

Lambda処理を始めるトリガーにする必要がありました。

SQSを今まで使用したことがなく、使ってみると意外と便利だったため備忘録として残します。

SQSをルーティングするSNSに関する詳細は、こちらを御ご覧ください

SDKをインストール

最初に、AWS SDK for PHPをLaravelプロジェクトにインストールします。

composer require aws/aws-sdk-php

環境設定

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

AWS_ACCESS_KEY_ID=IAMユーザーのアクセスキー
AWS_SECRET_ACCESS_KEY=IAMユーザーのシークレットキー
AWS_DEFAULT_REGION=あなたのリージョン

AWS_SQS_QUEUE=あなたのSQSキューのURL

SQSクライアントの作成

SQSクライアントを作成します。

新しく app/Services/SqsService.php ファイルを作成し、以下のように記述します

<?php

<?php

namespace App\Services;

use Aws\Sqs\SqsClient;

class SqsService
{
    protected $client;

    public function __construct()
    {
        $this->client = new SqsClient([
            'version' => 'latest',
            'region' => env('AWS_DEFAULT_REGION'),
            'credentials' => [
                'key' => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY'),
            ],
        ]);
    }

    public function sendMessage($message, $queueUrl = null)
    {
        $queueUrl = $queueUrl ?? env('AWS_SQS_QUEUE');

        $this->client->sendMessage([
            'QueueUrl' => $queueUrl,
            'MessageBody' => $message,
        ]);
    }
}

やっていること

※クライアントはAWSのSDKで各サービスのメソッドを扱う時に毎回作成するものです。

  1. コンストラクタ関数 (__construct()): この関数は、クラスのインスタンスが作られるときに自動的に呼び出されます。ここでは、SQSクライアントの初期設定を行っています。
    • version: AWSのサービスを使用するためのAPIバージョンを指定します。ここでは 'latest' を指定していますが、これは最新のAPIバージョンを自動的に選択するという意味です。
    • region: AWSのリージョンを指定します。ここでは環境変数からリージョンを取得しています。
    • credentials: AWSにアクセスするための認証情報を指定します。keysecret には、それぞれAWSのアクセスキーとシークレットキーを指定します。ここでも環境変数からこれらの値を取得しています。
  2. sendMessage() 関数: この関数は、指定したSQSキューにメッセージを送信します。
    • QueueUrl: メッセージを送信するSQSキューのURLを指定します。関数の第2引数としてURLを渡すことも可能ですが、渡されない場合は環境変数からデフォルトのキューURLを取得します。
    • MessageBody: 送信するメッセージを指定します。ここには任意の文字列を指定できます。

通知の実装

最後に、通知を行うメソッドを実装します。

以下は例として app/Http/Controllers/NotificationController.php に実装しています

?php

namespace App\Http\Controllers;

use App\Services\SqsService;
use Illuminate\Http\Request;

class NotificationController extends Controller
{
    protected $sqsService;

    public function __construct(SqsService $sqsService)
    {
        $this->sqsService = $sqsService;
    }

    public function sendNotification(Request $request)
    {
        $message = $request->input('message');

        $this->sqsService->sendMessage($message);

        return response()->json([
            'status' => 'success',
            'message' => 'Notification sent',
        ]);
    }
}

以上で、SQS通知の設定は完了です。

リクエストにメッセージを含め、指定されたキューに対して通知を送ることができます。

-AWS, Laravel