LaravelでAmazonSNSを利用してSMSを送信する

Laravel x AmazonSNSでSMSを送信する

LaravelからAmazonSNSを通して、SMSを送信する処理の実装を残しておきます。
対象者として、Laravel,AWSをちょっとでも利用したことがある方です。

  • ※AmazonSNSでの日本のSMS送信は1本0.07451$≒11円くらいかかるので、注意してください。(記載当時)

手順

1. AWSの準備

※注意:テスト環境だと、サンドボックス内の電話番号にしか送信できません。
そのため、サンドボックスにテストに利用する電話番号を登録する必要があります。

  1. サンドボックスに電話番号の登録
  2. 送信者の作成(End User messagingコンソール)
    • 作成した名前でSMSを送信することができます。
  3. いったんコンソール側から送信テストしてください。
  4. IAMユーザーの作成
    • 今回は送信の実装ですので、SNSのPublish権限を付与します。
  5. 作成したIAMユーザーのアクセスキーを取得

2. Laravel側の準備

  1. .envにて、上記作成したアクセスキーを設定します。

    AWS_ACCESS_KEY_ID=xxxxxxxxxxxx
    AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxx
    AWS_REGION=ap-northeast-1
  2. composerにて、AWSのSDKをインストールします。 ※記載当時は^3.10です。

    composer require aws/aws-sdk-php-laravel
  3. bootstrap/providers.phpにて、プロバイダーの登録

    <?php
    
    return [
        // any providers...
        Aws\Laravel\AwsServiceProvider::class,
    ];
  4. config/aws.phpの作成

    php artisan vendor:publish --provider="Aws\Laravel\AwsServiceProvider"

3. コマンドの実装

artisanコマンドを利用して、Laravelコマンドを作成します。

php artisan make:command AmazonSMS

処理の実装は以下のようになります。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\App;
use Throwable;

class AmazonSMS extends Command
{
    protected $signature = 'amazon:sms {phoneNumber} {message} {senderId?}';
    protected $description = 'Send an SMS via Amazon SNS';

    public function handle()
    {
        // memo: Trialプランの場合、承認された電話番号にしか送信できない。
        $phoneNumber = $this->argument('phoneNumber');
        $message = $this->argument('message');
        $senderId = $this->argument('senderId');

        $sns = App::make('aws')->createClient('sns');
        try {
            $sns->publish([
                'Message' => $message,
                'PhoneNumber' => $phoneNumber,
                ...($senderId ? ['MessageAttributes' => [
                    'AWS.SNS.SMS.SenderID' => [
                        'DataType' => 'String',
                        'StringValue' => $senderId
                    ],
                ]] : []),
            ]);
        } catch (Throwable $e) {
            $this->error('Failed to send SMS: ' . $e->getMessage());
            return 1;
        }
    }
}

4. コマンドの実行

実際コマンドのほうを投げて実際届くのか確認してみてください。
※注意サンドボックス中はサンドボックスに登録された電話番号にしか送信できません。 ※注意送信者のデフォルト名はNOTICEになります。送信者作成してもID名が間違っている場合は、NOTICEが送信者名になります。

php artisan amazon:sms +819012345678 "Hello from Laravel!"
Hello from Laravel!

というメッセージが届くと思われます。

まとめ

ということで、LaravelからAmazonSNSを利用してSMSを送信する方法を解説しました。
Twilioを利用したSMS送信も記載しているので、どちらを利用するか検討している方は、そちらもご覧ください。