[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の全操作権限を与えました。本番で実際に運用する際は、権限や対象リソース(キュー名など)をもっと絞った方がよいと思います。