これはなにか
AWSのLambdaを使って分散処理をします。
今回はAWS SNSのsubscribe追加をS3へのアップロードをトリガーにしたいと思います。
仕組み
- s3に登録したいsubscribeの情報を上げる
- Lambdaでその情報を解析する
- 解析した情報を元にSNSに登録していく
この構成のメリット
よくあるパターンとしてAWS SNSの登録に時間がかかってしまいメルマガやPush通知を打つのに時間がかかるというケースがあります。
この構成の場合、複数のサーバからSNSの登録が行われるため高速になります。
登録したい内容
protocol: http
endpoint: http://example.com/[任意の文字]
s3にアップロードする内容
1
b1
bb1
bbb1
bbbb1
bbbbb1
bbbbbb1
bbbbbbb1
bbbbbbbb1
bbbbbbbbb1
bbbbbbbbbb1
bbbbbbbbbbb1
Lambdaの準備
sample.js
var AWS = require('aws-sdk');
var sns = new AWS.SNS({
apiVersion: '2010-03-31',
region: 'ap-northeast-1'
});
var s3 = new AWS.S3({
apiVersion: '2006-03-01',
region: 'ap-northeast-1'
});
exports.handler = function(event, context) {
var bucket = event.Records[0].s3.bucket.name;
var key = event.Records[0].s3.object.key;
var params = {
Bucket: bucket,
Key: key
};
s3.getObject(params, function(err, data) {
if (err) {
context.fail("Error getting file: " + err);
} else {
var objectBody = data.Body.toString();
var lines = objectBody.split(/\r\n|\r|\n/);
for (var i = 0; i < lines.length; i++) {
var params = {
Protocol: 'http',
TopicArn: 'arn:aws:sns:ap-northeast-1:*************:lambda_to_sns',
Endpoint: 'http://example.com/' + lines[i]
};
sns.subscribe(params, function(err, data) {
console.log(data);
});
}
}
});
// 終了条件若干適当なので、運用する場合はちゃんとするように
setTimeout(function(){
context.succeed();
}, 10000);
};
ファイル作成
1000ファイルぐらい作ってみる
for i in {1..1000} ; do echo "$i\nb$inb$i\nbb$i\nbbb$i\nbbbb$i\nbbbbb$i\nbbbbbb$i\nbbbbbbb$i\nbbbbbbbb$i\nbbbbbbbbb$i\nbbbbbbbbbb$i\nbbbbbbbbbbb$i" > ./hoge$i.txt ; done
S3にアップロード
bucketにさっき作ったファイルを全部投げる
結果
注意すべき点
この辺りのLambdaの上限を気にすること
http://aws.amazon.com/jp/lambda/faqs/
Q. 一度に実行可能な AWS Lambda 関数の数に制限はありますか?
AWS Lambda では、特定のリージョンのアカウントごとの同時実行可能数が、デフォルトで 100 に制限されています。
あと今回はIAMの登録とか省略しているのでその辺りもちゃんと設定すること
最後に
ちゃんと運用するのであればエラーのハンドリングもするように