どーも!
たかぽんです!
今回はSQSヘアプリ側から自由なメッセージをエンキューする方法を調べてみました!
ざっくりではありますが、解説していこうと思います!
PHP SDK を使ってメッセージをエンキューする
さて、それではやっていきますが...!
今回PHP SDKの中でもlaravel向けの、aws-sdk-php-laravelを使用していきます。
laravelのプロジェクトに導入できていない方は以下を参考に導入してください。
準備ができたら早速みていきましょう!
説明も大変なので、まずはざっとコードを用意しました!
後から解説しますが、ざっくりみてみてください!
public function sendSQSMessage()
{
// laravelで設定している認証情報でクライアントを作成
$sqs = app()->make('aws')->createClient('sqs');
// SQSのメッセージに渡したい文字列を用意する
$value = "hoge/huga/hugo";
// 送りたいSQSのURLを指定(laravelのconfigにて.envを参照しています)
$queueUrl = config('aws.sqs.url');
// SDKのAPIで渡すためのパラメータを用意
$params = [
'DelaySeconds' => 0,
'MessageBody' => $value,
'QueueUrl' => $queueUrl,
];
$sqs->sendMessage($params);
}
上記を実行すると、SQSへ"hoge/huga/hugo"のメッセージの送信ができます!
あとはそのSQSを受け取る側でメッセージを取得すればそのメッセージにごとにいろんな処理をしたり〜できるわけですね!
ちなみに今回僕の場合は重たい処理を非同期的に実行するために一旦SQSのメッセージにID等の情報を付与してエンキューし、別途JobWorker(裏で常にSQSを監視してメッセージが届いたら処理をしてくれる)を用意して重たい処理を行っています。
では、上記コードを少し詳しくみていきます。
まずはこちら。
$sqs = app()->make('aws')->createClient('sqs');
ここでは、SDKでsqsの操作を実行するためのクライアントを作成します。
本来、このクライアントを作成する場合には認証のためのcredentials情報(AWSキー, シークレットキー等...)が必要です。
ただ、上記コードではそんなもの指定していませんね...?
これは、laravelのsdkを使用している場合ですが、以下のようにクライアント作成に使用する認証情報を環境変数に登録しておくことで省略することができます。
さて、クライアントを作成したので、次はすでに作成済みのSQSのURLを用意します。
これは、メッセージを送る際、どのSQSに送るのかを指定するために使用します。
$queueUrl = config('aws.sqs.url');
コードは上記の部分です。
ここではconfigを使用してenvファイルに記載しているsqsのURLを取得しています。
configに関しては以下の記事で詳細をご説明しているので、よかったらご一読ください。
さて、そこまで準備ができたら、あとはSDKのAPIに対してリクエスト時に送信する内容を指定していきます。
メッセージの送信には以下のAPIを使用します。
以下の画面にある"Parameter Syntax"が実際のレスポンスに入れられるパラメータ例になっています。
REQUIREDと書かれているものが必須項目(つけないと正しく動作しない)のパラメータです。
// SDKのAPIで渡すためのパラメータを用意
$params = [
'DelaySeconds' => 0,
'MessageBody' => $value,
'QueueUrl' => $queueUrl,
];
実際に僕が書いたコードが上記になります。
本当に最低限のものしか入れていませんが、これでメッセージの送信ができるはずです。
ちなみに、APIの説明でREQUIREDにattributeのDataTypeがあるけど、つけなくていいの?と思う方もいるかもしれません。
ただ、こちらのattribute系はオプション的な立ち位置で、もしもそのattributeをメタデータとしてつけるんだったら...そのattributeのDataTypeも絶対つけてね!って感じだと思います。
attributeに関する詳細は以下をご覧ください。
そして最後です。
最後は実際に送信をします。
$sqs->sendMessage($params);
説明も不要かもしれませんね。
先ほどのパラメータを渡してクライアントからsendMessageをするだけでOKです。
これでSQSのコンソールからポーリングしてみるとメッセージが追加されているのが確認できると思います。
まとめ
さて、今回はSQSのメッセージを送信する部分を実装してみました。
今まで受け取る部分は書いていたんですが、送信するのは初めてだったので、また知識が増えました...!
laravelからのSDKの使い方もだいぶんなれてきたので、そのうち自分の個人でも何かやってみたいなぁ...と。
それでわ!