Amazon Simple Queue Service

このガイドは、 Amazon Simple Queue Service のためのニフティクラウド SDK for PHP クライアントにフォーカスしています。 このガイドでは、 ニフティクラウド SDK for PHPをダウンロードしインストールが既に終わっていると想定しています。 はじめる場合のより詳細な情報は インストール を参照して下さい。

利用可能な操作

利用可能なすべてのメソッドおよび入出力の記述についてのより詳細な情報を得るためには ニフティクラウド API リファレンス または Amazon Simple Queue Service クライアント API リファレンス を参照して下さい。

AddPermission ChangeMessageVisibility
ChangeMessageVisibilityBatch CreateQueue
DeleteMessage DeleteMessageBatch
DeleteQueue GetQueueAttributes
GetQueueUrl ListQueues
NiftyGetMetricStatistics NiftyReceiveAndDeleteMessage
ReceiveMessage RemovePermission
SendMessage SendMessageBatch
SetQueueAttributes  

クライアントの作成

まず以下のような方法のいずれかで、クライアントオブジェクトを作成しなければなりません。

Factory method

Aws\Sqs\SqsClient::factory() メソッドを利用することで、最も簡単に立ち上げ速やかに動かすことができます。その際にクレデンシャル (key and secret) を提供して下さい。

region パラメータも必須で、以下の値のいずれかをセットしなければなりません。: us-east-1, ap-northeast-1, sa-east-1, ap-southeast-1, ap-southeast-2, us-west-2, us-gov-west-1, us-west-1, eu-west-1

use Aws\Sqs\SqsClient;

$client = SqsClient::factory(array(
    'key'    => '<aws access key>',
    'secret' => '<aws secret key>',
    'region' => '<region name>'
));

先の例のようにしてアクセスキーをセットすることができます。また、もし、 AWS Identity and Access Management (IAM) roles for EC2 instances を利用しているか、環境変数 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY からクレデンシャル情報を利用できるのであれば、これらの設定を省略することも可能です。

サービスロケータ

より確実に Amazon Simple Queue Service に接続する方法はサービスロケータを通す方法です。 設定ファイルの中でクレデンシャルと設定値を指定することができます。 これらの設定はすべてのクライアントで共有されるので一度だけ設定を行えばよくなります。

use Aws\Common\Aws;

// Create a service builder using a configuration file
$aws = Aws::factory('/path/to/my_config.json');

// Get the client from the builder by namespace
$client = $aws->get('Sqs');

キューの生成

次にキューを生成しましょう。標準的なキューは名前を指定するだけで生成できます。 そのURLを結果から取得しておいてください。メッセージを送受信する際、キューを指定する一意的な識別子として機能します。

$result = $client->createQueue(array('QueueName' => 'my-queue'));
$queueUrl = $result->get('QueueUrl');

キューの生成時に、必要な属性を設定することも可能です。

use Aws\Common\Enum\Size;
use Aws\Sqs\Enum\QueueAttribute;

$result = $client->createQueue(array(
    'QueueName'  => 'my-queue',
    'Attributes' => array(
        QueueAttribute::DELAY_SECONDS        => 5,
        QueueAttribute::MAXIMUM_MESSAGE_SIZE => 4 * Size::KB,
    ),
));
$queueUrl = $result->get('QueueUrl');

あるいは生成後に設定しても構いません。

use Aws\Common\Enum\Time;
use Aws\Sqs\Enum\QueueAttribute;

$result = $client->setQueueAttributes(array(
    'QueueUrl'   => $queueUrl,
    'Attributes' => array(
        QueueAttribute::VISIBILITY_TIMEOUT => 2 * Time::MINUTES,
    ),
));

メッセージの送信

メッセージをキューに送信する処理は SendMessage コマンドで行います。

$client->sendMessage(array(
    'QueueUrl'    => $queueUrl,
    'MessageBody' => 'An awesome message!',
));

メッセージを送信する際、遅延を表すデフォルト値を上書きすることも可能です。

$client->sendMessage(array(
    'QueueUrl'     => $queueUrl,
    'MessageBody'  => 'An awesome message!',
    'DelaySeconds' => 30,
));

メッセージの受信

メッセージの受信は ReceiveMessage コマンドで行います。

$result = $client->receiveMessage(array(
    'QueueUrl' => $queueUrl,
));

foreach ($result->getPath('Messages/*/Body') as $messageBody) {
    // Do something with the message
    echo $messageBody;
}

デフォルトでは、返されるメッセージは1件のみです。それ以上取得したい場合は、 MaxNumberOfMessages パラメータで数を指定してください (1~10の範囲)。 もっとも、必ずその数のメッセージを受信できるわけではなく、要求時点でキューに入っていたうち、指定した件数まで受け取ることになります。

SQSには "ロングポーリング" の機能もあります。 キューにメッセージが届くまで、最大20秒間、SDKとの接続を開いたままにするよう指示するというものです。 この動作の設定には WaitTimeSeconds パラメータを使います。

$result = $client->receiveMessage(array(
    'QueueUrl'        => $queueUrl,
    'WaitTimeSeconds' => 10,
));

Note

ロングポーリングの設定は、キューごとに ReceiveMessageWaitTimeSeconds 属性を指定する、という方法でも可能です。

メッセージの受信と削除

ニフティクラウドの独自仕様です。 AWSではメッセージの受信を行った後に削除を行う必要があります。 しかし、 NiftyReceiveAndDeleteMessage を利用すると、指定されたキューからメッセージを受信すると同時に、メッセージを削除することができます。

$result = $client->niftyreceiveAndDeleteMessage(array(
    'QueueUrl'        => $queueUrl,
    'WaitTimeSeconds' => 10,
));

Note

このAPIは個々のActionを別個に行う必要が無いため便利では有りますが、Actionのリクエストから、受診するまでの間に通信路障害・マシントラブルによってレスポンスを受けそびれたり、レスポンスをもとにした処理が途中で終了してしまった場合には、メッセージが削除されてしまっているというリスクがあることをご了承の上、ご利用下さい。