EC2を使わないということ

先日、社内勉強会で発表してきました。

この仕組みを作るにあたり、まず僕は雑にiOSアプリを作りました。
具体的には、以下のスライドのように、iOSアプリにSlackのキーをハードコードして直接投稿するというものです。

f:id:yuukigoodman:20150211111235p:plain

これでも動くのですが、普通はキーをハードコードとかしません。
そこでAPIサーバを用意してiOSアプリからそこに通信して投げてもらうわけです。
しかし、今回は以下の構成を考えました。

f:id:yuukigoodman:20150211111649p:plain

ここで言いたいことは、EC2を使っていないということです。

  1. CognitoでAWSへのアクセストークンを取得
  2. iOAアプリからDynamoDBに直接UPDATEをかける
  3. 事前に設定しておいたDynamoDB Streamsにより、Lambda Functionが発火
  4. Lambda FunctionからSlackへの投稿が行われる

というように、EC2無しで最初に実現したかったAPIサーバのようなものを作れます。

ちなみに、このときのLambda Functionは以下のとおりです。

const SLACK_TOKEN = "hogehoge-fugafuga";

var req = require('request');

exports.handler = function(event, context) {
    var record = event.Records[0].Dynamodb.NewImage;
    var name = record.username.S;
    var state = record.state.S;
    var updated_at = record.updated_at.S;

    req.post('https://slack.com/api/chat.postMessage')
        .form({
            token: SLACK_TOKEN,
            channel: "#furobeacon",
            text: name+" is "+state+" at "+updated_at
        })
        .on('response', function (response) {
            response.on('data', function(data) {
                context.done(null, data);
            });
        })
        .on('error', function (err) {
            cotext.done(err, 'Failed post the chat');
        });
};

Lambdaについて雑感

「Lambdaはネットを拡張する!!(誇張)」的な主張をちょくちょく目にした気がするのですが、僕は以下のように考えています。

f:id:yuukigoodman:20150211112746p:plain

要はバッチなのですが、今回の場合はDynamoDBへの更新で動作するので、確かに新しい使い方といえるかもしれません。

Labmdaを使うメリットは、EC2の固定費用がかからないという点にあります。
EC2でも同じことができるし、今までのノウハウが流用できるので良いと思うかもしれませんが、そこを頑張ってLambdaにすることで、時間あたりの課金から開放されるって結構すごいんじゃね?と僕は思います。
あとEC2の管理の手間が全くかからないのが素晴らしい。

もちろんEC2を使うべきなユースケースのほうが多分多いし、Lambdaも実務で使えるレベルかはわかりません。最初Cognitoとか面倒だし。
ただ、「クラウド使ってるよ(ドヤア」な裏でEC2をオンプレの延長としてしか使っていないよりはよっぽどクラウドっぽいし未来を感じるな~と思います。

そもそもEC2=サーバってのがどうなん?って話

EC2: Elastic Compute Cloudと激安VPSどっちが良いのかというのは、よく話題に上がっていました。
確かにEC2を「いろいろ便利なオンプレサーバ」と見るなら、VPSとの比較が成り立つと思います。
(というかその場合は値段的にVPSのほうが良いことが多い。EC2は高いという感覚をもっとみんな持つべき。)

ただ、Elastic Compute Cloudなんですよ。EC2って。
なんかインスタンスサイズ変えないで起動しっぱなしのオンプレサーバとしてつかうのって、クラウドとしての利点を活かせてないなーと思います。

同僚の言葉を借りるなら、「EC2は単なる計算資源として活用するのが目指すべきところですねー」という感じで。

まとめ