AWS Laravel

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

開発環境

  • Laravel9
  • AWS SNS(Simple Notification Service)

概要

LaravelでAPIを作成して、処理が完了したことをAWS SNS(Simple Notification Service)に通知する必要がありました。

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

SQSについての記事はこちらです

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_SNS_VERSION=SNSのバージョン

3. SNSクライアントの作成

次に、SNSクライアントを作成します。

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

<?php

namespace App\Services;

use Aws\Sns\SnsClient;

class SnsService
{
    protected $client;

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

    public function publish($message, $topicArn)
    {
        $this->client->publish([
            'Message' => $message,
            'TopicArn' => $topicArn,
        ]);
    }
}

コンストラクタでSNSクライアントを作成しています。

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

  1. コンストラクタ関数 (__construct()): この関数は、クラスのインスタンスが作られるときに自動的に呼び出されます。ここでは、SNSクライアントの初期設定を行っています。
    • version: AWSのサービスを使用するためのAPIバージョンを指定します。ここでは 'latest' を指定していますが、これは最新のAPIバージョンを自動的に選択するという意味です。
    • region: AWSのリージョンを指定します。ここでは環境変数からリージョンを取得しています。
    • credentials: AWSにアクセスするための認証情報を指定します。keysecret には、それぞれAWSのアクセスキーとシークレットキーを指定します。ここでも環境変数からこれらの値を取得しています。
  1. publish() 関数: この関数は、指定したSNSトピックにメッセージをパブリッシュします。
    • Message: パブリッシュするメッセージを指定します。ここには任意の文字列を指定できます。
    • TopicArn: メッセージをパブリッシュするSNSトピックをARN(Amazon Resource Name)で指定します。このARNは、どのトピックにメッセージを送るかを指定するための一意の識別子です。

通知の実装

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

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

<?php

namespace App\Http\Controllers;

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

class NotificationController extends Controller
{
    protected $snsService;

    public function __construct(SnsService $snsService)
    {
        $this->snsService = $snsService;
    }

    public function sendNotification(Request $request)
    {
        $message = $request->input('message');
        $topicArn = 'arn:aws:sns:ap-northeast-1:123456789012:MyTopic';

        $this->snsService->publish($message, $topicArn);

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

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

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

-AWS, Laravel