AWS

AWS SDKによるSQSの操作

AWS

環境

  • AWS
  • Amazon Linux2

 

 

キュー?メッセージ?

  • キュー
    入口と出口のある箱
  • メッセージ
    箱に飛び込む人

 

SQS

  • 自動でスケーリングしてくれるサーバレスなMQ(メッセージキューイング)

 

 

関連

AWS SQS Queueの用途

 

 

環境設定

PHPのインストール

 

$ sudo amazon-linux-extras install php7.2

 

$ sudo yum list php* | grep amzn2extra-php7.2

php.x86_64                          7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-cli.x86_64                      7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-common.x86_64                   7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-fpm.x86_64                      7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-json.x86_64                     7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-mysqlnd.x86_64                  7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-pdo.x86_64                      7.2.16-1.amzn2.0.1        @amzn2extra-php7.2
php-bcmath.x86_64                   7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-dba.x86_64                      7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-dbg.x86_64                      7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-devel.x86_64                    7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-embedded.x86_64                 7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-enchant.x86_64                  7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-gd.x86_64                       7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-gmp.x86_64                      7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-intl.x86_64                     7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-ldap.x86_64                     7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-mbstring.x86_64                 7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-odbc.x86_64                     7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-opcache.x86_64                  7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-pecl-apcu.x86_64                5.1.12-3.amzn2.0.1        amzn2extra-php7.2
php-pecl-apcu-devel.noarch          5.1.12-3.amzn2.0.1        amzn2extra-php7.2
php-pecl-igbinary.x86_64            2.0.7-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-igbinary-devel.noarch      2.0.7-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-imagick.x86_64             3.4.3-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-imagick-devel.noarch       3.4.3-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-mcrypt.x86_64              1.0.1-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-memcached.x86_64           3.0.4-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-msgpack.x86_64             2.0.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-msgpack-devel.noarch       2.0.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-oauth.x86_64               2.0.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-redis.x86_64               4.3.0-1.amzn2             amzn2extra-php7.2
php-pecl-ssh2.x86_64                1.1.2-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-uuid.x86_64                1.0.4-3.amzn2.0.1         amzn2extra-php7.2
php-pecl-zip.x86_64                 1.15.2-3.amzn2.0.1        amzn2extra-php7.2
php-pgsql.x86_64                    7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-process.x86_64                  7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-pspell.x86_64                   7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-recode.x86_64                   7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-snmp.x86_64                     7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-soap.x86_64                     7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-xml.x86_64                      7.2.16-1.amzn2.0.1        amzn2extra-php7.2
php-xmlrpc.x86_64                   7.2.16-1.amzn2.0.1        amzn2extra-php7.2

 

Composerのインストール

 

$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

※再ログインを行う

そうしないとcomposerコマンドが利用できない

 

AWS SDKのインストール

$ mkdir $HOME/sqsApp
$ cd $HOME/sqsApp
$ composer require aws/aws-sdk-php

 

バージョン確認

$ aws --version
aws-cli/1.16.102 Python/2.7.14 Linux/4.14.114-105.126.amzn2.x86_64 botocore/1.12.92

 

クレデンシャルの設定

$ mkdir $HOME/.aws/credentials

$ vi $HOME/.aws/credentials


[default]
aws_access_key_id = <アクセスキー ID>
aws_secret_access_key = <シークレットアクセスキー>

AWS IAMで作成したユーザ情報を入力しよう。

 

環境変数 リージョンの設定

$ vi $HOME/.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH


※下記を追記
export AWS_DEFAULT_REGION='ap-northeast-1'

※再ログインしてください。

 

設定の確認

$ aws configure list

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************I5XU shared-credentials-file
secret_key     ****************ymHz shared-credentials-file
    region           ap-northeast-1              env    AWS_DEFAULT_REGION

環境は出来ました。

 

 

SDKによるキューの操作

 

キューの作成

$ aws sqs create-queue --queue-name testQueue

{
    "QueueUrl": "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"
}

 

 

キューの表示

$ aws sqs list-queues
{
    "QueueUrls": [
        "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"
    ]
}

 

キューのリスト表示

$ aws sqs list-queues
{
    "QueueUrls": [
        "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"
    ]
}

 

キューの送信 1

$ aws sqs send-message --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"  --message-body "TEST Queue" --delay-seconds 60
{
    "MD5OfMessageBody": "422038d0d323112b600874ed2e9db010",
    "MessageId": "634cb912-a873-4bc1-84c7-cede538d5240"
}

 

キューの送信2

$ aws sqs send-message --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"  --message-body "TEST Queue 2" --delay-seconds 60
{
    "MD5OfMessageBody": "45c3322526e349ad9257dac1674047b3",
    "MessageId": "93392523-dc44-40b0-8df7-b383f3039ac8"
}

 

キューの受信1

$ aws sqs receive-message --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue" --visibility-timeout 60 -
-wait-time-seconds 20
{
    "Messages": [
        {
            "Body": "TEST Queue",
            "ReceiptHandle": "AQEBUmnNayh1IiR6AqyIhDaA0CjXgLs39kESxrafdd90QohJKy3JT2pDor30p61qs1vr1qX+bV5rt5Ym0mAvsW+y6ENiPbOQJTd03HyI4bb0T1WUYvdOgFBTtHbaLRefkcLyKZ0zqXz98cLHV9P0usLEKZQNkjT2RAF1NFfbTyvJPSi2zyVXn+9IcIDgp0gRx55D6/33Tjts4gNhwQicnuSJTJBwd9UMXv6B7uxk14zDhFWKGIwNLoYli8W+2z4/JOnh64iSGQmC9RCcp+bO+wTwIQX7f0BUm77qfV8KNv7I7jJ2J0pr/0tMu/nmuw8l5ehlVnatYjkfxQGAGxaWc2Z+KreYz80VvA4M8RHMplY9FwiMqjOOutH6wtmgC9Rc7bzLj3ni28kcT5wgWi5ZrOBtFw==",
            "MD5OfBody": "422038d0d323112b600874ed2e9db010",
            "MessageId": "634cb912-a873-4bc1-84c7-cede538d5240"
        }
    ]
}

 

キューの受信2

$ aws sqs receive-message --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue" --visibility-timeout 60 --wait-time-seconds 20
{
    "Messages": [
        {
            "Body": "TEST Queue 2",
            "ReceiptHandle": "AQEButxx8AqiIKx89BEE+HyV5gOY95IgllvONuBPttkHdqCTajVYSAkEiBTdaLaXwKhww0MWTpNqBis56bKcuQyAlLJWeFoEKtP2RzXFinsHwiH3qW6PmjTiGHFJiuhbhcPcolczM5XAxsjpUh2R03TnE8+FtmPH409a8imzCh2AVGgC41OQJC9pCIp84kJ7dX02HLxfnsQ6tayh3ckPG0khJfHatltPpFgN2uLz1Xajao/I3mXARM4w+fam97LyONIxlK6SUw5jJkkDoa/p9EqELXr9SYcNSrqVDtrM+LMtCmkkFpTTNmQBm6HOCjFe2qamF0qvPb216BPM7A0waIMz9REJBmvrL8gbmVv8stnY6L2HWMoVte7KAkvpxNABm0D2oknRElfRF2kt9gSkS2CISg==",
            "MD5OfBody": "45c3322526e349ad9257dac1674047b3",
            "MessageId": "93392523-dc44-40b0-8df7-b383f3039ac8"
        }
    ]
}

 

メッセージの削除1

$ aws sqs delete-message --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue" --receipt-handle "AQEBUmnNayh1IiR6AqyIhDaA0CjXgLs39kESxrafdd90QohJKy3JT2pDor30p61qs1vr1qX+bV5rt5Ym0mAvsW+y6ENiPbOQJTd03HyI4bb0T1WUYvdOgFBTtHbaLRefkcLyKZ0zqXz98cLHV9P0usLEKZQNkjT2RAF1NFfbTyvJPSi2zyVXn+9IcIDgp0gRx55D6/33Tjts4gNhwQicnuSJTJBwd9UMXv6B7uxk14zDhFWKGIwNLoYli8W+2z4/JOnh64iSGQmC9RCcp+bO+wTwIQX7f0BUm77qfV8KNv7I7jJ2J0pr/0tMu/nmuw8l5ehlVnatYjkfxQGAGxaWc2Z+KreYz80VvA4M8RHMplY9FwiMqjOOutH6wtmgC9Rc7bzLj3ni28kcT5wgWi5ZrOBtFw=="

 

メッセージの削除2

$ aws sqs delete-message --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue" --receipt-handle "AQEButxx8AqiIKx89BEE+HyV5gOY95IgllvONuBPttkHdqCTajVYSAkEiBTdaLaXwKhww0MWTpNqBis56bKcuQyAlLJWeFoEKtP2RzXFinsHwiH3qW6PmjTiGHFJiuhbhcPcolczM5XAxsjpUh2R03TnE8+FtmPH409a8imzCh2AVGgC41OQJC9pCIp84kJ7dX02HLxfnsQ6tayh3ckPG0khJfHatltPpFgN2uLz1Xajao/I3mXARM4w+fam97LyONIxlK6SUw5jJkkDoa/p9EqELXr9SYcNSrqVDtrM+LMtCmkkFpTTNmQBm6HOCjFe2qamF0qvPb216BPM7A0waIMz9REJBmvrL8gbmVv8stnY6L2HWMoVte7KAkvpxNABm0D2oknRElfRF2kt9gSkS2CISg=="

 

キューの確認

$ aws sqs list-queues
{
    "QueueUrls": [
        "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"
    ]
}

 

キューの削除

$ aws sqs delete-queue --queue-url "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"

※削除すると60秒は同じ名前のキューは作れません。

 

キューの確認

$ aws sqs list-queues

※何も表示されなければOK

 

 

PHP によるSQSの操作

 

メッセージの送信

<?php

require 'vendor/autoload.php';
use Aws\Sqs\SqsClient;
use Aws\Exception\AwsException;

define('QUEUE_URL', 'https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue');

try{
    $client = new SqsClient([
        'profile' => 'default',
        'region' => 'ap-northeast-1',
        'version' => '2012-11-05',
    ]);

    $params = [
        'DelaySeconds' => 0,
        'MessageAttributes' => [
            'Title' => [
                'DataType' => 'String',
                'StringValue' => 'SQS 送信します(件名)',
            ]
        ],
        'MessageBody' => '申します、申します。',
        'QueueUrl' => QUEUE_URL,
    ];

    $result = $client->sendMessage($params);
    var_dump($result);
} catch(AwsException $e){
    error_log($e->getMessage());
}

 

実行

$ php sendSqs.php

object(Aws\Result)#119 (2) {
  ["data":"Aws\Result":private]=>
  array(4) {
    ["MD5OfMessageBody"]=>
    string(32) "7fee6a06ab0be5d9c92ee1e0978f9a11"
    ["MD5OfMessageAttributes"]=>
    string(32) "dd86344a085ab9f5a44759b48e29f90a"
    ["MessageId"]=>
    string(36) "e8101b02-2f0b-42a4-8ac8-cddb3549666d"
    ["@metadata"]=>
    array(4) {
      ["statusCode"]=>
      int(200)
      ["effectiveUri"]=>
      string(65) "https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue"
      ["headers"]=>
      array(4) {
        ["x-amzn-requestid"]=>
        string(36) "e1c469f5-f127-5865-8e07-3c9c61f4a97b"
        ["date"]=>
        string(29) "Thu, 30 May 2019 08:04:35 GMT"
        ["content-type"]=>
        string(8) "text/xml"
        ["content-length"]=>
        string(3) "459"
      }
      ["transferStats"]=>
      array(1) {
        ["http"]=>
        array(1) {
          [0]=>
          array(0) {
          }
        }
      }
    }
  }
  ["monitoringEvents":"Aws\Result":private]=>
  array(0) {
  }
}

 

 

 

メッセージの受信

$ cat recieveSqs.php
<?php

require 'vendor/autoload.php';
use Aws\Sqs\SqsClient;
use Aws\Exception\AwsException;

define('QUEUE_URL', 'https://ap-northeast-1.queue.amazonaws.com/<AWSアカウントID>/testQueue');
try{
    $client = new SqsClient([
        'profile' => 'default',
        'region' => 'ap-northeast-1',
        'version' => 'latest',
    ]);
    $receive = [
        'AttributeNames' => ['All'],
        'MessageAttributeNames' => ['All'],
        'MaxNumberOfMessages' => 10,
        'QueueUrl' => QUEUE_URL,
        'WaitTimeSeconds' => 20,
        'VisibilityTimeout' => 60,
    ];

    // キューを監視しあれば受信しキューを削除する。
    while(true){
        $result = $client->receiveMessage($receive);
        $data = $result->get('Messages');
        if($data){
            foreach($data as $item){
                echo $item['Body'];
                // キューの削除
                $client->deleteMessage([
                    'QueueUrl' => QUEUE_URL,
                    'ReceiptHandle' => $item['ReceiptHandle'],
                    'VisibilityTimeout' => 1000,
                ]);
            }
        }
    }
} catch(AwsException $e){
    error_log($e->getMessage());
}

実際の利用だとデーモン化するか、Lambdaでバッチ対応

 

実行

$ php recieveSqs.php

申します、申します。

 

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)