20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング
-
Upload
- -
Category
Technology
-
view
3.489 -
download
4
Transcript of 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング
![Page 1: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/1.jpg)
Developer Day
#cmdevio2015C
クラスメソッドの AWSドッグフーディング
1
C-1
都元 ダイスケ, AWSコンサルティング部 クラスメソッド株式会社
Ⓒ Classmethod, Inc.
2015年03月29日
本セッションは長丁場です。お手洗いはお済みですか?
![Page 2: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/2.jpg)
#cmdevio2015C
自己紹介✦よく訓練されたアップル信者、都元です。 ✦Webアプリ屋出身のAWS屋 ✦AWS歴3.5年 ✦ @daisuke_m
✦人間CloudFormer
2Ⓒ Classmethod, Inc.
CloudFormationEC2S3
Glacier
ElasticMapReduce
AutoScaling
ELBCloudFront
RDS
DynamoDBElastiCache
RedShift
IAM
CloudWatch
Beanstalk
Data PipelineOpsWorks
CloudHSM
CloudSearch
SWF
SQS
SNSSES
ElasticTranscoder
Route53
VPCDirectConnect
StorageGateway
Mechanical Turk
CloudTrail
AppStream
Kinesis
![Page 3: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/3.jpg)
#cmdevio2015C
Do you know?
✦DBの進化的設計を実現する開発プロセス ✦要するにRailsのmigrationのような ✦現在のJavaでいうFlywayのような ✦EclipseプラグインによるER図エディタ
3Ⓒ Classmethod, Inc.
2006-2012Jiemamy
![Page 4: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/4.jpg)
#cmdevio2015C
DBの 進化的設計
Evolutional Database Design — Martin Fowler and Pramod Sadalage, 2003
http://www.objectclub.jp/community/XP-jp/xp_relate/evodb-jp
データベースリファクタリング
![Page 5: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/5.jpg)
#cmdevio2015C
Evolutional DB Design
✦実装前に設計を確定させるのは、もはや不可能 ✦DBの設計に関しても同様で、リファクタリングを適
用したい ✦しかし、DBはアーキテクチャの低層に位置している
ため、被依存度が高く、変更しづらい ✦どーする?
5Ⓒ Classmethod, Inc.
![Page 6: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/6.jpg)
#cmdevio2015C
not only refactoring
✦DB変更はrefactoringだけではない ✦テーブルやカラムの追加や削除
✦開発中のDBの変更履歴・構成管理
6Ⓒ Classmethod, Inc.
![Page 7: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/7.jpg)
#cmdevio2015C
アンケート✦システム開発をしている。 ✦システムの構成管理をしている。 ✦構成管理のおかげで、昔の状態がいつでも
呼び戻せるから安心である。このメリットは重要だ。 ✦昔の状態のシステムをいつでも動かせる。
✦昔の状態のシステムをいつでも動かせる...
✦昔の状態のシステムを今でも動かせる...!?7Ⓒ Classmethod, Inc.
![Page 8: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/8.jpg)
#cmdevio2015C
本当です?
✦あなたのシステムが例えばGitHubに置いてあります。
このアプリを無事に起動できますか?
✦過去のタグでも大丈夫ですか? ✦その時、DBも整備構築できますか?
8Ⓒ Classmethod, Inc.
![Page 9: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/9.jpg)
#cmdevio2015C
この問題の解決方法
✦原始的 → 文書化(Documented) ✦陳腐化しやすい。 ✦みんなドキュメントを書きたくない。 ✦エクセルは都市伝説。
✦モダン → 自動化(Automated) ✦DBの構築とスキーマのマイグレーションを自動化する。
9Ⓒ Classmethod, Inc.
![Page 10: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/10.jpg)
#cmdevio2015C
進化的設計Smart
VersionControl
SmartModel
SmartBuild
![Page 11: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/11.jpg)
#cmdevio2015C
あらためてJiemamy
✦ DB構成情報を1つに集約 (smart model) 「重要なことはファイルを扱うようにデータベースを扱えるツールを持つことだ。」 「スキーマとテストデータから成るデータベース」
✦ データファイルをVCS管理 (smart version control) 「マスターデータベースをソースコードと同様に構成管理の下に置くのである。」 「全システムを管理する強力な構成管理ツールの下にあれば、もし最悪の事態が起こっても元に戻すのは難しいことではない。」
✦ ビルドフェーズでDB整備 (smart build / deploy) 「すべての開発者のデータベースに変更を自動的に適用する」
11Ⓒ Classmethod, Inc.
~ツール面からDBの進化的設計をサポート~
![Page 12: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/12.jpg)
#cmdevio2015C
スマートモデル
12Ⓒ Classmethod, Inc.
database
tablecolumn
Java object SQL
Excel
class
![Page 13: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/13.jpg)
#cmdevio2015C
ってなことを訴え始めた2006年
✦あの頃の俺は青かった。
✦自動化の対象はDBの構築と管理じゃない。
✦DBを含む、インフラ全部だ。
13Ⓒ Classmethod, Inc.
![Page 14: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/14.jpg)
#cmdevio2015C
時は流れ、2013年…
✦世はまさに大クラウド時代! ✦AWSは全てがAPI! ✦Infrastructure as Code!
14Ⓒ Classmethod, Inc.
![Page 15: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/15.jpg)
#cmdevio2015C
–Miyamoto, Daisuke (2006)
“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、
コマンド1つで起動・デプロイができるべき”
2006年にここまで言ってたかどうか忘れましたが、 2008年には確実に言ってた。
この考えは現在も変わっていません。
スマートビルド / デプロイ
![Page 16: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/16.jpg)
#cmdevio2015C
Single Command DeployThoughtWorks, Inc. Technology Radar March 2012
16Ⓒ Classmethod, Inc.
![Page 17: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/17.jpg)
#cmdevio2015C
クラスメソッド メンバーズポータル (CMP)
17
![Page 18: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/18.jpg)
#cmdevio2015C
CMPとは✦ (1) 弊社サービス「メンバーズ」のお客様向けポータル
✦AWSご利用料金の確認と分析 ✦CloudTrailの集計結果確認 ✦ライセンス期限管理 ✦ etc
✦ (2) 社内向け業務システム ✦コンサルティング資料 ✦運用サポート情報管理 ✦請求書発行
18Ⓒ Classmethod, Inc.
✦ (3) AWS実験場 ✦AWS実運用経験の場 ✦CloudFormation ✦Elastic Beanstalk ✦Elastic MapReduce ✦ IAM
![Page 19: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/19.jpg)
#cmdevio2015C
CMPのテーマ(本日のagenda)
✦完全AWSネイティブ ✦ Java 8 + Spring Framework ✦ Single Command Deployとシステム ポータビリティ ✦ APIファースト
19Ⓒ Classmethod, Inc.
![Page 20: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/20.jpg)
#cmdevio2015C
完全AWSネイティブ
20
![Page 21: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/21.jpg)
#cmdevio2015C
完全AWSネイティブとは✦AWSの哲学・推奨に従う ✦実装の都合を一方的に押し付けない
✦問題をアプリで解決するか、インフラで解決するか? ✦アプリとインフラで戦わない。都度最適解を追求する。 ✦CMPでは、どっちも自分ですねん。
✦AWSに寄り添う
21Ⓒ Classmethod, Inc.
![Page 22: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/22.jpg)
#cmdevio2015C
ネットワーク構成
22Ⓒ Classmethod, Inc.
VPC 10.x.0.0/16
AZ-α ap-northeast-1a
AZ-β ap-northeast-1c
Frontendfor ELBs and Bastion 10.x.0.0/24 10.x.1.0/24
Applicationfor App Servers 10.x.10.0/24 10.x.11.0/24
Datastore for RDS 10.x.50.0/24 10.x.51.0/24
参考: 【AWS】VPC環境構築ノウハウ社内資料 2014年4月版 http://dev.classmethod.jp/cloud/aws/vpc-knowhow-2014-04/
3-Tier × 2-AZs = 6 subnets
![Page 23: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/23.jpg)
#cmdevio2015C
Multi-AZの「効果」と「パターン」✦Availability(可用性)とScalability(拡張性) ✦Design for failure(障害を見越した設計) ✦WebパターンとWorkerパターン
23Ⓒ Classmethod, Inc.
Web Server
Worker Server
![Page 24: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/24.jpg)
#cmdevio2015C
Webサーバ構成✦もちろんMulti-AZのWebパターン ✦現在2つの構成が並走中
✦レガシー構成(シュリンク方針) ✦Webサーバ内でHTMLを合成して返すアレ ✦ JSONを吐くAPIとしても機能する ✦所謂SSKDs向けAPI
✦完全静的フロント+API構成(鋭意構築中) ✦静的JSクライアントアプリ ✦ひたすらJSONを吐く箱 ✦所謂LSUDs向けAPI
24Ⓒ Classmethod, Inc.
![Page 25: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/25.jpg)
#cmdevio2015C
Workerサーバ構成✦もちろんMulti-AZのWorkerパターン ✦要するにProducer & Consumer ✦非同期処理を担う
✦各種締め処理 ✦バルクメール送信 ✦レポーティング
✦各種サーバがSQSにJSONを投入
25Ⓒ Classmethod, Inc.
![Page 26: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/26.jpg)
#cmdevio2015C
Beanstalk Worker Tier✦Beanstalkは「Webパターン」だけではない ✦「Workerパターン」のデプロイも可能 ✦(下図は再掲)
26Ⓒ Classmethod, Inc.
Web Tier Worker Tier
![Page 27: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/27.jpg)
#cmdevio2015C
aws-sqsd✦WorkerはHTTPサーバとして実装!
27Ⓒ Classmethod, Inc.
![Page 28: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/28.jpg)
#cmdevio2015C
ジョブスケジューラ✦遅延処理や定時処理
✦処理の開始トリガーがHTTPリクエストではない
✦このような処理を担うバッチサーバの実装 ✦cron? Multi-AZは?
✦Availability = AZ障害で片側がダウンしたら? ✦Scalability = トリガ数が想像以上に増えたら…? (※)
28Ⓒ Classmethod, Inc.
※ … そういうことはあまり有りませんが、設計癖として意識したい
![Page 29: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/29.jpg)
#cmdevio2015C
Amazon Elastic Job-Scheduler Service
✦cron expressionでスケジュールを登録 ✦SNSトピックを指定
✦スケジュールに従って、SNSにJSONをpublish
29Ⓒ Classmethod, Inc.
すると
![Page 30: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/30.jpg)
#cmdevio2015C
Amazon Elastic Job-Scheduler Service
✦cron expressionでスケジュールを登録 ✦SNSトピックを指定
✦スケジュールに従って、SNSにJSONをpublish
30Ⓒ Classmethod, Inc.
するとリリース
マダァ?
![Page 31: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/31.jpg)
#cmdevio2015C
無いので作ったBrian✦ のラッパー
✦ Javaで書かれたジョブスケジューラ(OSS) ✦Multi-AZ分散するが、RDBを利用して同期。多重発火を回避。
✦SNSトピックを登録しておく ✦ジョブ定義をRESTful API経由で登録 ✦Beanstalk Web-Tier Internal ELBでの利用推奨
✦認証機構とか作って無いもんで。まぁ内部でしか使わないよね。
31Ⓒ Classmethod, Inc.
https://github.com/classmethod-aws/brian http://bit.ly/brian-0_14-demo
![Page 32: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/32.jpg)
#cmdevio2015C
http://bit.ly/aws-worker-sqshttp://bit.ly/aws-worker-beanstalkhttp://bit.ly/aws-worker-brian
Developers.IO Job Worker 三部作
![Page 33: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/33.jpg)
#cmdevio2015C
ここまでのまとめ
33Ⓒ Classmethod, Inc.
![Page 34: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/34.jpg)
#cmdevio2015C
CMPにおけるAWS利用データ分析✦AWSはAWSの利用実績とその費用を、詳細なCSVと
して提供しています。(Detailed Billing Report) ✦CMPはそのデータを様々な角度から分析し、お客様に
コスト削減のご提案等に役立てています。
34Ⓒ Classmethod, Inc.
![Page 35: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/35.jpg)
#cmdevio2015C
詳細なCSV(Detailed Billing Report)✦要するに、毎月数GBオーダーのCSVが1日数回… ✦当初、このCSVをそのままRDSにインポート
✦GROUP BYクエリ等で表示していたが、重すぎ
✦オレオレMaterialized View…にも限界が ✦ 「1年で10倍成長します」
✦ .oO( 1年後は数十GBオーダーのCSVか… )
✦よろしい、ならばEMRだ。
35Ⓒ Classmethod, Inc.
![Page 36: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/36.jpg)
#cmdevio2015C
EMR バックグラウンドJob✦集計ジョブ
✦Brianにより定期的にジョブキック ✦AWSにより新しいDBRが届いていれば ✦EMRクラスタを立ち上げてHiveステップを登録
✦もちろんSpotインスタンス♡ ✦取り込みジョブトリガをBrianに登録(30分後~5分毎)
✦取り込みジョブ ✦Hiveステップが終わっていなければ終了 ✦終わっていれば、S3に吐かれた集計結果をRDSにインポート ✦Brianから「自分自身を起動したトリガ」を削除
36Ⓒ Classmethod, Inc.
![Page 37: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/37.jpg)
#cmdevio2015C
その他、細かいTips✦SNS - OperationNotificationTopic を作って活用する
✦運用情報の通知(AutoScalingの増減やヘルスチェックの結果等) ✦想定外の挙動やバグ疑いの通知。 ✦このようなものを受け取るのにSESは使わない。SNSが最適。
✦CloudWatch - Alarmを定義する ✦RDS の FreeStorageSpace
✦ディスクが有限であるかぎり、DiskFullのリスクは消えない ✦SQS の NumberOfMessagesPublished
✦Brianを利用する場合、メッセージが無いのはおかしい ✦SQS の ApproximateNumberOfMessagesVisible
✦溜まるということはWorkerのバグか、キャパ不足
37Ⓒ Classmethod, Inc.
![Page 38: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/38.jpg)
#cmdevio2015C
と、いう構成全体定義
✦CloudFormationテンプレート ✦1761行(3/24現在)
✦一部の例外を除き、手ではAWSリソースを作らない ✦例外については後述
38Ⓒ Classmethod, Inc.
![Page 39: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/39.jpg)
#cmdevio2015C
![Page 40: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/40.jpg)
#cmdevio2015C
CloudFormationテンプレート構成戦略✦モノリシック派
✦完全一枚岩派 ✦ sub-stackコール派
40Ⓒ Classmethod, Inc.
← 今回はこっち →
Network
Web
ELB
DNS
DB
Web Web
ELB ELB
DNS DNS
DB DB
✦レイヤ分割派 ✦Network / DB / Web / DNS 分割派 ✦静的レイヤ + 動的レイヤ分割派
DNS DNS DNS
Web
ELB
Web Web
ELB ELB
Network
DBDB DB
![Page 41: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/41.jpg)
#cmdevio2015C
モノリシック派
✦pros ✦CFnの「スタック」という概念に寄り添っている(と思う) ✦テンプレート間のパラメータ繋ぎ込みの仕組みが不要
✦cons ✦update時、意図しない範囲に影響が波及してしまう恐れ
41Ⓒ Classmethod, Inc.
![Page 42: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/42.jpg)
#cmdevio2015C
CloudFormation Tips✦EnvironmentTypeパラメータ
✦ local (ローカル起動用) ✦VPC, SQS, SNS, S3等。インスタンス系はなし。
✦development / production ✦RDS: Single/Multi-AZ、ストレージサイズ、バックアップ期間 ✦AutoScaling: 1台/複数台 ✦DeepSecurity: 有/無
✦CIDRPrefixパラメータ ✦VPC / Subnet のIPアドレスレンジを決定 ✦複数環境にあたって、IPアドレス帯域の重複排除 ✦重複排除は必須ではないが、VPC peeringの可能性を残す
42Ⓒ Classmethod, Inc.
![Page 43: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/43.jpg)
#cmdevio2015C
Java 8 + Spring Framework
43
![Page 44: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/44.jpg)
#cmdevio2015C
Javaは死んでいない
![Page 45: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/45.jpg)
#cmdevio2015C
プロジェクト構成✦api: ドメインモデル・DB定義等 ✦batch: バッチJob実装 ✦worker: aws-sqsdからのメッセージに応じて
バッチJobを実行する小さなWebアプリ(6クラス) ✦webapi: JSON RESTful API(後述) ✦webclient: 静的JSクライアント(非Java、後述) ✦website: レガシーWebアプリ(シュリンク)
45Ⓒ Classmethod, Inc.
![Page 46: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/46.jpg)
#cmdevio2015C
依存ダイアグラム
46Ⓒ Classmethod, Inc.
![Page 47: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/47.jpg)
#cmdevio2015C
DDD ~ Domain Driven Design✦Ubiquitous Language ✦Layered Architecture ✦Entity / Value Object ✦Repository / Service ✦全フォローではなく、実装論だけ部分的に活用 ✦ 参考: 20110409_DevLOVE「Building Blocks」_都元ダイスケ
https://www.youtube.com/watch?v=FNEfk-dlIKU ✦ 参考: DevLOVE Beautiful Development - 第一幕 陽の巻
http://www.slideshare.net/daisuke_m/devlove-beautiful-development
47Ⓒ Classmethod, Inc.
![Page 48: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/48.jpg)
#cmdevio2015C
Spring Data✦DDDのリポジトリパターンの実装フレームワーク ✦RDB用にはJPA実装。その他、MongoDBやRedis、
Neo4j等、様々なデータストアに対する実装がある。 ✦Mirage SQL
✦ 参考: Mirage SQL ~ 2WaySQLをつかうデータアクセスライブラリ for Java
http://dev.classmethod.jp/server-side/java/mirage-sql-for-java/
✦Spring Data Mirage ✦ 参考: Spring環境におけるDBアクセス(2) ~ Spring Data篇
http://dev.classmethod.jp/server-side/java/db-access-in-spring-data-mirage/
48Ⓒ Classmethod, Inc.
![Page 49: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/49.jpg)
#cmdevio2015C
最近のJavaフレームワーク✦Play Framework ✦Dropwizard ✦Ninja framework ✦Spring Boot
✦アプリケーションサーバ(コンテナ)準備不要の、スタンドアローンアプリ。
✦ Javaプロセスを1つ立ち上げればHTTPサーバが動く。
49Ⓒ Classmethod, Inc.
![Page 50: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/50.jpg)
#cmdevio2015C
![Page 51: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/51.jpg)
#cmdevio2015C
1プロセスのための環境 ~ Docker✦最近のJavaフレームワークはDockerと相性が良い ✦Elastic BeanstalkもDockerをサポート
✦3日前にマルチコンテナもサポート開始!?
✦C-3「アプリケーションコンテナとAWSの話(仮)」 ✦詳しくは、大瀧プロのセッションにご期待ください。
51Ⓒ Classmethod, Inc.
![Page 52: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/52.jpg)
#cmdevio2015C
Dockerfile 例FROM dockerfile/java:oracle-java8EXPOSE 8080WORKDIR /opt/portnoy-webapi/ADD logback.xml /opt/portnoy-webapi/logback.xmlADD portnoy-webapi-1.37.jar /opt/portnoy-webapi/CMD /usr/bin/java \ -DJDBC_CONNECTION_STRING=$JDBC_CONNECTION_STRING \ ... -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE \ -Dlogging.config=/opt/portnoy-webapi/logback.xml \ -Dserver.port=8080 \ -jar portnoy-webapi-1.37.jar
52Ⓒ Classmethod, Inc.
![Page 53: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/53.jpg)
#cmdevio2015C
![Page 54: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/54.jpg)
#cmdevio2015C
Beanstalk Application Bundle✦アプリケーション一式を含むZIPファイル
✦Spring Bootアプリケーション(jar) ✦ logback.xml (ログ設定ファイル) ✦Dockerfile
✦これをS3にアップロード ✦bucket: elasticbeanstalk-$region-$accountid
✦ key: eb-apps/portnoy-webapi-$version.zip
✦CloudFormationパラメータに $version を与えれば
Elastic Beanstalkの環境が定義できる54Ⓒ Classmethod, Inc.
![Page 55: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/55.jpg)
#cmdevio2015C
SQS と Spring Batch✦SQSの at least once delivery ✦冪等ジョブ or 二重実行制御 ✦全ジョブを冪等にはしづらい(メール送信とか) ✦同じジョブパラメータのジョブは複数回起動出来ない
55Ⓒ Classmethod, Inc.
JobExecutionAlreadyRunningException JobInstanceAlreadyCompleteException
相性抜群
![Page 56: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/56.jpg)
#cmdevio2015C
Single Command Deploy と
システムポータビリティ
56
![Page 57: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/57.jpg)
#cmdevio2015C
–Miyamoto, Daisuke (2006)
“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、
コマンド1つで起動・デプロイができるべき”
(再掲)
![Page 58: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/58.jpg)
#cmdevio2015C
Gradle✦Groovyベースのビルドスクリプト ✦ Javaの依存ライブラリ管理 ~ ビルド・パッケージ
✦標準機能で実現可能。
✦Spring Bootアプリケーションの起動 ✦プラグイン: spring-boot-grade-plugin
✦DBの初期構築とマイグレーション ✦プラグイン: flyway-gradle-plugin(次のスライドにて)
✦Bastionを介したSSHトンネリング(DB / Brian操作) ✦プラグイン: sshoogr-gradle
58Ⓒ Classmethod, Inc.
![Page 59: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/59.jpg)
#cmdevio2015C
Flyway ~ DBの進化的設計✦ Jiemamy is dead
✦スキーマにバージョンを付与 ✦前バージョンからの差分SQLを作成 ✦どこまで適用したかは、実際のDB上で管理 ✦未適用の差分SQLを順次適用することにより最新に ✦ただし、自動化されたロールバックは不可能
✦スキーマを1から構築し直すため、データを維持できない。59Ⓒ Classmethod, Inc.
![Page 60: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/60.jpg)
#cmdevio2015C
![Page 61: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/61.jpg)
#cmdevio2015C
gradle-aws-plugin✦GradleからAWSリソースを操作したい
✦CloudFormationスタックの Create / Update ✦S3バケットへのオブジェクト Upload
✦Beanstalk Application Bundle ✦Hive Script ✦portnoy-webclient
✦無いから作った ✦ 参考: https://github.com/classmethod-aws/gradle-aws-plugin
61Ⓒ Classmethod, Inc.
![Page 62: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/62.jpg)
#cmdevio2015C
CloudFormationスタック操作cloudFormation { templateFile project.file('portnoy.template') templateBucket ... templateKeyPrefix ... stackName ... conventionMapping.stackParams = { // 別タスクがアップロードしたBeanstalk Application Bundleを // 探してstackParamsに設定 return stackParams } capabilityIam true } awsCfnMigrateStack.mustRunAfter \ ':portnoy-worker:uploadBundle', \ ':portnoy-website:uploadBundle', \ ':portnoy-webapi:uploadBundle'
62Ⓒ Classmethod, Inc.
![Page 63: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/63.jpg)
#cmdevio2015C
S3へのリソースアップロードtask uploadBundle(dependsOn: createBundle, type: jp.classmethod.aws.gradle.s3.AmazonS3FileUploadTask) { String timestamp = new Date() .format("yyyyMMdd'_'HHmmss", TimeZone.default) bucketName "elasticbeanstalk-${region}-${accountId}" key "eb-apps/${artifactId}-${version}-${timestamp}.zip" file project.createBundle.archivePath overwrite project.version.endsWith('-SNAPSHOT')} task syncS3Resources(dependsOn: awsCfnWaitStackComplete type: jp.classmethod.aws.gradle.s3.SyncTask) { conventionMapping.bucketName ={ getCfnPhysicalResourceId('EMRBucket') } prefix 'resources/' source file("emrbucket-resources") }
63Ⓒ Classmethod, Inc.
![Page 64: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/64.jpg)
#cmdevio2015C
Gradle Task Graph
64Ⓒ Classmethod, Inc.
![Page 65: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/65.jpg)
#cmdevio2015C
その他タスク
✦ ./gradlew :portnoy-webapi:bootRun
✦ ./gradlew flywayMigrate
✦ ./gradlew remoteFlywayMigrate
✦ ./gradlew awsFullUndeploy
65Ⓒ Classmethod, Inc.
![Page 66: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/66.jpg)
#cmdevio2015C
システム ポータビリティ
✦ ビルドとデプロイの自動化
―― Automated ✦ 自動化しない部分はポエム(文書)を書く
―― Documented ✦ つまり、システムの全てが記述されている
―― Full Described
66Ⓒ Classmethod, Inc.
![Page 67: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/67.jpg)
#cmdevio2015C
AWSにおけるシスポタ✦1つのAWSアカウント内に複数の環境を構築できる。
✦例えば本番環境と開発環境等。 ✦ 社内で共通のAWSアカウントに展開する。
✦あらゆるAWSアカウントに環境を構築できる。 ✦例えば個人検証環境。サンドボックス。 ✦ 開発者毎の個人検証用AWSアカウントに展開する。
✦あらゆるリージョンに環境を構築できる。 ✦と、いいかもね。
67Ⓒ Classmethod, Inc.
![Page 68: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/68.jpg)
#cmdevio2015C
環境固有設定オプション -Penv=prd✦env/
✦ .gititnore ✦ _sample.gradle ✦prd.gradle ✦dev.gradle ✦personal.gradle
68Ⓒ Classmethod, Inc.
✦AWSアカウントID ✦profile名(アクセスキー) ✦リージョン名 ✦EC2キーファイルのパス ✦各種CFnパラメータ ✦ローカルDB名、user、pass ✦ログ設定ファイルのパス
apply from: file("env/${env}.gradle")
![Page 69: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/69.jpg)
#cmdevio2015C
CloudFormation Tips✦アプリケーションで利用するAWSリソース名等
✦S3バケット名、SQSキューURL、SNSトピックARN ✦DynamoDBテーブル名、SubnetID、EnvironmentType ✦RDBホスト名とポート番号、ユーザ名、パスワード
✦これらはCFnパラメータや、CFnリソースとして確定 ✦アプリケーション起動パラメータとして
Beanstalkアプリケーションに渡す ✦これらの値はDockerfile内で参照可能
69Ⓒ Classmethod, Inc.
![Page 70: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/70.jpg)
#cmdevio2015C
CloudFormation Tips✦S3バケットはDeletionPolicyをRetainに ✦DBSnapshotNameパラメータ
✦通常は空欄 ✦特定のスナップショットから環境を復元する
✦HostedZoneIDとHostedZoneName ✦内部で各種リソースに名前をつける ✦RDSやCloudFrontにCNAME ✦Bastionにホスト名
70Ⓒ Classmethod, Inc.
参考: CloudFormationで作成するリソースにはRoute 53で独自DNS名を付けよ http://dev.classmethod.jp/cloud/aws/cloudformation-resources-with-route-53/
![Page 71: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/71.jpg)
#cmdevio2015C
CFnで定義できないもの
✦EC2キーペア ✦ IAMサーバ証明書
✦それぞれ事前に作成、アップロード ✦そのリソースIDをCFnパラメータに指定
71Ⓒ Classmethod, Inc.
![Page 72: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/72.jpg)
#cmdevio2015C
Get system portability
✦ ./gradlew awsFullDeploy -Penv=prd
✦ ./gradlew awsFullDeploy -Penv=dev
✦ ./gradlew awsFullDeploy -Penv=personal
72Ⓒ Classmethod, Inc.
![Page 73: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/73.jpg)
#cmdevio2015C
APIファースト
73
![Page 74: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/74.jpg)
#cmdevio2015C
全ての機能はAPIを介して提供
✦全ての提供機能にAPIを用意する。 ✦要するにAWSの真似です。 ✦どうしたらみんなに使ってもらえるか?
✦RESTful JSON API ✦実装はSpring MVC ✦特筆事項は特に無し。普通に書いてます。
74Ⓒ Classmethod, Inc.
![Page 75: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/75.jpg)
#cmdevio2015C
HATEOAS
✦Hypermedia as the Engine of Application State ✦へいとーす
✦要するに、HTMLってindexがあってそこからリンクを
辿ってあちこちを参照するよね! ✦ JSONもindexがあって、リンクを辿れるべきでは?
75Ⓒ Classmethod, Inc.
![Page 76: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/76.jpg)
#cmdevio2015C
Understanding HATEOAS✦https://spring.io/understanding/HATEOAS
76Ⓒ Classmethod, Inc.
![Page 77: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/77.jpg)
#cmdevio2015C
✦クライアント
システムに対する
情報提供を意図
✦とは言え、
人間にもやさしい
77Ⓒ Classmethod, Inc.
![Page 78: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/78.jpg)
#cmdevio2015C
Spring HATEOAS✦Spring MVCの拡張。 ✦HATEOASの考えに則った、リンク等を扱える。 ✦http://projects.spring.io/spring-hateoas/
78Ⓒ Classmethod, Inc.
![Page 79: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/79.jpg)
#cmdevio2015C
HAL✦Hypertext Application Language ✦http://stateless.co/hal_specification.html ✦HATEOASの具体的な仕様の一つ ✦Spring HATEOAS
でもサポートがある
79Ⓒ Classmethod, Inc.
![Page 80: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/80.jpg)
#cmdevio2015C80Ⓒ Classmethod, Inc.
{ "page": { "size": 10, "totalElements": 22, "totalPages": 3, "number": 0 }, "_links": { "self": { "href": "/orgs" }, "next": { "href": "/orgs?page=2" } }, "_embedded": { "organizationList": [ { "id": 1, "code": "classmethod", "name": "クラスメソッド株式会社",
"_links": { "self": { "href": "https://cmapi.net/orgs/1" } } }, { "id": 2, "code": "annotation", "name": "アノテーション株式会社",
"_links": { "self": { "href": "https://cmapi.net/orgs/2" } } }, { "id": 3, "code": "underscore", "name": "アンダースコア株式会社",
"_links": { "self": { "href": "https://cmapi.net/orgs/3" } } }, ... ] } }
例えば集合リソースのHAL表現
![Page 81: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/81.jpg)
#cmdevio2015C
よくある RESTful API (1)
81Ⓒ Classmethod, Inc.
https://example.com /orgs/1 /projects/1 /aws-accounts/xxxx /addresses/142
![Page 82: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/82.jpg)
#cmdevio2015C
よくあるRESTful API (2)
82Ⓒ Classmethod, Inc.
https://example.com/orgs/1
![Page 83: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/83.jpg)
#cmdevio2015C
LSUDs向けAPIの問題点
✦「To: ${billing-to}
${organization-name} ご担当者さま」
✦1ページ表示あたりのAPIコール数が多くなりがち
83Ⓒ Classmethod, Inc.
![Page 84: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/84.jpg)
#cmdevio2015C
embedded resourceの活用
✦主軸オブジェクトに
関連オブジェクトを
埋め込める!
84Ⓒ Classmethod, Inc.
https://example.com /orgs/1 /projects/1 /aws-accounts/xxx /addresses/142 ?embed=organization
![Page 85: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/85.jpg)
#cmdevio2015C
![Page 86: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/86.jpg)
#cmdevio2015C
CMP-APIのクライアントとしてのUI✦portnoy-webclient ✦完全静的JSクライアント ✦CMP-APIを、CORSを使って叩く。 ✦認証は、OAuth 2.0。
✦Resource owner password grant
✦MiddlemanとAngularJSで実装中 ✦私が実装してるンじゃないので、実は詳しく語れないw
86Ⓒ Classmethod, Inc.
![Page 87: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/87.jpg)
#cmdevio2015C
![Page 88: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/88.jpg)
#cmdevio2015C
![Page 89: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/89.jpg)
#cmdevio2015C
更新系APIの形✦HATEOASやHALでも、更新系の定義は緩い ✦Read = GET は普通ですね ✦Create = POST はわかりやすい ✦Delete = DELETE もわかりやすい…? ✦Update
✦更新しないプロパティも含めて PUT すべき? ✦更新するプロパティのみを PATCH すべき?
89Ⓒ Classmethod, Inc.
![Page 90: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/90.jpg)
#cmdevio2015C
時事ネタ
90Ⓒ Classmethod, Inc.
![Page 91: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/91.jpg)
#cmdevio2015C
この辺、非常に面白いんですが
✦シンプルな結論は出ないんでその場その場で考えます。
✦普通にDELETEを用意することもあるし ✦PUTで全プロパティアップデートさせるのもアリ ✦PATCHで部分アップデートも必要に応じて ✦そして…
91Ⓒ Classmethod, Inc.
![Page 92: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/92.jpg)
#cmdevio2015C
REST without PUT✦「リソース」それ自身の「削除(DELETE)」や
「アップデート(PUT)」などというものは存在しない。 ✦「リソース削除・更新イベントリソース」の
「作成(POST)」があるだけだ。
✦という悟りの世界も、場合によっては有効。 ✦結論、安易にどこか1つには寄せない。
92Ⓒ Classmethod, Inc.
![Page 93: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/93.jpg)
#cmdevio2015C
![Page 94: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/94.jpg)
#cmdevio2015C
APIドキュメント
✦利用者によるAPIの理解はAutomated出来ない。 ✦よろしい、ならばDocumentedだ。 ✦というか、Automated Documentationだ。
94Ⓒ Classmethod, Inc.
![Page 95: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/95.jpg)
#cmdevio2015C
Swagger✦API仕様記述言語(JSONベース)
✦Swagger仕様ドキュメント
✦これを中心に、SDKやドキュメントの自動生成 ✦あれ、どこかで聞いたような…
✦そもそもSwagger仕様ドキュメントをどう作る? ✦コードに触れないなら自分でコリコリ書くしかない。 ✦コードを解析してSwagger仕様ドキュメントを自動生成。 ✦Swagger Spring MVC
✦https://github.com/springfox/springfox95Ⓒ Classmethod, Inc.
![Page 96: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/96.jpg)
#cmdevio2015C
Swagger UI✦Swagger仕様ドキュメントを元に
APIドキュメントページのWeb UIを生成する。
96Ⓒ Classmethod, Inc.
![Page 97: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/97.jpg)
#cmdevio2015C
Swagger UI からAPIを叩く✦認証して
✦パラメータ
入れて
✦Try it out!
97Ⓒ Classmethod, Inc.
![Page 98: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/98.jpg)
#cmdevio2015C
結果
98Ⓒ Classmethod, Inc.
![Page 99: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/99.jpg)
#cmdevio2015C
![Page 100: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/100.jpg)
#cmdevio2015C
aurl in Go-lang✦劣化 当面不要な機能を削ぎ落したシンプルな curl
✦OAuth 2.0 の認証フローとトークン管理を実装 ✦AWS CLI風に、複数のアカウントをprofileとして管理
✦それ以外は、curl 以上のものを実装しない方針
✦インストール ✦ brew tap classmethod-aws/cm
✦ brew install aurl
✦実行
✦ aurl get http://example.com | jq .
100Ⓒ Classmethod, Inc.
参考: https://github.com/classmethod-aws/aurl
![Page 101: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/101.jpg)
#cmdevio2015C
![Page 102: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/102.jpg)
#cmdevio2015C
APIファーストの結果✦弊社スタッフに
✦CMP-API と ✦Swagger UIのドキュメント と ✦ aurl を配布したら…
✦恐ろしい勢いで業務効率化ハックが始まった。 ✦Swagger UI と HATEOAS のリンクの影響か、
みんな自然にAPIを理解して普通に使ってくれる。
102Ⓒ Classmethod, Inc.
![Page 103: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/103.jpg)
#cmdevio2015C
CMPの技術的な未来
103
![Page 104: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/104.jpg)
#cmdevio2015C
出来てない事はまだまだ多い
✦CIツールによる自動デプロイ ✦Blue-Green Deployment ✦各種ログの管理と活用 ✦Spring Loaded突っ込みたい ✦Lombok突っ込みたい ✦TOTPによる多要素認証
104Ⓒ Classmethod, Inc.
![Page 105: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング](https://reader031.fdocuments.net/reader031/viewer/2022012922/55a591d41a28abd12c8b463f/html5/thumbnails/105.jpg)
Developer Day
#cmdevio2015C
クラスメソッドのAWSドッグフーディング・まとめ
105
C-1
Ⓒ Classmethod, Inc.
✦ 完全AWSネイティブ ✦ Java 8 + Spring Framework ✦ Single Command Deployとシステムポータビリティ(Full Described)
✦ APIファースト