開発環境
- 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で各サービスのメソッドを扱う時に毎回作成するものです。
- コンストラクタ関数 (
__construct()
): この関数は、クラスのインスタンスが作られるときに自動的に呼び出されます。ここでは、SNSクライアントの初期設定を行っています。version
: AWSのサービスを使用するためのAPIバージョンを指定します。ここでは 'latest' を指定していますが、これは最新のAPIバージョンを自動的に選択するという意味です。region
: AWSのリージョンを指定します。ここでは環境変数からリージョンを取得しています。credentials
: AWSにアクセスするための認証情報を指定します。key
とsecret
には、それぞれAWSのアクセスキーとシークレットキーを指定します。ここでも環境変数からこれらの値を取得しています。
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通知の設定は完了です。
リクエストにメッセージを含め、指定されたトピックに対して通知を送ることができます。