share facebook facebook2 twitter menu hatena pocket slack

2015.08.18 TUE

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

比企 宏之

WRITTEN BY比企 宏之

本当のタイトルは

「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に投稿する

比企 宏之

比企 宏之

The latest Tweets from Universal Ocellaris (@UniOce). そろそろ自身が得意とするエリア(IoT)に世の中が近づいてきて虎視眈々と決起のタイミングを狙っている開発では無敗の元モバイル端末開発&WEBアプリ開発者で、今はクラウド業界にダイブして、cloudpackのMSPのリーダーの一人