雑なA型によるクラウドとモバイルと運営と

大阪でJAWS-UG OSAKAとInnovation EGGを運営している人のBLOGです。時々更新します〜

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

本当のタイトルは

「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を選びます

f:id:unioce:20150711181202p:plain

Get Startedを選択し

f:id:unioce:20150711181203p:plain

API nameをつけて

f:id:unioce:20150711181205p:plain

Create Methodを選択し

f:id:unioce:20150711181206p:plain

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

 

f:id:unioce:20150711181208p:plain

Lumbda Functionを選択し

f:id:unioce:20150711181209p:plain

microservice-http-endpointを選択し

f:id:unioce:20150711181212p:plain

Function Nameを入力し

Upload a .ZIP fileで先ほどUPしたファイルをアップします

でLambdaのIAM Roleを選択し

 

f:id:unioce:20150711181213p:plain

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

前の画面のnextを選択し

f:id:unioce:20150711181214p:plain

さらにnextを選択

f:id:unioce:20150711181215p:plain

Create Functionを選択し、作成。

 

f:id:unioce:20150711184044p:plain

 

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

f:id:unioce:20150711181220p:plain

 

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

f:id:unioce:20150711181221p:plain

f:id:unioce:20150711181223p:plain

Deployします。

f:id:unioce:20150711184129p:plain

 

上記までで公開できましたので、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;

}

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

 

f:id:unioce:20150711181220p:plain

 が無事表示されます。

 

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

 

LambdaとAmazon API Gatewayにより、インスタンス数などを気にせずに

スケーラブルなAPIを外部に公開する事が可能になります。

 

今回は紹介できてませんが、Amazon API Gatewayでは

APISDK(iOSAndroid)を作成する機能や

他のAPIサーバーのラッパー(要求や結果を変換する機能?)になる事も出来るようで、

モバイルからの利用や過去のAPIサーバーの再活用など色々と可能性がありそうです。

 

GAEやAzureが先行して従量課金型のPaaSを出していましたが

早すぎた投入によりインパクトはあまり出なかったですが、

AWSがcloudの普及状況を見ての今回の投入、

利用者のマインドの変化により、これから色々と大きな変化がありそうですね。