LoginSignup
17
17

More than 5 years have passed since last update.

AWSのLambdaを使ってお手軽な分散処理をする

Posted at

これはなにか

AWSのLambdaを使って分散処理をします。
今回はAWS SNSのsubscribe追加をS3へのアップロードをトリガーにしたいと思います。

仕組み

  1. s3に登録したいsubscribeの情報を上げる
  2. Lambdaでその情報を解析する
  3. 解析した情報を元に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にさっき作ったファイルを全部投げる

スクリーンショット 2015-07-06 16.34.05.png

結果

スクリーンショット 2015-07-06 16.32.44.png

注意すべき点

この辺りのLambdaの上限を気にすること
http://aws.amazon.com/jp/lambda/faqs/

Q. 一度に実行可能な AWS Lambda 関数の数に制限はありますか?
AWS Lambda では、特定のリージョンのアカウントごとの同時実行可能数が、デフォルトで 100 に制限されています。

あと今回はIAMの登録とか省略しているのでその辺りもちゃんと設定すること

最後に

ちゃんと運用するのであればエラーのハンドリングもするように

17
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17