SQSのメッセージをトリガーにLambdaを起動

以前、Laravelを利用してSQSメッセージを送信する方法を解説しました。こちらの続きです。

SQSメッセージを送信するだけで機能完了することはほぼ無いことだと思います。メッセージを送信した先で、何らかの処理を実行するために用います。
そこでよく使われるのが、Lambdaです。

SQSメッセージをトリガーにして、Lambdaを起動させるまでを簡潔に解説していきます。

0. GOAL

今回のGOALは、SQSのメッセージ送信をトリガーにして、Lambdaを起動させる。そして、起動したことをCloudWatchで確認。

1. Lambdaを作成

1-1. Lambda関数を新規作成

特別な設定は不要です。 今回、Python3.7 で作成していきます。

1-2. Roleを設定

Roleを設定していきます。 SQSをポーリングして、メッセージを受信できるRoleを設定します。

AWSLambdaSQSQueueExecutionRoleを追加します。

1-3. 関数のコードを設定

import json
def lambda_handler(event, context):
    for record in event['Records']:
       payload=record["body"]
       print(str(payload))

CloudWatchへ、SQSのメッセージを送信するだけなので、record["body"]  をprintする。だけの単純な処理です。

2. SQSメッセージ送信をトリガーに設定する

トリガーをLmabdaに設定します。

  • SQSを選択
  • キューを指定

キューを設定することで、キューにメッセージが受信することをトリガーにLambdaが起動されます。

CloudWatchにSQSメッセージがprintされています。確認してみて下さい。

Q. LambdaはSQSメッセージをどのように判定しているのか.

今回、SQSはメッセージを送信していません。その上で、LambdaではトリガーにSQSのキューを指定しただけです。

結論から言うと、LambdaはSQSのメッセージを定期的に確認しにいってます。これをポーリングと言います。

下記ブログで詳しく書いてありましたので、参照してみて下さい。

実は月額30円の定額課金?SQS⇒lambdaの罠

LaravelでAWS/SQSクライアントを作成し、メッセージを送信

AWSのキューイングサービスであるSQSを利用する方法を解説します。

0. AWSアカウントを作成し、SQSでキューを作成

AWSアカウントの作成方法は省略します。

SQSのキュー作成で、1点だけ注意点です。
キュータイプ標準 で作成して下さい。

1. LaravelにAWS-SDKをインストール

AWS-SDKとは、AWSとのAPI通信を簡素かしたパッケージです。LaravelでAWSを利用する際には、aws-sdk-php-laravel を利用する機会が多いかと思います。

すごい簡単にいうと、AWSとの面倒な認証やあれこれをやってくれる処理郡です。

1-1. composer.json へ aws-sdk-php-laravel を追記

composer.json

{
    "require": {
        //省略
        "aws/aws-sdk-php-laravel": "~3.0"
        //省略
    }
}

1-2. aws-sdk-php-laravel をインストール

composer update を実行する。

composer update

実行が完了すると
/vendor/aws 配下にAWS-SDKがインストールされています。

2. Laravel で SQS クライアントを作成し、メッセージを送信する。

Controllerで、SQSキューにメッセージを送信していきます。まずは、SQSのクライアントを作成します。

2-1. SqsClientを作成する

WebApiControllerのsendSqsメソッドの中で、処理を書いてきます。

<?php

namespace App\Http\Controllers;
use Aws\Sqs\SqsClient;

class WebApiController extends Controller
{
    public function sendSqs()
    {
        $config = [
            'credentials' => [
                'key' => env('AWS_SECRET_ACCESS_KEY'),
                'secret' => env('AWS_ACCESS_KEY_ID'),
            ],
            'region' => 'ap-northeast-1', // ご利用のリージョン
            'version' => 'latest',
        ];
        //SQS Clientを作成
        $sqs = SqsClient::factory($config);
    }
}

SqsClientaws-sdk-php-laravel をインストールした際に一緒に含まれています。

$sqs でSQSのClientを作成出来ました。次に $sqs を利用してメッセージを送信していきます。

2-2. SQSにメッセージを送信

上記で作成したクライアントを利用してメッセージを送信します。

<?php

namespace App\Http\Controllers;
use Aws\Sqs\SqsClient;

class WebApiController extends Controller
{
    public function sendSqs()
    {
        $config = [
            'credentials' => [
                'key' => env('AWS_SECRET_ACCESS_KEY'),
                'secret' => env('AWS_ACCESS_KEY_ID'),
            ],
            'region' => 'ap-northeast-1', // ご利用のリージョン
            'version' => 'latest',
        ];
        //SQS Clientを作成
        $sqs = SqsClient::factory($config);

        // SQSのメッセージ
        $value = "piyo";

        // 送りたいSQSのURLを指定
        $sqs_url = env('AWS_SQS_URL');

        $params = [
            'DelaySeconds' => 0,
            'MessageBody' => $value,
            'QueueUrl' => $sqs_url,
        ];

        $result = $sqs->sendMessage($params);
    }
}

上記で、SQSのキューにメッセージを送信出来ます。

Q. SQSのURLはどこにある?

$sqs_url = env('AWS_SQS_URL');

こちらに SQSのURLを設定する必要があります。

それは、キューの画面へいくと確認出来ます。

以上です。