この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AutoScaling時のAmazon SNS
この記事では、HTTPでAmazon SNSの通知を受け取っています。 サーバ1台でIPが変わらないのであればこの設定で問題はありません。 (そもそもpublic DNSは再起動で変わりますが)
しかし、AutoScalingを使用してSNSサーバをスケールしたい場合、このままだと問題が出てきます。 前回記述したサンプルソースでは、subscribeする際にendpointとなるURL(自分のIP + パス)を固定で指定していました。 しかし、AutoScalingするのであれば当然ipは固定されません。 subscribe時に自分のIPを取得し、それをendpointとして指定する必要があります。
ここで書いてあるように、EC2のインスタンスから特定のURLにアクセスすると、 自分のメタデータ情報を取得することができます。 今回はこれを利用して自分のIPを取得し、subscribeするようにしてみましょう。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- Node.js : v0.8.15
- npm : 1.1.66
前回使用したプログラムをベースに説明していきます。
サンプルプログラムを修正
前回使用したサンプルコードの、initSubscriber関数をちょっと修正します。 メタデータ取得用URLにリクエストを行い、取得したipをsubscribe用Endpointのipにしています。 ※IPが正常に取得できなかった場合はとりあえず考えないように
・
・
・
function initSubscriber(callback) {
http.get({
host:'169.254.169.254',
path:'/latest/meta-data/public-ipv4'
}, function (res) {
//メタデータから取得したipがセットされる
var ip = "";
res.on('data', function (data) {
ip += data;
});
res.on('end', function () {
var args = {
TopicArn:"arn:aws:sns:ap-northeast-1:aaaaaaaaaaaaaaa:test",
Protocol:'http',
Endpoint:"http://" + ip + ":3000/httpsns"
};
sns.client.subscribe(args, function (err, data) {
console.log("subscribe start.");
callback(null, 3);
});
});
});
}
・
・
・
EC2上で動かしてみると、前回と同じように動きます。 これでAutoScalingによってインスタンスが増えても、自分のIPをEndpointに指定してsubscribeできます。
まとめ
今回はAutoScaling + Amazon SNSについてのtipsを紹介しました。 メタデータを取得してプログラム内で動的にいろいろする手法はけっこう使うので、覚えておくといいかもしれません。
参考サイトなど
- Amazon SNS: http://aws.amazon.com/jp/sns/
- AWS SDK for Javaを使う#Amazon SNS: https://dev.classmethod.jp/cloud/aws-sns/