[AWS]PerlでAmazonSQSのキューにメッセージを入れてみた。

EC2以外からも簡単に使える

実は今回EC2は使っていなくて、自分の手元のWindowsPCからキューを作ってメッセージを入れることができました。
AWSの各サービスは、S3もSQSもそうですが、EC2でないマシンからも同じように自由に使えるのが良いですね。

Amazon::SQS::SimpleはUSeastリージョン決め打ち?

最初、ブラウザでAWS Management ConsoleからSQSの画面を開いて、キューが現れるのを今か今かと待っていたのですが、いつまでたっても現れず。。。
う~んなぜだ。

ふと気づいたら自分はTokyoリージョンを見ていたのですが、上記サンプルコードではリージョンを指定していなかったのです。(というか、モジュールのドキュメントを見てもリージョンを指定する方法がありませんでした)

USeastリージョンの画面を開いて見たら、キューが作られていました!!
メッセージも入ってる!!



でもリージョン指定できないんでしょうか・・・?

キューからメッセージを取り出すサンプルコード

use strict;
use warnings;

use Amazon::SQS::Simple;

my $access_key = 'himitsu';
my $secret_key = 'himitsu';

my $sqs = new Amazon::SQS::Simple( $access_key, $secret_key );

# 受け取るときもこの処理が必要。
# "create"という言葉に違和感があるが・・
my $q = $sqs->CreateQueue('test_queue');

# キューからメッセージを取得
my $msg = $q->ReceiveMessage() or die "no messages left";

# メッセージの内容を表示
print $msg->MessageId() . "\n". $msg->MessageBody() . "\n";
 
# メッセージを削除
$q->DeleteMessage($msg->ReceiptHandle());

IAMユーザからキューを使うときは、ポリシーの設定が必要

IAMユーザのシークレットキーを使ってメッセージを登録しようとしたら、エラーが出ました。
ERROR: On calling CreateQueue: 403 Forbidden
(Access to the resource http://queue.amazonaws.com/ is denied.)
IAMポリシーを何も設定していなかったので当然ですね。
下記のようにポリシーを設定してみたら、IAMユーザからもメッセージを登録することができました。
{
  "Statement": [
    {
      "Action": [
        "sqs:*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
今回はテストなのでSQSの全操作権限を与えました。

本番で実際に運用する際は、権限や対象リソース(キュー名など)をもっと絞った方がよいと思います。
カテゴリ: