E
x a
V
a l u e
F
o r u m
2018
2018年 11月 7日
株式会社エクサ
テクノロジーイノベーション部
萩森 省吾
冨田 大樹
サーバレスのアプリケーション開発
Copyright © 2018 EXA CORPORATION
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。Copyright © 2018 EXA CORPORATION
サーバレスコンピューティングとは
The phrase “serverless” doesn’t mean servers are no longer involved. It simply
means that developers no longer have to think that much about them. Computing
resources get used as services without having to manage around physical
capacities or limits.
Ken Fromm 「Why The Future Of Software And Apps Is Serverless」(2012/10/15 ReadWrite)より <https://readwrite.com/2012/10/15/why-the-future-of-software-and-apps-is-serverless/>
●
サーバがもはや必要となくなった、という意味ではない
●
開発者がインフラについて多くの事を考える必要がなくなった
●
コンピューティングリソースがサービスとして提供され、開発者が物理的な容量や限
界を管理する必要がない
サーバやインフラを気にかけず、主力製品に集中できる
1.はじめに
近年のクラウドサービスの動き
近年、サーバレスコンピューティングはAWSに続き、主要クラウド
サービスの全てがサービスを展開し、急速に注目を集めている
AWS Lambda Azure FunctionsGoogle Cloud Platform Cloud Functions IBM Cloud Functions
サーバレスの知見を得る事により、
新たなビジネスチャンスが生まれる!
マイクロサービスベースとなるため、構築が早く、
変更も容易となるシステムが開発できる
Copyright © 2018 EXA CORPORATION
研修実績管理システムのリプレース
現在の研修実績管理システムの問題点
• サーバ老朽化による故障で、昨年から臨時サーバで運用
– 臨時環境であり、恒久的な運用に耐えられない
• アプリケーション本体もFWやDBが古く、サポート切れ
• UIが使いにくく社員がシステムを活用できていない
AWS上でサーバレスアプリケーションとしてリプ
レースする事に
1.はじめに
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。Copyright © 2018 EXA CORPORATION
研修実績管理システムについて
社員 研修受講システム 技術管理システム 研修実績管理システム ・社内研修の 受講申請をする ・自己研鑽・社外研修の 実績を登録する ・年間総受講日数の確認 をする ・スキルレベルを確認する ・研修受講計画を考える 育成担当 社内研修受講実績 データ 研修実績 データ ・全社の研修受講状況 レポートを作成する2.研修実績管理システムの概要
リプレース要件
1. 社員がいつでもどこでも、研修実績を
登録することができる
2. 育成担当が効率よく作業できる
3. 他の社内システムと同じユーザIDとパ
スワードを使って認証できる
社員個人が頻繁に使う機能は、会社支給 iPhoneか らも簡単に利用できるインターフェースとして、チャットボットで提供
主に育成担当が使う、複数件一括登録や、対象 件数が多い参照機能はWebで提供
チャットボットはG suiteへのログインで利用可Webは、GoogleのOpenID Connectを利用して
Copyright © 2018 EXA CORPORATION
新研修実績管理システムの全体アーキテクチャ
Google Cloud Platform Google Apps Script IF ブラウザ Hangouts Chat 社員 IAM Dynamo DB Lambda Cognito API Gateway WAF CloudFront S3 CodeCommit CodePipeline CodeBuild CloudFormation CloudWatch 開発者 JavaScript YAML 開発者用サービス2.研修実績管理システムの概要
主な使用サービス一覧
種類 名前 説明
AWSサービス
WAF AWSのWeb Application Firewall
CloudFront CDN(Contents Delivery Network)サービス API Gateway APIのエンドポイントを作成 (Lambdaと繋げる)
Lambda サーバの管理必要なしでコードを実行できるコンピューティングサービス DynamoDB KVS型のNoSQLデータベース S3 オブジェクトストレージ Cognito AWSの認証・認可用サービス IAM AWSでのユーザ管理 CodeCommit Gitリポジトリホスティングサービス CodeBuild コンテナ上で任意のシェルスクリプトを実行可能 CloudFormation AWSサービスのオーケストレーション CodePipeline CI/CD(継続的インテグレーション / デリバリー)サービス CloudWatch ログ・AWS上でのイベントの管理
Copyright © 2018 EXA CORPORATION
主な言語・フレームワーク・ライブラリ一覧 1/2
種類 名前 説明 言語 JavaScript Lambda関数・Webアプリクライアントで使用 YAML CloudFormationのテンプレートファイルの記述で使用Google Apps Script チャットボットの IFに使用
フレームワーク・ ライブラリ
Node.js JavaScript実行環境
AWS SDK Node.jsで使用するAWSのSDK
React.js フロントエンドの UI作成ライブラリ
AWS SAM CloudFormation用サーバレスアプリケーションモデル
SAM Local AWS SAMをローカルで構築できる CLIツール
webpack フロントエンドのモジュールバンドラ
babel JavaScript コンパイラ
Material UI コンポーネントライブラリ
主な言語・フレームワーク・ライブラリ一覧 2/2
種類 名前 説明 フレームワーク・ ライブラリ Mocha テスト全般で使用するテストフレームワーク power-assert アサーションライブラリ Mochawesome テストレポート出力ライブラリ Enzyme React.jsコンポーネントテストのためのユーティリティライブラリ TestMyBot チャットボットAPI用テストフレームワークCopyright © 2018 EXA CORPORATION
アプリケーションアーキテクチャ
Google Cloud Platform Google Apps Script IF ブラウザ Hangouts Chat 社員 IAM Dynamo DB Lambda Cognito API Gateway WAF CloudFront S32.研修実績管理システムの概要
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。Copyright © 2018 EXA CORPORATION
Lambdaとは
• AWSが提供しているコンピューティングサービス
– サーバをプロビジョニングしたり管理しなくてもコードを実行できる
• JavaScript, Java, C#, Go, Python が対応
• 最大処理時間15分
– バッチ処理には向かない
• イベントにより、コンテナが処理中のみ立ち上がって関数が実行さ
れる
– APIへのリクエスト、時間、各種AWSサービスのイベント等
3.AWS Lambdaを利用した開発
Lambda関数から別のLambda関数の呼び方 1/2
Lambda関数をモジュール単位で分割して開発したい
Lambda ウェブ用 実績登録 ロジック 実績 テーブル Dynamo DB ボット用しかし、Lambdaは各関数が隔離されたコンテナで動作するため
言語仕様上の呼び出し方では不可能
resiter bot bot.jsconst register = require(‘./register’); ...
エラー
例:
Copyright © 2018 EXA CORPORATION
Lambda関数から別のLambda関数の呼び方 2/2
AWS SDK のLambda関数呼び出しメソッドを利用
bot.js
const AWS = require(‘aws-sdk’); const lambda = new AWS.Lambda({ ... }); ... lambda.invoke({ FunctionName: ‘register’, Payload: parameters }); SDKは require 可能 関数名(FunctionName)を 指定して呼び出し
3.AWS Lambdaを利用した開発
DynamoDBとは
• AWSで提供されているKey Value Store型のデータ
ベース
• 読み込み・書き込みが早い
• トランザクションは使えない
– コミット・ロールバックなし
– 複数レコードの一貫性が保たれなくても本当に問題ないか、十分に検討
する必要がある
– 代替手段として、Amazon RDS (フルマネージドのRDBサービス)
Copyright © 2018 EXA CORPORATION
Lambda関数のユニットテスト手法
Lambda関数に依存するAPIやDBはクラウド上のサービスとなってい
るため、通常はLambda関数のユニットテストはクラウドにあげて行う
必要がある
AWS公式ツールを用いてローカル環境でテストが可能
– SAM Local (現 SAM CLI)
– DynamoDB ローカル
ローカルPC上でLambda関数の開発が可能
3.AWS Lambdaを利用した開発
SAM Local
• AWSのサーバレス環境をローカルPCのDockerコンテ
ナ上で構築できるコマンドラインツール
– CloudFormationテンプレートを利用する事で、本番と同等
の環境が構築可能
• 構築できるのは API Gateway と Lambda のみ
• ローカルで任意のタイミングで素早くテスト出来る環境
はアジャイル開発においては必須
SAM Localのセットアップ方法
Copyright © 2018 EXA CORPORATION
DynamoDBローカル
• ダウンロード可能なDynamoDB
– Javaアプリケーション
• コマンドラインから起動・停止が可能
• SAM LocalではDynamoDBは構築されないため、使
用する必要がある
3.AWS Lambdaを利用した開発
ローカルPC環境全体図
Node.js Docker ソースコード / テストコード 仮想AWS環境 SAM Local DynamoDBローカル Lambdaから参照 コンテナ立ち上げ CentOS 7.1 Virtual Box Windows 7 ローカルPC 社用PCだとセキュリティソフトとの兼ね合い (?)でWindows 7上で Dockerが動作しなかったため、 Linuxの仮想OS上で環境を構築 コンテナ立ち上げ・環境構築 JDK 8Copyright © 2018 EXA CORPORATION
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。4.チャットボットの開発
チャットボットのアーキテクチャ図
Hangouts Chat会話1往復で左端から右端まですべて実行される
こんにちは コンニチハ CloudFrontWAF API Gateway Lambda DynamoDB
Google Cloud Platform
インターフェース チャットボット
Google Apps Script
Hangout Chat用IF
ボット本体の機能を提供 Hangouts Chatとボットの架け橋
Copyright © 2018 EXA CORPORATION
チャットボットの会話の流れ
登録する 研修名は? サーバーレス 研修日は? 登録実行 登録しました 2018/06/12 会話の開始 会話の終了会話の進行に合わせてその状態は保持する必要がある
ユーザ チャットボット 機能4.チャットボットの開発
一つの機能を提 供するために 1 回以上のやり取 りが必要 DB 状態保持 状態保持会話の状態保持
Lambdaは処理が終わるとインスタンスが破棄されてしまう。
そのためユーザとの会話の状態はDBなどを利用して保存した。
データ構造
{ user_id: ”abc” intent_id: ”sample” session:{ index: 2 entities:{ name:”サーバーレス ” } } } ユーザのID 進行中の話題 何番目の会話まで進んだか 会話の中で得た情報Copyright © 2018 EXA CORPORATION
テストの手法
ITとSTフェーズでテストをする範囲は以下の様に定めた
テスト種類 テスト内容 使用フレームワーク 自動化 UT LambdaとGoogle Apps Scriptそれぞれのテスト QUnit for Google Apps Script
○
ITa Bot API が正常に動作するかをテストする TestMyBot○
ITb インターフェースとBot APIの連携をテストする QUnit for Google Apps Script○
ST 実際にチャットクライアントを使用してテストする ー ×技術者でなくても理解できる形式でテストコードを
記述する
-
お客様にテストコードを直接レビューいただくことが可能
-
テストケース表を別途作成する必要がなくなる
#me ←ユーザの入力 登録 #bot ←ボットからの応答 どんな研修を受けましたか。タイトルを入れてください。 #me サーバーレスアプリケーション開発 #bot 「サーバーレスアプリケーション開発」ですね。TestMyBotの特徴
テストコード一例Copyright © 2018 EXA CORPORATION
レスポンスの問題発生
実装したものを触ってみると、ユーザの入力からボットの応答があるまでの
時間が非常に遅いことがわかった。
ⅰ 1.5秒 ⅱ 0.4秒 ⅲ 0.8秒 ⅳ 0.4秒4.チャットボットの開発
Botの応答速度改善
Hangouts Chat Hangout Chat用IF Google Cloud Platform スプレッドシート ⅲ Lambdaの起動にかかる時間 (0.8秒) ⅰ イベントが発火する時間 (1.5秒)ⅱ Spread Sheetの操作時間(0.4秒) ⅳ Lambdaの処理にかかる時間 (0.4秒)
試した内容 成果
ⅰ Googleが完全に隠蔽している領域なので断念した ー
ⅱ スプレッドシートの操作にキャッシュを適用した 読込:0.13秒に短縮書込:変化なし
ⅲ 15分に1度Lambdaを実行する(コンテナを常時ホットスタンバイにする ) 効果なし
ⅳ Lambda実行時に使用するメモリサイズを 128MBから512MBに増やす 0.4秒が0.1秒に短縮
API Gateway Lambda DynamoDB Google Apps Script
TOTAL
4秒 → 3.5秒
Copyright © 2018 EXA CORPORATION
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。5.Webアプリケーションの開発
• アプリケーションの形態は Single Page Application とした
–
フロントエンドのライブラリとして React.js を採用
• Single Page Application とは?
–
単一ページで構成されるWebアプリケーション
–
サーバサイドではデータのみを返すREST APIを実装
–
クライアントサイドでJavaScriptを用いてDOMを操作してページを切り替える
Webアプリケーション概要
CloudFront
WAF API Gateway Lambda Dynamo DB
REST APIを実装
ブラウザ React.js
Copyright © 2018 EXA CORPORATION
Single Page Application の特徴
Single Page Application 従来のWebアプリケーション
サーバサイド処理の 違い ● データのみをクライアントへ返し、クライ アントサイドで描画する ● 必要箇所のみ再描画するため、レスポ ンスも速い ● サーバサイドで HTMLを描画してクラ イアントへ返す セッションの有無 ● 無し ● DBで保持する、もしくはクライアントサ イドで保持する必要がある (Cookie等) ● 有り ブラウザとの依存性 ● ブラウザがJavaScriptをサポートしてい る必要がある ● 特に無し
5.Webアプリケーションの開発
Single Page Application の特徴
Single Page Application 従来のWebアプリケーション
サーバサイド処理の 違い ● データのみをクライアントへ返し、クライ アントサイドで描画する ● 必要箇所のみ再描画するため、レスポ ンスも速い ● サーバサイドで HTMLを描画してクラ イアントへ返す セッションの有無 ● 無し ● DBで保持する、もしくはクライアントサ イドで保持する必要がある (Cookie等) ● 有り ブラウザとの依存性 ● ブラウザがJavaScriptをサポートしてい る必要がある ● 特に無し 次スライドで詳しく説明
Copyright © 2018 EXA CORPORATION
処理フロー図
例:研修実績登録時 API Gateway Lambda I/F 実績登録ロジック 実績 テーブル DynamoDB ユーザ ブラウザ ・入力値のバリデーション ・システムプロパティ作成 ① 実績を入力し、 登録ボタンをクリック② APIに対してリクエスト ③ 対応するLambda関数 が実行される ④ DynamoDBに 実績データを挿入
⑤ レスポンスを API Gatewayに渡す ⑥ レスポンスを クライアントに返す ⑦ APIのレスポンスを受け取り 画面を再描画
5.Webアプリケーションの開発
処理フロー図
例:研修実績登録時 Lambda I/F 実績登録ロジック 実績 テーブル DynamoDB ユーザ ブラウザ ・入力値のバリデーション ・システムプロパティ作成 ① 実績を入力し、 登録ボタンをクリック② APIに対してリクエスト ③ 対応するLambda関数 が実行される ④ DynamoDBに 実績データを挿入
⑤ レスポンスを API Gatewayに渡す ⑥ レスポンスを クライアントに返す ⑦ APIのレスポンスから 非同期で画面を再描画 シンプルなREST APIを実装 { statusCode: 200, data: { … } } データをJSONを返す API Gateway
Copyright © 2018 EXA CORPORATION
処理フロー図
例:研修実績登録時 API Gateway Lambda I/F 実績登録ロジック 実績 テーブル Dynamo DB ユーザ ブラウザ ・入力値のバリデーション ・システムプロパティ作成 ① 実績を入力し、 登録ボタンをクリック② APIに対してリクエスト ③ 対応するLambda関数 が実行される ④ DynamoDBに 実績データを挿入
⑤ レスポンスを API Gatewayに渡す ⑥ レスポンスを クライアントに返す ⑦ APIのレスポンスを受け取り 画面を再描画 登録ボタンクリック前 登録ボタンクリック後
5.Webアプリケーションの開発
React.jsについて
• A JavaScript library for building user interfaces
– 引用:https://facebook.github.io/react/
•
コンポーネント
単位で実装
• コンポーネントとは、UI部品の見た目と振る舞いをセッ
トにしたもの
– 例:ボタンとクリック時のイベントハンドラ
• コンポーネントとDOMは1:1対応
– DOMの粒度は実装者が決定
Copyright © 2018 EXA CORPORATION
どの粒度でコンポーネントを分割すべき?
React.jsで実装してみての気づき ①
資料を作る 追加 部屋の掃除をする 本を買う✔
メールを返すUI部品(DOM)は全て「コンポーネント」
粒度を小さくすれば再利用性の高いコンポーネントを作れるが、コンポーネント間の包含 関係が複雑になる最初は大きい粒度で実装した方がやりやすい
(コンポーネント分割は後からでも可能)
5.Webアプリケーションの開発
React.jsで実装してみての気づき ②
値の状態を管理 (React.jsアプリのモデル ) ... this.state = { name: ‘Tomita’ } ... render( return(<p>Hello,{this.state.name}</p>); ); 画面上で「Hello,Tomita」と表示される stateの値に変更があると必要最低限の DOMのみ再描画されるReact.js は「stateと画面表示を同期してくれるライブラリ」と言える
state設計が大切
今後の機能追加・修正も見据えてstateを設計しておくと、
仕様変更に強いコードになる
Copyright © 2018 EXA CORPORATION
テスト手法
テスト種類 テスト内容 使用lib 自動化 UT (クライアント側) ● 実装したコンポーネントの動きをテスト ● コンポーネントが問題なく作られるかどうか、コンポーネント中の要素 がクリックされた時の動きを仮想的にシミュレートする Enzyme○
ITa ● APIにリクエストして期待のレスポンスが返ってくるか、 AWSの結合テ スト ● AjaxでAPIにリクエストを送るコードを書き、テストする -○
ITb ● ブラウザ上からの E2Eテスト● Headless Chromeを自動操作してテストする Puppeteer
○
ST
● ブラウザ上から手動でテスト
● システムエラーを起こしてみてちゃんとハンドリングできているか確認 -
Enzyme
• React.js用テストユーティリティライブラリ
• React.jsコンポーネントの処理を画面に描画せずとも
仮想的にシミュレートできる
– 対象のコンポーネントが生成されたかどうか
– コンポーネント中の要素がクリックされた時に正しくイベント
ハンドラが動作するか
– 子コンポーネントが生成されたかどうか 等
Copyright © 2018 EXA CORPORATION
Puppeteer
• Google Chromeを制御するライブラリ
• Headless Chromeも制御可能
• Seleniumとは違いGoogle Chrome以外は動かせない
• DOMが生成される / 削除されるまで処理を待機させる
事が可能のため Single Page Application と相性が良
い
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8. おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。Copyright © 2018 EXA CORPORATION
セキュリティに関する考え方
本システムは、秘匿性の高いデータを持っていない。また、社員が通常業務を行う上で
ミッションクリティカルなものではないため、以下の観点で基本的な対策をとることとした。
1. 正当な権利を持った人だけが使用できる
a. ユーザ認証を行う b. チャットボットへのアクセス制御を行う c. Webアプリへのアクセス制御を行う2. 正当な権利を持たない人に変更されない
a. WAFを使用し、CSRF、XSSなど基本的な対策を実施する3. 個人情報を漏洩させない
a. AWS上に社員の個人情報を保持しない b. プログラム処理上必要な個人特定のためのキー情報は、ハッシュ化する6.アクセス制御と認証
Webアプリでのユーザ認証
ユーザが社内の共通認証基盤でログイン出来るように
Google の OpenID Connect を利用してユーザを認証する
項番 内容 ① 利用するWebページを取得 ② 社内の共通認証基盤でログインし、IDトークンを取得する ③ IDトークンからユーザの認証情報を生成し返却する ④ ③で取得した認証情報を付与してAPIへリクエストを送信する ⑤ 認証情報を検証し、認可されていればLambdaを実行する 認証フロー
Copyright © 2018 EXA CORPORATION
チャットボットのアクセス制御
Hangouts Chat
Google Apps Script
Google Cloud Platforms CloudFront WAF IFキーの送信 ①IFキーの存在チェック APIキーの付与 ②APIキーの存在チェック ブロック項目 手法 ①作成したプログラム以外からのアクセス WAFを使用してリクエストにIFキーが存在するかをチェックする ②API Gateway への直接アクセス Cloud Frontを使用してリクエストにAPIキーを付与し、
API Gatewayで存在をチェックする
API Gateway Lambda DynamoDB
研修実績管理システムのプログラム以外から
ボットAPIを利用できないようにする
Webアプリのアクセス制御
CloudFront
API Gateway Lambda
WAF DynamoDB ブラウザ S3 ②Cloud Front経由チェック ①IPアドレスチェック ③認証チェック ブロック項目 手法 ①社外IPからのアクセス WAFを使用して、IPアドレスのチェックする ②S3への直接アクセス CloudFront経由のアクセスかをS3でチェックする ③未認証ユーザのAPI Gatewayへのアクセス API Gatewayでユーザの認証をチェックする
Copyright © 2018 EXA CORPORATION
個人情報の保護
IF チャットボットでの ID生成箇所 WebアプリでのID生成箇所 インターフェースのイベントが発火した際に渡される情報には、実行したユー ザの情報が含まれている。 その情報の一つにメールアドレスがあるためそれを利用する。 Google によって発行された IDトークン を検証する際にユーザ情報を取得す ることが出来る。 その情報の一つにメールアドレスがあるためそれを利用する。•
社員の個人情報をAWSで保持しない設計とした
•
社員を特定するキーとなるようなプログラム上必要な情報はユーザのメールアド
レスをハッシュ化した物を利用した
•
なりすましを防ぐためにユーザのメールアドレスはユーザが入力したものではな
く、サーバー側でGoogle から取得して生成した
6.アクセス制御と認証
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8.
おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。Copyright © 2018 EXA CORPORATION
CI/CD環境が何故必要か
開発手法としてアジャイル開発を取る事に決定
スプリント毎にフィードバックをもらうため、早く
リリースできる環境を整える必要がある
CI/CD環境の構築が必要不可欠!
7.CI/CD実現のためのポイント
• ソースコードをコミットするだけでパイプラインが走る様にする
–
CLIからアップロードする事も可能だが、開発者のローカルPCの
環境構築が煩雑
• クラウド上のサービスのみを使ってCI/CD環境を作る
–
自前でCIサーバは立てない
CI/CD環境構築時の考慮点
サーバを直接参照できない
warを作ってscpでアプリサーバにコピーして...は不可能
Copyright © 2018 EXA CORPORATION
CI/CDプロセスの概略図
Build
• AWSリソース
– CloudFormationテンプレートをデプロイ可能
形式に変換
• Webアプリクライアント
– S3のWebアプリ配信用バケットにクライアント
リソース(HTML + js)をアップロード
Copyright © 2018 EXA CORPORATION
Deploy
• AWSリソース
– テンプレートを基に各種サービスを
デプロイ
• Lambda関数
• DynamoDBのテーブル
• API
• Webアプリクライアント
– 特になし
※ デプロイで使用しているサービスの都合上、 Webアプリク ラ イアントはBuildプロセスにてデプロイ7.CI/CD実現のためのポイント
Test
• 各種テストを実行
• テスト実行後、各種テストレ
ポートとWebアプリのITbの
実行中に撮られたスクリーン
ショットをS3のバケットに保
存
Copyright © 2018 EXA CORPORATION
複数環境へのデプロイ
• 本番環境へ影響を与えずにStaging環境を自動構築できる様にし
たい
→ 実開発前にブランチモデルの策定
• 本番環境とStaging環境で構成が異なってしまう事を避けるため
CloudFormationテンプレートファイルは1つにしたい
→ CloudFormationパラメータ・Lambda環境変数を活用
7.CI/CD実現のためのポイント
本番機とは別に検証用にStaging環境が必要
実開発前にブランチモデルの策定
bugfix master release develop feature branchesソースコードの構成管理として
Git-flow というブランチモデルを使用する事を策定した
masterのソースコードに 変更があると 本番環境用Pipelineが実行 developのソースコードに 変更があると Staging環境用Pipelineが実行Copyright © 2018 EXA CORPORATION
CloudFormationパラメータ・Lambda環境変数を活用
Regiser: # 登録ロジックLambdaの定義
FunctionName: !Sub ‘tr_${EnvName}_register’ ...
Environment:
RESULT_TABLE: !Sub ‘tr_${EnvName}_result’ ...
CloudFormation Template Staging環境用 CodePipeline 設定画面 (CloudFormationの設定)
Lambda関数名
環境変数
Webアプリクライアントの複数環境対応
同じソースコードでPipeline上のBuildプロセス時に特定の箇所を
置換できる様にしたい
Staging用 Pipeline 本番用 Pipeline ...let url = API_ENDPOINT;
... org
stg
...
let url =[Staging用URL];
...
Build Deploy Test
prod ...let url =[本番用URL];
...
Build Deploy
webpack というビルダーを活用
Copyright © 2018 EXA CORPORATION
目次
1. はじめに
2. 研修実績管理システムの概要
3. AWS Lambdaを利用した開発
4. チャットボットの開発
5. Webアプリケーションの開発
6. アクセス制御と認証
7. CI/CD実現のためのポイント
8.
おわりに
※本資料に記載されているロゴ、システム名称、 企業名称、製品名称は各社の登録商標または商標です。8.おわりに
サーバレスアプリケーションを開発しての気付き
• ミドルウェアを意識しなくて良いのは楽
• ビルドとデプロイの自動化は必須
• ローカルPCでユニットテストが行える環境があると開発を効率
化できる
• マイクロサービスアーキテクチャとなるので、他システムとリソー
スの再利用が可能
Copyright © 2018 EXA CORPORATION
まとめ
デモンストレーションを見ていただきます。
・チャットボットからの実績登録と照会
・Webからの実績登録
8.おわりに
e
a
ご清聴いただき
Copyright © 2018 EXA CORPORATION Hangout Chat用IF
ボット
とインターフェースの役割詳細
ユーザとボットの架け橋を行う
•
ユーザがチャットを操作したときのイベントを受け取る
•
ボットへのリクエストをボットが期待する形に整形する
•
ボットの応答をHangoutsChatが期待する形に整形する
•
APIがユーザ個人を識別できる情報を付加する
ユーザ個人の会話の状態や流れを管理・制御する
•
会話の進行を制御する(戻ることもある)
•
今の話題や会話の進行度を管理する
•
機能の実行に必要な情報を収集・管理する
•
情報が揃ったときに適切な機能を実行する
•
ユーザに適切なメッセージで応答する
付録
ボット本体 インターフェース会話の設計(用語)
• インテント
– 会話の「意図・目的」を表す
•
エンティティ
– 会話の目的を達成するために必要な「情報」のこと
•
フルフィルメント
– 目的の達成に必要な物が揃ったときに実行される
Copyright © 2018 EXA CORPORATION
インテント
• システムが提供する機能単位でインテントを定義した
– 「登録」「削除」「照会」
• ユーザとの会話はインテントを基準に進行する
– 目的が達成されるまで(エンティティが揃うまで)繰り返される
• 1つのインテントに1往復以上の会話が存在する
付録
エンティティ
• 目的(インテント)を達成するために収集される情報
– インテントごとに内容は様々
– ユーザから聞き出す必要のあるものと無いものがある
• 収集されたエンティティを使ってフルフィルメントが実行される
Copyright © 2018 EXA CORPORATION
フルフィルメント
• 必要なエンティティがすべて揃ったときに最後に呼び出される
• 「DBに実績を格納する」等のWeb・ボット共通の処理を行う
付録
ボット本体の設計
IF ボット インテント コントローラー インテントA インテントB インテントC ・ ・ ・ フルフィルメントA フルフィルメントB インテントD ・ ・ ・ 機能(インテント)の増加や修正等のインパクトをなるべく抑えるために上記のように切 り分けを行った。 また、インテントも共通部の処理は切り出し、会話の実装方法も固定化した。 API Gateway Lambda LambdaCopyright © 2018 EXA CORPORATION
ボット本体の設計
ボット インテント コントローラー インテント フルフィルメント Bot API へのリクエスト処理のエントリーポイントになる。 DBに格納されている「会話の状態」や、「ユーザの発言」を元に実行するイ ンテントを決定する。 「ボット」から渡された「会話の状態」と「インテント」を使って、会話の 進行を制御する。 進行した「会話の状態」を DBへ保存する。 一つのインテントで行われる会話の内容を定義する。 ユーザの発言から必要なエンティティを抽出しバリデーションも行う。 フルフィルメントを実行するための処理も定義する システムの核となる機能を持つ。 インテントによって実行される。 インテントとフルフィルメントは 1対1になるとは限らない。付録
ボット インテント コントローラー インテント フルフィルメント インテントの決定・生成 コントローラーの生成 run(input)を実行 run(input)を実行 バリデーションと エンティティの抽出 応答メッセージと成否 executeFullfilment(entity)を実行 invoke(entity)を実行 成否 成否 会話状況の更新 応答メッセージと成否 インテント終了時
Copyright © 2018 EXA CORPORATION
DynamoDB バックアップ方法検討 1/3
※ 2018年11月現在 バックアップ 種類 メリット デメリット オンデマンド バックアップ ● Webインタフェース上で手軽にバックアップ が取れる ● バックアップ対象の読み込みキャパシティ を消費しない ● バックアップ処理は早い ● 自動化のための敷居が高い ○ Webインタフェース上では 1度きりのバック アップしか取れないため、 AWS CLIや各 種SDK経由で行うスクリプトを書いて実行 させる必要がある Data Pipeline による バックアップ ● 定期実行が可能 ● バックアップは S3上にファイルとして作られ るので取り回しが良い ● バックアップ処理が遅い ● 読み込みキャパシティを消費する ● Data Pipeline上で処理を定義する必要が あるため導入の敷居が少し高い Point In Time Recovery (PITR) ● 1秒単位でデータをバックアップして 35日間 分保存 ● 有効化するだけなので簡単 ● 35日分しか保存されない ● テーブルが削除されるとバックアップデータ もなくなる付録
DynamoDB バックアップ方法検討 2/3
PITR が手軽かつ強力
• 追加料金が発生するが、本プロジェクト程度の規模の場合であ
れば計算上は年間1ドルかからない
しかし...
テーブルが削除されるとバックアップデータがなくなって
しまう事を懸念
AWSサポートに連絡する事で、削除したテーブルのバックアップを復元する事も可能ではある https://forums.aws.amazon.com/thread.jspa?messageID=840798Copyright © 2018 EXA CORPORATION
DynamoDB バックアップ方法検討 3/3
• 本プロジェクトでは以下を併用する事とした
a. PITR
b. Data Pipelineにとるバックアップ
• 「1秒単位で復元ができ、万が一テーブル自体が削除
されても1日前には戻せる」事が可能に
• b. はバックアップ処理が遅いが毎日深夜に処理を実
行させる事で処理の遅さを許容
付録
PITR 設定方法
Copyright © 2018 EXA CORPORATION