105
Developer Day #cmdevio2015C クラスメソッドの AWSドッグフーディング 1 C-1 都元 ダイスケ, AWSコンサルティング部 クラスメソッド株式会社 Ⓒ Classmethod, Inc. 2015年03月29日 本セッションは長丁場です。お手洗いはお済みですか?

20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

  • Upload
    -

  • View
    3.489

  • Download
    4

Embed Size (px)

Citation preview

Page 1: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

Developer Day

#cmdevio2015C

クラスメソッドの AWSドッグフーディング

1

C-1

都元 ダイスケ, AWSコンサルティング部 クラスメソッド株式会社

Ⓒ Classmethod, Inc.

2015年03月29日

本セッションは長丁場です。お手洗いはお済みですか?

Page 2: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Evolutional DB Design

✦実装前に設計を確定させるのは、もはや不可能 ✦DBの設計に関しても同様で、リファクタリングを適

用したい ✦しかし、DBはアーキテクチャの低層に位置している

ため、被依存度が高く、変更しづらい ✦どーする?

5Ⓒ Classmethod, Inc.

Page 6: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

not only refactoring

✦DB変更はrefactoringだけではない ✦テーブルやカラムの追加や削除

✦開発中のDBの変更履歴・構成管理

6Ⓒ Classmethod, Inc.

Page 7: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

アンケート✦システム開発をしている。 ✦システムの構成管理をしている。 ✦構成管理のおかげで、昔の状態がいつでも

呼び戻せるから安心である。このメリットは重要だ。 ✦昔の状態のシステムをいつでも動かせる。

✦昔の状態のシステムをいつでも動かせる...

✦昔の状態のシステムを今でも動かせる...!?7Ⓒ Classmethod, Inc.

Page 8: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

本当です?

✦あなたのシステムが例えばGitHubに置いてあります。

このアプリを無事に起動できますか?

✦過去のタグでも大丈夫ですか? ✦その時、DBも整備構築できますか?

8Ⓒ Classmethod, Inc.

Page 9: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

この問題の解決方法

✦原始的 → 文書化(Documented) ✦陳腐化しやすい。 ✦みんなドキュメントを書きたくない。 ✦エクセルは都市伝説。

✦モダン → 自動化(Automated) ✦DBの構築とスキーマのマイグレーションを自動化する。

9Ⓒ Classmethod, Inc.

Page 10: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

進化的設計Smart

VersionControl

SmartModel

SmartBuild

Page 11: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

スマートモデル

12Ⓒ Classmethod, Inc.

database

tablecolumn

Java object SQL

Excel

class

Page 13: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

ってなことを訴え始めた2006年

✦あの頃の俺は青かった。

✦自動化の対象はDBの構築と管理じゃない。

✦DBを含む、インフラ全部だ。

13Ⓒ Classmethod, Inc.

Page 14: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

時は流れ、2013年…

✦世はまさに大クラウド時代! ✦AWSは全てがAPI! ✦Infrastructure as Code!

14Ⓒ Classmethod, Inc.

Page 15: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

–Miyamoto, Daisuke (2006)

“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、

コマンド1つで起動・デプロイができるべき”

2006年にここまで言ってたかどうか忘れましたが、 2008年には確実に言ってた。

この考えは現在も変わっていません。

スマートビルド / デプロイ

Page 16: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Single Command DeployThoughtWorks, Inc. Technology Radar March 2012

16Ⓒ Classmethod, Inc.

Page 17: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

クラスメソッド メンバーズポータル (CMP)

17

Page 18: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

CMPのテーマ(本日のagenda)

✦完全AWSネイティブ ✦ Java 8 + Spring Framework ✦ Single Command Deployとシステム ポータビリティ ✦ APIファースト

19Ⓒ Classmethod, Inc.

Page 20: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

完全AWSネイティブ

20

Page 21: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

完全AWSネイティブとは✦AWSの哲学・推奨に従う ✦実装の都合を一方的に押し付けない

✦問題をアプリで解決するか、インフラで解決するか? ✦アプリとインフラで戦わない。都度最適解を追求する。 ✦CMPでは、どっちも自分ですねん。

✦AWSに寄り添う

21Ⓒ Classmethod, Inc.

Page 22: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Workerサーバ構成✦もちろんMulti-AZのWorkerパターン ✦要するにProducer & Consumer ✦非同期処理を担う

✦各種締め処理 ✦バルクメール送信 ✦レポーティング

✦各種サーバがSQSにJSONを投入

25Ⓒ Classmethod, Inc.

Page 26: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Beanstalk Worker Tier✦Beanstalkは「Webパターン」だけではない ✦「Workerパターン」のデプロイも可能 ✦(下図は再掲)

26Ⓒ Classmethod, Inc.

Web Tier Worker Tier

Page 27: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

aws-sqsd✦WorkerはHTTPサーバとして実装!

27Ⓒ Classmethod, Inc.

Page 28: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

ジョブスケジューラ✦遅延処理や定時処理

✦処理の開始トリガーがHTTPリクエストではない

✦このような処理を担うバッチサーバの実装 ✦cron? Multi-AZは?

✦Availability = AZ障害で片側がダウンしたら? ✦Scalability = トリガ数が想像以上に増えたら…? (※)

28Ⓒ Classmethod, Inc.

※ … そういうことはあまり有りませんが、設計癖として意識したい

Page 29: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Amazon Elastic Job-Scheduler Service

✦cron expressionでスケジュールを登録 ✦SNSトピックを指定

✦スケジュールに従って、SNSにJSONをpublish

29Ⓒ Classmethod, Inc.

すると

Page 30: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Amazon Elastic Job-Scheduler Service

✦cron expressionでスケジュールを登録 ✦SNSトピックを指定

✦スケジュールに従って、SNSにJSONをpublish

30Ⓒ Classmethod, Inc.

するとリリース

マダァ?

Page 31: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

ここまでのまとめ

33Ⓒ Classmethod, Inc.

Page 34: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

CMPにおけるAWS利用データ分析✦AWSはAWSの利用実績とその費用を、詳細なCSVと

して提供しています。(Detailed Billing Report) ✦CMPはそのデータを様々な角度から分析し、お客様に

コスト削減のご提案等に役立てています。

34Ⓒ Classmethod, Inc.

Page 35: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

と、いう構成全体定義

✦CloudFormationテンプレート ✦1761行(3/24現在)

✦一部の例外を除き、手ではAWSリソースを作らない ✦例外については後述

38Ⓒ Classmethod, Inc.

Page 39: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Page 40: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

モノリシック派

✦pros ✦CFnの「スタック」という概念に寄り添っている(と思う) ✦テンプレート間のパラメータ繋ぎ込みの仕組みが不要

✦cons ✦update時、意図しない範囲に影響が波及してしまう恐れ

41Ⓒ Classmethod, Inc.

Page 42: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Java 8 + Spring Framework

43

Page 44: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Javaは死んでいない

Page 45: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

依存ダイアグラム

46Ⓒ Classmethod, Inc.

Page 47: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

最近のJavaフレームワーク✦Play Framework ✦Dropwizard ✦Ninja framework ✦Spring Boot

✦アプリケーションサーバ(コンテナ)準備不要の、スタンドアローンアプリ。

✦ Javaプロセスを1つ立ち上げればHTTPサーバが動く。

49Ⓒ Classmethod, Inc.

Page 50: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Page 51: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

1プロセスのための環境 ~ Docker✦最近のJavaフレームワークはDockerと相性が良い ✦Elastic BeanstalkもDockerをサポート

✦3日前にマルチコンテナもサポート開始!?

✦C-3「アプリケーションコンテナとAWSの話(仮)」 ✦詳しくは、大瀧プロのセッションにご期待ください。

51Ⓒ Classmethod, Inc.

Page 52: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Page 54: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

SQS と Spring Batch✦SQSの at least once delivery ✦冪等ジョブ or 二重実行制御 ✦全ジョブを冪等にはしづらい(メール送信とか) ✦同じジョブパラメータのジョブは複数回起動出来ない

55Ⓒ Classmethod, Inc.

JobExecutionAlreadyRunningException JobInstanceAlreadyCompleteException

相性抜群

Page 56: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Single Command Deploy と

システムポータビリティ

56

Page 57: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

–Miyamoto, Daisuke (2006)

“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、

コマンド1つで起動・デプロイができるべき”

(再掲)

Page 58: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Flyway ~ DBの進化的設計✦ Jiemamy is dead

✦スキーマにバージョンを付与 ✦前バージョンからの差分SQLを作成 ✦どこまで適用したかは、実際のDB上で管理 ✦未適用の差分SQLを順次適用することにより最新に ✦ただし、自動化されたロールバックは不可能

✦スキーマを1から構築し直すため、データを維持できない。59Ⓒ Classmethod, Inc.

Page 60: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Page 61: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Gradle Task Graph

64Ⓒ Classmethod, Inc.

Page 65: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

その他タスク

✦ ./gradlew :portnoy-webapi:bootRun

✦ ./gradlew flywayMigrate

✦ ./gradlew remoteFlywayMigrate

✦ ./gradlew awsFullUndeploy

65Ⓒ Classmethod, Inc.

Page 66: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

システム ポータビリティ

✦ ビルドとデプロイの自動化

―― Automated ✦ 自動化しない部分はポエム(文書)を書く

―― Documented ✦ つまり、システムの全てが記述されている

―― Full Described

66Ⓒ Classmethod, Inc.

Page 67: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

AWSにおけるシスポタ✦1つのAWSアカウント内に複数の環境を構築できる。

✦例えば本番環境と開発環境等。 ✦ 社内で共通のAWSアカウントに展開する。

✦あらゆるAWSアカウントに環境を構築できる。 ✦例えば個人検証環境。サンドボックス。 ✦ 開発者毎の個人検証用AWSアカウントに展開する。

✦あらゆるリージョンに環境を構築できる。 ✦と、いいかもね。

67Ⓒ Classmethod, Inc.

Page 68: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

CFnで定義できないもの

✦EC2キーペア ✦ IAMサーバ証明書

✦それぞれ事前に作成、アップロード ✦そのリソースIDをCFnパラメータに指定

71Ⓒ Classmethod, Inc.

Page 72: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

APIファースト

73

Page 74: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

全ての機能はAPIを介して提供

✦全ての提供機能にAPIを用意する。 ✦要するにAWSの真似です。 ✦どうしたらみんなに使ってもらえるか?

✦RESTful JSON API ✦実装はSpring MVC ✦特筆事項は特に無し。普通に書いてます。

74Ⓒ Classmethod, Inc.

Page 75: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Understanding HATEOAS✦https://spring.io/understanding/HATEOAS

76Ⓒ Classmethod, Inc.

Page 77: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

✦クライアント

システムに対する

情報提供を意図

✦とは言え、

人間にもやさしい

77Ⓒ Classmethod, Inc.

Page 78: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Spring HATEOAS✦Spring MVCの拡張。 ✦HATEOASの考えに則った、リンク等を扱える。 ✦http://projects.spring.io/spring-hateoas/

78Ⓒ Classmethod, Inc.

Page 79: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#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ドッグフーディング

#cmdevio2015C

よくあるRESTful API (2)

82Ⓒ Classmethod, Inc.

https://example.com/orgs/1

Page 83: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

LSUDs向けAPIの問題点

✦「To: ${billing-to}

 ${organization-name} ご担当者さま」

✦1ページ表示あたりのAPIコール数が多くなりがち

83Ⓒ Classmethod, Inc.

Page 84: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Page 86: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Page 88: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Page 89: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

時事ネタ

90Ⓒ Classmethod, Inc.

Page 91: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

この辺、非常に面白いんですが

✦シンプルな結論は出ないんでその場その場で考えます。

✦普通にDELETEを用意することもあるし ✦PUTで全プロパティアップデートさせるのもアリ ✦PATCHで部分アップデートも必要に応じて ✦そして…

91Ⓒ Classmethod, Inc.

Page 92: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

REST without PUT✦「リソース」それ自身の「削除(DELETE)」や

「アップデート(PUT)」などというものは存在しない。 ✦「リソース削除・更新イベントリソース」の

「作成(POST)」があるだけだ。

✦という悟りの世界も、場合によっては有効。 ✦結論、安易にどこか1つには寄せない。

92Ⓒ Classmethod, Inc.

Page 93: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Page 94: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

APIドキュメント

✦利用者によるAPIの理解はAutomated出来ない。 ✦よろしい、ならばDocumentedだ。 ✦というか、Automated Documentationだ。

94Ⓒ Classmethod, Inc.

Page 95: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Swagger UI✦Swagger仕様ドキュメントを元に

APIドキュメントページのWeb UIを生成する。

96Ⓒ Classmethod, Inc.

Page 97: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Swagger UI からAPIを叩く✦認証して

✦パラメータ

入れて

✦Try it out!

97Ⓒ Classmethod, Inc.

Page 98: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

結果

98Ⓒ Classmethod, Inc.

Page 99: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

Page 100: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#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ドッグフーディング

#cmdevio2015C

Page 102: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

APIファーストの結果✦弊社スタッフに

✦CMP-API と ✦Swagger UIのドキュメント と ✦ aurl を配布したら…

✦恐ろしい勢いで業務効率化ハックが始まった。 ✦Swagger UI と HATEOAS のリンクの影響か、

みんな自然にAPIを理解して普通に使ってくれる。

102Ⓒ Classmethod, Inc.

Page 103: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

CMPの技術的な未来

103

Page 104: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

#cmdevio2015C

出来てない事はまだまだ多い

✦CIツールによる自動デプロイ ✦Blue-Green Deployment ✦各種ログの管理と活用 ✦Spring Loaded突っ込みたい ✦Lombok突っ込みたい ✦TOTPによる多要素認証

104Ⓒ Classmethod, Inc.

Page 105: 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング

Developer Day

#cmdevio2015C

クラスメソッドのAWSドッグフーディング・まとめ

105

C-1

Ⓒ Classmethod, Inc.

✦ 完全AWSネイティブ ✦ Java 8 + Spring Framework ✦ Single Command Deployとシステムポータビリティ(Full Described)

✦ APIファースト