【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を選びます
Get Startedを選択し
API nameをつけて
Create Methodを選択し
今回はpostを選択(他のメソッドも選べれます)
Lumbda Functionを選択し
microservice-http-endpointを選択し
Function Nameを入力し
Upload a .ZIP fileで先ほどUPしたファイルをアップします
でLambdaのIAM Roleを選択し
今回はLambdaはAWSの機能を使わないので上記のような感じでロールを作成し
前の画面のnextを選択し
さらにnextを選択
Create Functionを選択し、作成。
作成後に上記の画面が出てくるのでTESTを選択すると下記のような投稿がslackに投稿されれば、Lambda側はとりあえずOKです(ちなみにこのFunctionは実行時にエラー出ますが、とりあえずslackへの投稿が出来ているのでこのままで行きます(また直します))。
ここからは外部公開する為の操作となります。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では
他のAPIサーバーのラッパー(要求や結果を変換する機能?)になる事も出来るようで、
モバイルからの利用や過去のAPIサーバーの再活用など色々と可能性がありそうです。
GAEやAzureが先行して従量課金型のPaaSを出していましたが
早すぎた投入によりインパクトはあまり出なかったですが、
AWSがcloudの普及状況を見ての今回の投入、
利用者のマインドの変化により、これから色々と大きな変化がありそうですね。