LaravelでAmazon SQSの非同期処理を実装する
前置き
今回は、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が発生する度に処理がされると思います。
ではでは。