LaravelでAmazon SQSの非同期処理を実装する

もとやん
2021-03-22
もとやん
2021-03-22

前置き

今回は、JavascriptでAmazon SQSにQueueの作成、LaravelでQueueの非同期処理します。

Amazon SQSにQueueを作成する

```
fetch('your-end-point', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'x-api-key': 'your-api-key',
    },
    body: JSON.stringify({
        data: 'your-data',
        job: 'ReceiveSqs'
    }),
}).then(response => response.json()
).then(data => {
    console.log('SQS Success:', data);
}).catch((error) => {
    console.error('SQS Error:', error);
});
```
`body`の`data`に処理するデータ、`job`に処理するクラス名を指定します。

LaravelのQueueにSQSの設定をする

```
return [
    'default' => env('QUEUE_DRIVER', 'sqs'),

    'connections' => [
        'sqs' => [
            'driver' => 'sqs',
            'key' => env('SQS_KEY', 'your-public-key'),
            'secret' => env('SQS_SECRET', 'your-secret-key'),
            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
            'queue' => env('SQS_QUEUE', 'your-queue-name'),
            'region' => env('SQS_REGION', 'us-east-1'),
        ],
    ],
];
```
`config/queue.php`は上記のようになっているので、`env/.env`の値が優先されるので注意しましょう。

Laravelで非同期処理をする

```
<?php

namespace App;

use Illuminate\Queue\Jobs\Job;
use Illuminate\Support\Facades\Log;

class ReceiveSqs
{
    public function fire(Job $job, array $data): void
    {
        try {
            // ここに処理を書く
            Log::info('SQS: success', $data);
        } catch (\Exception $ex) {
            // ここにエラー処理を書く
            Log::error('SQS: ' . $ex->getMessage(), $data);
        } finally {
            // 最後にjobを削除する
            $job->delete();
        }
    }
}
```
 fetchのjobに指名したクラスのfireが呼ばれます。

最後に

```
php artisan queue:work
```
LaravelのQueueを実行すると、fetchが発生する度に処理がされると思います。

ではでは。