【PHP】artisanコマンドとAWSを使ってスマホにSMSを送る


AWSからSMSを送る実装
すっごく苦戦したので記事にします!!!笑

ちなみに僕が躓いたポイントは

<Error>
<Type>Sender</Type>
<Code>InvalidClie (truncated...)
InvalidClientTokenId (client): The security token included in the request is invalid. - <ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
<Error>
<Type>Sender</Type>
<Code>InvalidClientTokenId</Code>
<Message>The security token included in the request is invalid.</Message>
</Error>

でした・・・。


PHPの実装
以下のコマンドをはたきます。

$ composer require aws/aws-sdk-php-laravel

aws-sdk-php-laravelが入るので、「./config/app.php」に以下を追加してあげます。

'providers' => [
   Aws\Laravel\AwsServiceProvider::class,
],

おそらく、providersはすでに定義されているはずなので、1行追加するだけですね!

次にartisanコマンドをベシっと。

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

すると今度は「./config/aws.php」というファイルができるはずなので、そこに以下を追記します。

  'credentials' => [
    'key'    => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
  ],

次にこの実装の中核とも言えるSMSを送信する部分を書きます。
「./app/console/commands/SendSms.php」

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use AWS;

class SendSms extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send:sms {phonenum} {body}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Send SMS';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $phonenum = $this->argument('phonenum');
        $body = $this->argument('body');
        $sns = AWS::createClient('Sns');
        $sns->publish(['Message' => $body, 'PhoneNumber' => $phonenum]);
    }
}

肝は「protected $signature = ‘send:sms {phonenum} {body}’;」ですね。

コマンド実行時に引数で電話番号と本文を渡せるようにしています。

必須にしたかったので引数は必須で実装しています(だってSMSに宛先や本文がなかったら事件ですよね)。

.envファイルの編集
最後に「./.env」ファイルに「AWS_ACCESS_KEY_ID」と「AWS_SECRET_ACCESS_KEY」を記入します。

ちなみに僕が403を食らっていた理由は、同僚がすでにAWS_ACCESS_KEY_IDを.envで定義していたからでした・・・。

末尾に追記した僕のアクセスキーではなく、ファイルの中断にあった友人のアクセスキーが読まれていたという、なんとも童貞臭いミスでした・・・。インフラチームごめんよ・・・。

なので、特に宗教上の理由がなかったら「aws.php」の定義も「.env」ファイルも

  'credentials' => [
    'key'    => env('AWS_ACCESS_KEY_ID_FOR_SNS'),
    'secret' => env('AWS_SECRET_ACCESS_KEY_FOR_SNS'),
  ],

とかにしておくことを心のそこからおすすめします。

一般常識レベルですが念のため。
「.env」ファイルでアクセスキーを記載する際はクォーテーションなどは不要なので注意を。

アクセスキーとシークレットアクセスキーはAWSのIAMから取得してくだされ。


送信

php artisan send:sms +819012345678 テストだよ

※電話番号はダミーの番号です。必ずご自身の番号で疎通テストをしてください。mokabuu.comでは一切の責任を負いかねます。

やったね!


最後まで読んでいただきありがとうございます。もしこの記事を気に入って頂けたようであればシェアをお願い致します。非常に励みになります。


コメントを残す