Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
JAWSで作る
サーバレスAPIアプリケーション
AWS モバイル/IoTサービス徹底攻略!!
- Developers.IO Meetup番外編 -
1
2015-11-21
クラスメソッド株式会社 五十嵐良輔
自己紹介
• 五十嵐 良輔
• クラスメソッド株式会社
• モバイルアプリサービス部
• 現在の仕事はRailsとAWSが中心
• ブログではRailsとJAWSネタを書いています

http://dev.classmethod.jp/auth...
アジェンダ
• JAWSの紹介 *
• AWSMの紹介 *
• サンプルプロジェクトの解説
• まとめ



* 10/30に弊社で行われた「モバイルバックエンド勉強会 In 秋葉原 」で発
表したものとほぼ同じ内容です。

http://de...
JAWSの紹介
Just AWS Without Servers
4
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
5
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
6
Lambdaにnpmを使い
たいんだけど・・・
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
7
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
8
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
LambdaのCFn書...
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
9
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
LambdaのCFn書...
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
10
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
LambdaのCFn...
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
11
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
LambdaのCFn...
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
12
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
LambdaのCFn...
現状の問題
• LambdaやAPI Gatewayを使って開発をしよう
とすると・・・
13
Lambdaにnpmを使い
たいんだけど・・・ Lambdaのデプロイは関
連するファイルをzipして
s3にアップして・・・
LambdaのCFn...
14
https://github.com/jaws-framework/JAWS
15
https://github.com/jaws-framework/JAWS
JAWSが解決します!!
JAWSとは
• AWS LambdaとAPI GatewayをベースにAWS上で
サーバレスなアプリケーションを作るフレームワー
ク
• 実態はCLIツール(今のところ)
• Lambdaの雛形を作ったり、必要なリソースの
CloudForm...
アーキテクチャ(最小構成)
17
API Gateway Lambda
http://dev.classmethod.jp/cloud/aws/getting-started-with-api-gateway-lambda-integratio...
プロジェクト構成
• aws_modules

機能の単位であり、複数のLambdaとリソー
スを構成するためのCFnの定義からなる
• cloudformation

プロジェクトに必要なリソース全てを構成
するためのCFnの定義
• その他...
プロジェクト構成
• aws_modules

機能の単位であり、複数のLambdaとリソー
スを構成するためのCFnの定義からなる
• cloudformation

プロジェクトに必要なリソース全てを構成
するためのCFnの定義
• その他...
プロジェクト構成
• aws_modules

機能の単位であり、複数のLambdaとリソー
スを構成するためのCFnの定義からなる
• cloudformation

プロジェクトに必要なリソース全てを構成
するためのCFnの定義
• その他...
デプロイ構成
• 複数ステージ
• 複数リージョン
• 3つのCloudFormationスタック
• Resources
• Lambdas
• API Gateway
21
デプロイ構成
• 複数ステージ
• 複数リージョン
• 3つのCloudFormationスタック
• Resources
• Lambdas
• API Gateway
22
デプロイ構成
• 複数ステージ
• 複数リージョン
• 3つのCloudFormationスタック
• Resources
• Lambdas
• API Gateway
23
AWSMの紹介
AWS Module
24
AWS Module(AWSM)とは
• JAWSプロジェクトにおける機能の単位
• リソースもまとめて管理
• LambdaとAPI Gateway
• S3やDynamoDBなどその他のAWSサービス
• npmと同じ構成
• 再利用可能
...
AWSM一覧
• awsm-images

画像を編集(リサイズなど)するREST APIを生成する
• awsm-users

DynamoDBを使ってユーザを作成・認証する
• awsm-cloudfront

S3の前にCloudFron...
AWSM一覧
• awsm-middleware
• awsm-loggly
• awsm-twilio
• awsm-stripe-webhook
• awsm-slack-webhook
• awsm-mailer
• awsm-s3tok...
サンプルプログラムの解説
28
作ったもの
• GithubへのコメントをSlackに通知する
Webhook API
• やりたかったこと
• PRへのCommentだけをSlackに通知
• Githubのユーザ名をSlackのユーザ名に変換
29
作ったもの
• GithubへのコメントをSlackに通知する
Webhook API
• やりたかったこと
• PRへのCommentだけをSlackに通知
• GithubのAPIはIssueとPRの区別がない
• Githubのユーザ名を...
作ったもの
• イメージ図
31
Webhook
作ったもの
• イメージ図
32
Webhook
API Gateway
HTTPリクエスト
JSON JSON
Lambda
JSONをごにょごにょ
プロジェクトの作成
33
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトの作成
$	 jaws	 project	 create

	 	 	 	 	 	 	 ____	 	 	 _____	 	 __	 	 	 	 	 	 __	 	 _________

	 	 	 	 	 	 |	 	 	 	 |...
プロジェクトとAWSMの雛形を作成
42
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
プロジェクトの雛形
.
├── README.md
├── admin.env
├── aws_modules
├── cloudformation
├── jaws.json
├── lib
├── node_modules
├── pack...
AWSMの作成
$ jaws module create awsm-github-webhook slack
52
モジュール名 機能名
AWSMの作成
$ jaws module create awsm-github-webhook slack


aws_modules

└── awsm-github-webhook

├── awsm.json

└── slack

├...
API Gatewayと対比すると
$ jaws module create awsm-github-webhook slack


aws_modules

└── awsm-github-webhook

├── awsm.json

└─...
AWSMの構成
aws_modules

└── awsm-github-webhook

├── awsm.json

└── slack

├── awsm.json

├── event.json

├── handler.js

└──...
awsm.json(全体)
{

	 	 "name":	 "github-webhook",

	 	 "version":	 "0.0.1",

	 	 "location":	 "https://github.com/...",

	 	...
AWSMの構成
aws_modules

└── awsm-github-webhook

├── awsm.json

└── slack

├── awsm.json

├── event.json

├── handler.js

└──...
awsm.json(個別)
{

	 	 "lambda":	 {

	 	 	 	 "envVars":	 [],

	 	 	 	 "deploy":	 true,

	 	 	 	 "package":	 {

	 	 	 	 	 	 "...
awsm.json(個別)
	 	 "apiGateway":	 {

	 	 	 	 "deploy":	 true,

	 	 	 	 "cloudFormation":	 {

	 	 	 	 	 	 "Type":	 "AWS",

	...
AWSMの構成
aws_modules

└── awsm-github-webhook

├── awsm.json

└── slack

├── awsm.json

├── event.json

├── handler.js

└──...
event.json
{}
61
AWSMの構成
aws_modules

└── awsm-github-webhook

├── awsm.json

└── slack

├── awsm.json

├── event.json

├── handler.js

└──...
handler.js
'use	 strict';

/**

	 *	 AWS	 Module:	 Action:	 Lambda	 Handler

	 *	 "Your	 lambda	 functions	 should	 be	 a	...
AWSMの構成
aws_modules

└── awsm-github-webhook

├── awsm.json

└── slack

├── awsm.json

├── event.json

├── handler.js

└──...
index.js
/**

	 *	 AWS	 Module:	 Action:	 Modularized	 Code

	 */

//	 Export	 For	 Lambda	 Handler

module.exports.run	 =...
ここから編集
66
HTTP Methodを変更する
#	 aws_modules/awsm-github-webhook/slack/awsm.json

	 	 "apiGateway":	 {

	 	 	 "cloudFormation":	 {

	 	...
npmを追加する
$	 npm	 install	 request	 --save
68
#	 package.json

	 	 	 "dependencies":	 {

	 	 	 	 	 "jaws-core-js":	 "~0.0.2...
SlackのWebhookへPOSTする
#	 aws_modules/awsm-github-webhook/slack/index.js

+var	 request	 =	 require('request');

	 module.ex...
テスト
#	 aws_modules/awsm-github-webhook/slack/event.json

{

	 	 "comment":	 {

	 	 	 	 "html_url":	 "https://github.com/xx...
$	 jaws	 env	 set	 dev	 ap-northeast-1	 WEBHOOK_URL	 

https://hooks.slack.com/services/XXXXXXXX
環境変数の設定
#	 aws_modules/aw...
環境変数の参照
#	 aws_modules/awsm-github-webhook/slack/index.js

	 module.exports.run	 =	 function(event,	 context,	 cb)	 {

	 	...
ヘッダー情報を参照する
#	 aws_modules/awsm-github-webhook/slack/awsm.json

	 	 	 	 	 	 	 "ApiKeyRequired":	 false,

-	 	 	 	 	 	 "Req...
ヘッダー情報を参照する
#	 aws_modules/awsm-github-webhook/slack/index.js

module.exports.run	 =	 function(event,	 context,	 cb)	 {

+...
デプロイ
$	 jaws	 dash

JAWS:	 Dashboard	 for	 project	 "demo"

	 -------------------------------------------

	 Project	 Summ...
実行例
76
GithunのIssueにコメントすると・・・
実行例
77
GithunのIssueにコメントすると・・・
Slackに通知される!(メンションの名前が変わっています)
NPMとして公開する
78
AWSMをNPMにするときの構造
awsm-github-webhook

	 	 	 	 awsm.json

	 	 	 	 package.json

	 	 	 	 awsm

	 	 	 	 	 	 	 	 slack

	 	 	 ...
NPM初期化
$ cd aws_modules/awsm-github-webhook
$ npm init
name: (awsm-github-webhook)
version: (1.0.0)
description:
entry poi...
package.jsonの設定
#	 aws_modules/awsm-github-webhook/package.json

	 	 	 "scripts":	 {

+	 	 	 	 "postinstall":	 "jaws	 post...
NPMに公開
$ npm publish
$ npm install https://github.com/bisque33/awsm-github-webhook --save
82
このサンプルは、実際にはnpmでは公開していません。
試し...
AWSMをプロジェクトにインポートする
83
AWSMのインポート・デプロイ
$	 npm	 install	 [awsm_name]	 --save

$	 jaws	 env	 set	 [stage]	 [region]	 [変数名]	 [値]

$	 jaws	 deploy	 r...
まとめ
85
まとめ
• インフラからデプロイまで、実際のアプリケー
ションを開発する上で不足している部分を補っ
てくれて便利!
• AWSMはnpmにして再利用可能にしよう!
• まだベータなのでご利用は慎重に!
86
参考
• jaws-framework/JAWS

https://github.com/jaws-framework/JAWS
• (DVO209) JAWS: A Scalable Serverless Framework

http://...
ご静聴ありがとうございました。
Upcoming SlideShare
Loading in …5
×

AWSで作る サーバレスAPIアプリケーション

4,596 views

Published on

2015/11/21に行われた「AWSモバイル/IoTサービス徹底攻略!!」(http://classmethod.connpass.com/event/22060/)にて発表したスライドです。

Published in: Engineering
  • Dating for everyone is here: ❤❤❤ http://bit.ly/39sFWPG ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ❤❤❤ http://bit.ly/39sFWPG ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

AWSで作る サーバレスAPIアプリケーション

  1. 1. JAWSで作る サーバレスAPIアプリケーション AWS モバイル/IoTサービス徹底攻略!! - Developers.IO Meetup番外編 - 1 2015-11-21 クラスメソッド株式会社 五十嵐良輔
  2. 2. 自己紹介 • 五十嵐 良輔 • クラスメソッド株式会社 • モバイルアプリサービス部 • 現在の仕事はRailsとAWSが中心 • ブログではRailsとJAWSネタを書いています
 http://dev.classmethod.jp/author/igarashi-ryosuke/ 2
  3. 3. アジェンダ • JAWSの紹介 * • AWSMの紹介 * • サンプルプロジェクトの解説 • まとめ
 
 * 10/30に弊社で行われた「モバイルバックエンド勉強会 In 秋葉原 」で発 表したものとほぼ同じ内容です。
 http://dev.classmethod.jp/server-side/framework/jaws-awsm-users/ 3
  4. 4. JAWSの紹介 Just AWS Without Servers 4
  5. 5. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 5
  6. 6. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 6 Lambdaにnpmを使い たいんだけど・・・
  7. 7. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 7 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・
  8. 8. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 8 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・ LambdaのCFn書い て・・・
  9. 9. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 9 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・ LambdaのCFn書い て・・・ API GatewayはCFnま だ対応してない・・・
  10. 10. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 10 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・ LambdaのCFn書い て・・・ API GatewayはCFnま だ対応してない・・・ 必要なIAMを作ってな かった・・・
  11. 11. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 11 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・ LambdaのCFn書い て・・・ API GatewayはCFnま だ対応してない・・・ 必要なIAMを作ってな かった・・・ ローカルでテストした い・・
  12. 12. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 12 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・ LambdaのCFn書い て・・・ API GatewayはCFnま だ対応してない・・・ 必要なIAMを作ってな かった・・・ ローカルでテストした い・・ Lambdaに機微な情報 を書きたくない・・
  13. 13. 現状の問題 • LambdaやAPI Gatewayを使って開発をしよう とすると・・・ 13 Lambdaにnpmを使い たいんだけど・・・ Lambdaのデプロイは関 連するファイルをzipして s3にアップして・・・ LambdaのCFn書い て・・・ API GatewayはCFnま だ対応してない・・・ 必要なIAMを作ってな かった・・・ ローカルでテストした い・・ Lambdaに機微な情報 を書きたくない・・ いろいろと大変!!
  14. 14. 14 https://github.com/jaws-framework/JAWS
  15. 15. 15 https://github.com/jaws-framework/JAWS JAWSが解決します!!
  16. 16. JAWSとは • AWS LambdaとAPI GatewayをベースにAWS上で サーバレスなアプリケーションを作るフレームワー ク • 実態はCLIツール(今のところ) • Lambdaの雛形を作ったり、必要なリソースの CloudFormationテンプレートなどを自動生成・ デプロイしてくれる • オープンソース • v1.3 ベータ(2015-11-21時点)16
  17. 17. アーキテクチャ(最小構成) 17 API Gateway Lambda http://dev.classmethod.jp/cloud/aws/getting-started-with-api-gateway-lambda-integration/ JAWSがカバーする範囲
  18. 18. プロジェクト構成 • aws_modules
 機能の単位であり、複数のLambdaとリソー スを構成するためのCFnの定義からなる • cloudformation
 プロジェクトに必要なリソース全てを構成 するためのCFnの定義 • その他
 環境変数やプロジェクトの構成ファイル 18
  19. 19. プロジェクト構成 • aws_modules
 機能の単位であり、複数のLambdaとリソー スを構成するためのCFnの定義からなる • cloudformation
 プロジェクトに必要なリソース全てを構成 するためのCFnの定義 • その他
 環境変数やプロジェクトの構成ファイル 19
  20. 20. プロジェクト構成 • aws_modules
 機能の単位であり、複数のLambdaとリソー スを構成するためのCFnの定義からなる • cloudformation
 プロジェクトに必要なリソース全てを構成 するためのCFnの定義 • その他
 環境変数やプロジェクトの構成ファイル 20
  21. 21. デプロイ構成 • 複数ステージ • 複数リージョン • 3つのCloudFormationスタック • Resources • Lambdas • API Gateway 21
  22. 22. デプロイ構成 • 複数ステージ • 複数リージョン • 3つのCloudFormationスタック • Resources • Lambdas • API Gateway 22
  23. 23. デプロイ構成 • 複数ステージ • 複数リージョン • 3つのCloudFormationスタック • Resources • Lambdas • API Gateway 23
  24. 24. AWSMの紹介 AWS Module 24
  25. 25. AWS Module(AWSM)とは • JAWSプロジェクトにおける機能の単位 • リソースもまとめて管理 • LambdaとAPI Gateway • S3やDynamoDBなどその他のAWSサービス • npmと同じ構成 • 再利用可能 • 現在はNode.jsのみ(他の言語にも対応予定) 25
  26. 26. AWSM一覧 • awsm-images
 画像を編集(リサイズなど)するREST APIを生成する • awsm-users
 DynamoDBを使ってユーザを作成・認証する • awsm-cloudfront
 S3の前にCloudFrontを配置して、API Gatewayでエンドポイ ントを作成する
 26
  27. 27. AWSM一覧 • awsm-middleware • awsm-loggly • awsm-twilio • awsm-stripe-webhook • awsm-slack-webhook • awsm-mailer • awsm-s3tokenvendor • joumae-users / joumae-resources • など 27
  28. 28. サンプルプログラムの解説 28
  29. 29. 作ったもの • GithubへのコメントをSlackに通知する Webhook API • やりたかったこと • PRへのCommentだけをSlackに通知 • Githubのユーザ名をSlackのユーザ名に変換 29
  30. 30. 作ったもの • GithubへのコメントをSlackに通知する Webhook API • やりたかったこと • PRへのCommentだけをSlackに通知 • GithubのAPIはIssueとPRの区別がない • Githubのユーザ名をSlackのユーザ名に変換 30
  31. 31. 作ったもの • イメージ図 31 Webhook
  32. 32. 作ったもの • イメージ図 32 Webhook API Gateway HTTPリクエスト JSON JSON Lambda JSONをごにょごにょ
  33. 33. プロジェクトの作成 33
  34. 34. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 34 project createコマンドでプロジェクトを作成開始
  35. 35. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 35 プロジェクト名
  36. 36. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 36 プロジェクトドメイン
  37. 37. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 37 通知用メールアドレス
  38. 38. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 38 デフォルトの環境名
  39. 39. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 39 デフォルトのリージョン
  40. 40. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 40 使用するプロファイル
  41. 41. プロジェクトの作成 $ jaws project create ____ _____ __ __ _________ | | / _ / / / _____/ | |/ /_ // /_____ /__| / | / / ____________|__ /__/__/ /_________/ v1 (BETA) *** The Server-Less Framework *** JAWS: Enter a project name: (jaws-E1XgDRPWx) demo JAWS: Enter a project domain (You can change this at any time: (myapp.com) JAWS: Enter an email to use for AWS alarms: (you@yourapp.com) JAWS: Enter a stage for this project: (dev) JAWS: Select a region for your project: us-east-1 us-west-2 eu-west-1 > ap-northeast-1 JAWS: Select an AWS profile for your project: > default JAWS: Creating CloudFormation Stack for your new project (~5 mins)... 41 何分かすると最低限必要のリソース (LambdaとAPI GatewayのIAM)が作成されます。
  42. 42. プロジェクトとAWSMの雛形を作成 42
  43. 43. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 43
  44. 44. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 44 使用するプロファイルの設定など
  45. 45. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 45 AWSMのディレクトリ
  46. 46. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 46 CloudFormationテンプレートのディレクトリ
  47. 47. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 47 プロジェクトの環境設定
  48. 48. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 48 プロジェクトが使用するソースコードのディレクトリ
  49. 49. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 49 プロジェクトが使用するnpmのディレクトリ
  50. 50. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 50 プロジェクトの基本設定や依存関係のあるnpmを定義
  51. 51. プロジェクトの雛形 . ├── README.md ├── admin.env ├── aws_modules ├── cloudformation ├── jaws.json ├── lib ├── node_modules ├── package.json └── tests 51 テストディレクトリ
  52. 52. AWSMの作成 $ jaws module create awsm-github-webhook slack 52 モジュール名 機能名
  53. 53. AWSMの作成 $ jaws module create awsm-github-webhook slack 
 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 53 これらが雛形として作られる
  54. 54. API Gatewayと対比すると $ jaws module create awsm-github-webhook slack 
 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 54 この先にLambda Function Resource Action
  55. 55. AWSMの構成 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 55 AWSMの環境設定や、AWSM全体に必要なリソース
  56. 56. awsm.json(全体) { "name": "github-webhook", "version": "0.0.1", "location": "https://github.com/...", "author": "", "description": "", "resources": { "cloudFormation": { "LambdaIamPolicyDocumentStatements": [], "ApiGatewayIamPolicyDocumentStatements": [], "Resources": {} } } } 56 LambdaのIAMロールポリシー API GatewayのIAMロールポリシー その他必要なリソース
  57. 57. AWSMの構成 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 57 個別のアクションに必要な設定
  58. 58. awsm.json(個別) { "lambda": { "envVars": [], "deploy": true, "package": { "optimize": { "builder": "browserify", "minify": true, "ignore": [], "exclude": [ "aws-sdk" ], "includePaths": [] }, "excludePatterns": [] }, "cloudFormation": { "Description": "", "Handler": "aws_modules/github-webhook/slack/handler.handler", "MemorySize": 1024, "Runtime": "nodejs", "Timeout": 6 } }, 58 環境変数 パッケージ設定 Lambdaの設定
  59. 59. awsm.json(個別) "apiGateway": { "deploy": true, "cloudFormation": { "Type": "AWS", "Path": "github-webhook/slack", "Method": "GET", "AuthorizationType": "none", "ApiKeyRequired": false, "RequestTemplates": {}, "RequestParameters": {}, "Responses": { "400": { "statusCode": "400" }, "default": { "statusCode": "200", "responseParameters": {}, "responseModels": {}, "responseTemplates": { "application/json": "" } } } } } } 59 API Gatewayの設定
  60. 60. AWSMの構成 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 60 ローカルでテストするときのテストデータ
  61. 61. event.json {} 61
  62. 62. AWSMの構成 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 62 Lambda のエントリーポイント
  63. 63. handler.js 'use strict'; /** * AWS Module: Action: Lambda Handler * "Your lambda functions should be a thin wrapper around your own separate * modules, to keep your code testable, reusable and AWS independent" */ require('jaws-core-js/env'); // Modularized Code var action = require('./index.js'); // Lambda Handler module.exports.handler = function(event, context) { action.run(event, context, function(error, result) { return context.done(error, result); }); }; 63 環境変数を読み込んだりする 実際の処理を記述する Lambdaのエントリーポイント
  64. 64. AWSMの構成 aws_modules
 └── awsm-github-webhook
 ├── awsm.json
 └── slack
 ├── awsm.json
 ├── event.json
 ├── handler.js
 └── index.js 64 実際の処理部分
  65. 65. index.js /** * AWS Module: Action: Modularized Code */ // Export For Lambda Handler module.exports.run = function(event, context, cb) { return cb(null, action()); }; // Your Code var action = function() { return {message: 'Your JAWS lambda executed successfully!'}; }; 65 handler.jsから呼ばれる部分 実際の処理実装を書く部分
  66. 66. ここから編集 66
  67. 67. HTTP Methodを変更する # aws_modules/awsm-github-webhook/slack/awsm.json "apiGateway": { "cloudFormation": { "Type": "AWS", "Path": "awsm-github-webhook/slack", + "Method": "POST", "AuthorizationType": "none", "ApiKeyRequired": false, "RequestTemplates": {}, 67 MethodをPOSTに変更
  68. 68. npmを追加する $ npm install request --save 68 # package.json "dependencies": { "jaws-core-js": "~0.0.2" + "request": "^2.65.0" } requestを追加
  69. 69. SlackのWebhookへPOSTする # aws_modules/awsm-github-webhook/slack/index.js +var request = require('request'); module.exports.run = function(event, context, cb) { + // Slackのincoming-webhook URL + // TODO: Varsから取得する + var webhookUrl = 'https://hooks.slack.com/services/XXXXXXXX'; + + // SlackへPOSTするパラメータを作成 + var text = event.comment.body + '<' + event.comment.html_url + '>'; + text = text.replace("@cm-igarashi-ryosuke", "@cm-igarashi"); + var params = { text: text }; + + // Slackのincoming-webhook URLにパラメータをつけてPOSTする + request.post(webhookUrl, { form: { payload: JSON.stringify(params) } }, + function (err, res, body) { + return cb(null, {message: body}); + } + ); }; 69
  70. 70. テスト # aws_modules/awsm-github-webhook/slack/event.json { "comment": { "html_url": "https://github.com/xxx/xxx/issues/124#issuecomment-156993922", "body": "@cm-igarashi-ryosuke てすと" } } 70 $ cd aws_modules/awsm-github-webhook/slack $ jaws run JAWS: {"message":"ok"} テストデータを追加
  71. 71. $ jaws env set dev ap-northeast-1 WEBHOOK_URL https://hooks.slack.com/services/XXXXXXXX 環境変数の設定 # aws_modules/awsm-github-webhook/slack/awsm.json { "lambda": { - "envVars": [], + "envVars": [ + "WEBHOOK_URL" + ], 71 環境変数名 環境変数の値
  72. 72. 環境変数の参照 # aws_modules/awsm-github-webhook/slack/index.js module.exports.run = function(event, context, cb) { // Slackのincoming-webhook URL - // TODO: Varsから取得する - var webhookUrl = 'https://hooks.slack.com/services/XXXXXXXX'; + var webhookUrl = process.env.WEBHOOK_URL; 72 環境変数から値を取得するよう修正
  73. 73. ヘッダー情報を参照する # aws_modules/awsm-github-webhook/slack/awsm.json "ApiKeyRequired": false, - "RequestTemplates": {}, + "RequestTemplates": { + "application/json": "{"x_github_event": "$input.params('X-GitHub-Event')", "body": $input.json('$')}" + }, "RequestParameters": {}, 73 リクエストHeaderの’X-GitHub-Event’の値を、 Lambdaのパラメータ(event.x_github_event)に渡す リクエストbodyをevent.bodyに渡す
  74. 74. ヘッダー情報を参照する # aws_modules/awsm-github-webhook/slack/index.js module.exports.run = function(event, context, cb) { + // X-GitHub-Eventの値が「issue_comment」でない場合は処理を終了 + if(event.x_github_event != 'issue_comment') { + return cb(null, action()); + } - var text = event.comment.body + '<' + event.comment.html_url + '>'; + var text = event.body.comment.body + '<' + event.body.comment.html_url + '>'; 74
  75. 75. デプロイ $ jaws dash JAWS: Dashboard for project "demo" ------------------------------------------- Project Summary ------------------------------------------- Stages: dev ap-northeast-1 Lambdas: 1 Endpoints: 1 ------------------------------------------- Select Resources To Deploy ------------------------------------------- awsm/slack L) lAwsmGithubWebhookSlack E) /awsm-github-webhook/slack - POST - - - - - > Deploy Selected --> 75 デプロイするリソースを選択 jaws dashコマンド
  76. 76. 実行例 76 GithunのIssueにコメントすると・・・
  77. 77. 実行例 77 GithunのIssueにコメントすると・・・ Slackに通知される!(メンションの名前が変わっています)
  78. 78. NPMとして公開する 78
  79. 79. AWSMをNPMにするときの構造 awsm-github-webhook awsm.json package.json awsm slack awsm.json handler.js index.js event.json lib modularcode.js 79 npmの設定 Lambdaの部分はawsmディレクトリに入れる ここにあるコードはカスタマイズして使われる想定 libディレクトリにはカスタマイズして欲しくない コードを入れる
  80. 80. NPM初期化 $ cd aws_modules/awsm-github-webhook $ npm init name: (awsm-github-webhook) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /Users/igarashi.ryosuke/temp/jaws/test/aws_modules/awsm- github-webhook/package.json: $ mkdir awsm && mv slack awsm/slack 80 対話的にnpmの初期設定 awsmディレクトリに移動 package.jsonが作られる
  81. 81. package.jsonの設定 # aws_modules/awsm-github-webhook/package.json "scripts": { + "postinstall": "jaws postinstall awsm-github-webhook npm" }, "dependencies": { "jaws-core-js": "~0.0.2", + "request": "^2.65.0" } 81 npm install 時に実行されるコマンド jaws postinstall コマンドが JAWSプロジェクトのaws-modulesディレクトリに awsmフォルダ内のファイルをコピーする。 依存モジュールも忘れずに。
  82. 82. NPMに公開 $ npm publish $ npm install https://github.com/bisque33/awsm-github-webhook --save 82 このサンプルは、実際にはnpmでは公開していません。 試してみたい場合は、Githubからinstallしてください。 https://github.com/bisque33/awsm-github-webhook
  83. 83. AWSMをプロジェクトにインポートする 83
  84. 84. AWSMのインポート・デプロイ $ npm install [awsm_name] --save $ jaws env set [stage] [region] [変数名] [値] $ jaws deploy resource $ jaws dash [JAWS] AWSMを使って認証・認可APIを作る | Developers.IO http://dev.classmethod.jp/server-side/framework/jaws-awsm-users/ 84 AWSMのダウンロード 環境変数の設定(必要があれば) LambdaとAPI Gatewayのデプロイ リソースのデプロイ(必要があれば)
  85. 85. まとめ 85
  86. 86. まとめ • インフラからデプロイまで、実際のアプリケー ションを開発する上で不足している部分を補っ てくれて便利! • AWSMはnpmにして再利用可能にしよう! • まだベータなのでご利用は慎重に! 86
  87. 87. 参考 • jaws-framework/JAWS
 https://github.com/jaws-framework/JAWS • (DVO209) JAWS: A Scalable Serverless Framework
 http://www.slideshare.net/AmazonWebServices/dvo209-jaws-a-scalable-serverless- framework • (レポート) DVO209: JAWS: 高度にスケーラブルなサー バーレスフレームワーク #reinvent | Developers.IO
 http://dev.classmethod.jp/cloud/aws/reinvent2015-dvo209/ • JAWSフレームワークで、サーバレスな分散ロック サービス「Joumae」をつくった - Qiita
 http://qiita.com/mumoshu/items/3cbe31b315be31f510d0 87
  88. 88. ご静聴ありがとうございました。

×