本当のタイトルは

「PagerDutyのWeb HookからAmazon API Gateway経由でLambdaをコールしてSlackに投稿する」
だったんですが、
なぜかPagerDutyのWeb Hookからcallしてくれないので
とりあえず現状動いているものをBlogに書きます。

LambdaがAmazon API Gatewayという新しい相棒を携えて、

ついにWEB APIとして使えるようになりました。
http://aws.typepad.com/aws_japan/2015/07/amazon-api-gateway-build-and-run-scalable-application-backends.html

Amazon API GatewayはLambdaのおまけ?かというと全然そうではなく、Amazon API Gateway自体が非常に可能性のあるものとなっていますが
今回はMSPのIT見える化に使う為に、Amazon API Gatewayの詳細はおいておきます。

まず下準備としてLamdaで実行するnode.jsのプロジェクトを用意します(macでやっています。node.jsのインストールは別でお願いします(簡単です))。

macのコンソールで下記を実施

$ mkdir lambdatest
$ cd lambdatest
$ npm install request
$ vi index.js

index.jsのコードは下記

exports.handler = function(event, context) {
    var options = {
        url: 'https://hooks.slack.com/services/ここはslackのAPIから払い出されたURLを参照',
        headers: {"Accept":"application/json", "Content-Type":"application/json","Authorization":"Basic _authcode_"},
body: JSON.stringify({"channel": "#投稿するチャンネル名", "username": "botの名前です", "text": "tessです", "icon_emoji": "好きな絵文字を"} )
    };
    request.post(options, function(error, response, body){
        if (!error && response.statusCode == 200) {
            console.log(body);
        } else {
            console.log('error: '+ response.statusCode);
        }
    });
};

で上記を保存し、

$ zip -r myfunc.zip index.js node_modules

で、UP用のプロジェクトをzipで固めます。

次はAWS側ですがとりあえず動かす事をメインにしますので、詳細なパラメータは放置しますw

Amazon API GatewayからでもLambdaのどちらからでも作成できますが、今回はAmazon API Gatewayから作成します。

対応しているリージョンを選択しAmazon API Gatewayを選びます

20150711181202

Get Startedを選択し

20150711181203

API nameをつけて

20150711181205

Create Methodを選択し

20150711181206

今回はpostを選択(他のメソッドも選べます)

20150711181208

Lumbda Functionを選択し

20150711181209

microservice-http-endpointを選択し

20150711181212

Function Nameを入力し
Upload a .ZIP fileで先ほどUPしたファイルをアップします
でLambdaのIAM Roleを選択し

20150711181213

今回はLambdaはAWSの機能を使わないので上記のような感じでロールを作成し

前の画面のnextを選択し

20150711181214

さらにnextを選択

20150711181215

Create Functionを選択し、作成。

20150711184044

作成後に上記の画面が出てくるのでTESTを選択すると下記のような投稿がslackに投稿されれば、Lambda側はとりあえずOKです(ちなみにこのFunctionは実行時にエラー出ますが、とりあえずslackへの投稿が出来ているのでこのままで行きます(また直します))。

20150711181220

ここからは外部公開する為の操作となります。Deploy APIを選択し

Deployします。

上記までで公開できましたので、curlなどで一度確認してみてください。

でGoogle Apps Scriptから

function sendToLambda() {
    var r;
    try {
        var url = "https://Invoke URL:で表示されていたURLをここに";
         var data = {"operation": "echo","somekey1": "somevalue1","somekey2": "somevalue2"};//ここは不要ですが元々のdynamoのサンプルを動かしたいとき用に記載しておきます
        var payload = JSON.stringify(data);
        var headers = {"Accept":"application/json",
                "Content-Type":"application/json"
        };
        var options = { "method" : "POST",
        "contentType" : "application/json",
        "headers" : headers,
        "payload" : payload
    };
    var response = UrlFetchApp.fetch(url, options);
    } catch(e){
        var error = e;
        r = null
        return false;
    }
        return true;
}

で呼び出すと間違っていなければ

が無事表示されます。

ここまででAPIを公開する事ができるようになりました。

LambdaとAmazon API Gatewayにより、インスタンス数などを気にせずに
スケーラブルなAPIを外部に公開する事が可能になります。

今回は紹介できてませんが、Amazon API Gatewayでは
APISDK(iOSやAndroid)を作成する機能や
他のAPIサーバーのラッパー(要求や結果を変換する機能?)になる事も出来るようで、
モバイルからの利用や過去のAPIサーバーの再活用など色々と可能性がありそうです。

GAEやAzureが先行して従量課金型のPaaSを出していましたが
早すぎた投入によりインパクトはあまり出なかったですが、
AWSがcloudの普及状況を見ての今回の投入、
利用者のマインドの変化により、これから色々と大きな変化がありそうですね。

元記事はこちら

【cloudpack 大阪 BLOG】Google Apps ScriptからAmazon API Gateway経由でLambdaをコールしてSlackに投稿する