Upload
-
View
3.489
Download
4
Embed Size (px)
Citation preview
Developer Day
#cmdevio2015C
クラスメソッドの AWSドッグフーディング
1
C-1
都元 ダイスケ, AWSコンサルティング部 クラスメソッド株式会社
Ⓒ Classmethod, Inc.
2015年03月29日
本セッションは長丁場です。お手洗いはお済みですか?
#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
#cmdevio2015C
Do you know?
✦DBの進化的設計を実現する開発プロセス ✦要するにRailsのmigrationのような ✦現在のJavaでいうFlywayのような ✦EclipseプラグインによるER図エディタ
3Ⓒ Classmethod, Inc.
2006-2012Jiemamy
#cmdevio2015C
DBの 進化的設計
Evolutional Database Design — Martin Fowler and Pramod Sadalage, 2003
http://www.objectclub.jp/community/XP-jp/xp_relate/evodb-jp
データベースリファクタリング
#cmdevio2015C
Evolutional DB Design
✦実装前に設計を確定させるのは、もはや不可能 ✦DBの設計に関しても同様で、リファクタリングを適
用したい ✦しかし、DBはアーキテクチャの低層に位置している
ため、被依存度が高く、変更しづらい ✦どーする?
5Ⓒ Classmethod, Inc.
#cmdevio2015C
not only refactoring
✦DB変更はrefactoringだけではない ✦テーブルやカラムの追加や削除
✦開発中のDBの変更履歴・構成管理
6Ⓒ Classmethod, Inc.
#cmdevio2015C
アンケート✦システム開発をしている。 ✦システムの構成管理をしている。 ✦構成管理のおかげで、昔の状態がいつでも
呼び戻せるから安心である。このメリットは重要だ。 ✦昔の状態のシステムをいつでも動かせる。
✦昔の状態のシステムをいつでも動かせる...
✦昔の状態のシステムを今でも動かせる...!?7Ⓒ Classmethod, Inc.
#cmdevio2015C
本当です?
✦あなたのシステムが例えばGitHubに置いてあります。
このアプリを無事に起動できますか?
✦過去のタグでも大丈夫ですか? ✦その時、DBも整備構築できますか?
8Ⓒ Classmethod, Inc.
#cmdevio2015C
この問題の解決方法
✦原始的 → 文書化(Documented) ✦陳腐化しやすい。 ✦みんなドキュメントを書きたくない。 ✦エクセルは都市伝説。
✦モダン → 自動化(Automated) ✦DBの構築とスキーマのマイグレーションを自動化する。
9Ⓒ Classmethod, Inc.
#cmdevio2015C
進化的設計Smart
VersionControl
SmartModel
SmartBuild
#cmdevio2015C
あらためてJiemamy
✦ DB構成情報を1つに集約 (smart model) 「重要なことはファイルを扱うようにデータベースを扱えるツールを持つことだ。」 「スキーマとテストデータから成るデータベース」
✦ データファイルをVCS管理 (smart version control) 「マスターデータベースをソースコードと同様に構成管理の下に置くのである。」 「全システムを管理する強力な構成管理ツールの下にあれば、もし最悪の事態が起こっても元に戻すのは難しいことではない。」
✦ ビルドフェーズでDB整備 (smart build / deploy) 「すべての開発者のデータベースに変更を自動的に適用する」
11Ⓒ Classmethod, Inc.
~ツール面からDBの進化的設計をサポート~
#cmdevio2015C
スマートモデル
12Ⓒ Classmethod, Inc.
database
tablecolumn
Java object SQL
Excel
class
#cmdevio2015C
ってなことを訴え始めた2006年
✦あの頃の俺は青かった。
✦自動化の対象はDBの構築と管理じゃない。
✦DBを含む、インフラ全部だ。
13Ⓒ Classmethod, Inc.
#cmdevio2015C
時は流れ、2013年…
✦世はまさに大クラウド時代! ✦AWSは全てがAPI! ✦Infrastructure as Code!
14Ⓒ Classmethod, Inc.
#cmdevio2015C
–Miyamoto, Daisuke (2006)
“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、
コマンド1つで起動・デプロイができるべき”
2006年にここまで言ってたかどうか忘れましたが、 2008年には確実に言ってた。
この考えは現在も変わっていません。
スマートビルド / デプロイ
#cmdevio2015C
Single Command DeployThoughtWorks, Inc. Technology Radar March 2012
16Ⓒ Classmethod, Inc.
#cmdevio2015C
クラスメソッド メンバーズポータル (CMP)
17
#cmdevio2015C
CMPとは✦ (1) 弊社サービス「メンバーズ」のお客様向けポータル
✦AWSご利用料金の確認と分析 ✦CloudTrailの集計結果確認 ✦ライセンス期限管理 ✦ etc
✦ (2) 社内向け業務システム ✦コンサルティング資料 ✦運用サポート情報管理 ✦請求書発行
18Ⓒ Classmethod, Inc.
✦ (3) AWS実験場 ✦AWS実運用経験の場 ✦CloudFormation ✦Elastic Beanstalk ✦Elastic MapReduce ✦ IAM
#cmdevio2015C
CMPのテーマ(本日のagenda)
✦完全AWSネイティブ ✦ Java 8 + Spring Framework ✦ Single Command Deployとシステム ポータビリティ ✦ APIファースト
19Ⓒ Classmethod, Inc.
#cmdevio2015C
完全AWSネイティブ
20
#cmdevio2015C
完全AWSネイティブとは✦AWSの哲学・推奨に従う ✦実装の都合を一方的に押し付けない
✦問題をアプリで解決するか、インフラで解決するか? ✦アプリとインフラで戦わない。都度最適解を追求する。 ✦CMPでは、どっちも自分ですねん。
✦AWSに寄り添う
21Ⓒ Classmethod, Inc.
#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
#cmdevio2015C
Multi-AZの「効果」と「パターン」✦Availability(可用性)とScalability(拡張性) ✦Design for failure(障害を見越した設計) ✦WebパターンとWorkerパターン
23Ⓒ Classmethod, Inc.
Web Server
Worker Server
#cmdevio2015C
Webサーバ構成✦もちろんMulti-AZのWebパターン ✦現在2つの構成が並走中
✦レガシー構成(シュリンク方針) ✦Webサーバ内でHTMLを合成して返すアレ ✦ JSONを吐くAPIとしても機能する ✦所謂SSKDs向けAPI
✦完全静的フロント+API構成(鋭意構築中) ✦静的JSクライアントアプリ ✦ひたすらJSONを吐く箱 ✦所謂LSUDs向けAPI
24Ⓒ Classmethod, Inc.
#cmdevio2015C
Workerサーバ構成✦もちろんMulti-AZのWorkerパターン ✦要するにProducer & Consumer ✦非同期処理を担う
✦各種締め処理 ✦バルクメール送信 ✦レポーティング
✦各種サーバがSQSにJSONを投入
25Ⓒ Classmethod, Inc.
#cmdevio2015C
Beanstalk Worker Tier✦Beanstalkは「Webパターン」だけではない ✦「Workerパターン」のデプロイも可能 ✦(下図は再掲)
26Ⓒ Classmethod, Inc.
Web Tier Worker Tier
#cmdevio2015C
aws-sqsd✦WorkerはHTTPサーバとして実装!
27Ⓒ Classmethod, Inc.
#cmdevio2015C
ジョブスケジューラ✦遅延処理や定時処理
✦処理の開始トリガーがHTTPリクエストではない
✦このような処理を担うバッチサーバの実装 ✦cron? Multi-AZは?
✦Availability = AZ障害で片側がダウンしたら? ✦Scalability = トリガ数が想像以上に増えたら…? (※)
28Ⓒ Classmethod, Inc.
※ … そういうことはあまり有りませんが、設計癖として意識したい
#cmdevio2015C
Amazon Elastic Job-Scheduler Service
✦cron expressionでスケジュールを登録 ✦SNSトピックを指定
✦スケジュールに従って、SNSにJSONをpublish
29Ⓒ Classmethod, Inc.
すると
#cmdevio2015C
Amazon Elastic Job-Scheduler Service
✦cron expressionでスケジュールを登録 ✦SNSトピックを指定
✦スケジュールに従って、SNSにJSONをpublish
30Ⓒ Classmethod, Inc.
するとリリース
マダァ?
#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
#cmdevio2015C
http://bit.ly/aws-worker-sqshttp://bit.ly/aws-worker-beanstalkhttp://bit.ly/aws-worker-brian
Developers.IO Job Worker 三部作
#cmdevio2015C
ここまでのまとめ
33Ⓒ Classmethod, Inc.
#cmdevio2015C
CMPにおけるAWS利用データ分析✦AWSはAWSの利用実績とその費用を、詳細なCSVと
して提供しています。(Detailed Billing Report) ✦CMPはそのデータを様々な角度から分析し、お客様に
コスト削減のご提案等に役立てています。
34Ⓒ Classmethod, Inc.
#cmdevio2015C
詳細なCSV(Detailed Billing Report)✦要するに、毎月数GBオーダーのCSVが1日数回… ✦当初、このCSVをそのままRDSにインポート
✦GROUP BYクエリ等で表示していたが、重すぎ
✦オレオレMaterialized View…にも限界が ✦ 「1年で10倍成長します」
✦ .oO( 1年後は数十GBオーダーのCSVか… )
✦よろしい、ならばEMRだ。
35Ⓒ Classmethod, Inc.
#cmdevio2015C
EMR バックグラウンドJob✦集計ジョブ
✦Brianにより定期的にジョブキック ✦AWSにより新しいDBRが届いていれば ✦EMRクラスタを立ち上げてHiveステップを登録
✦もちろんSpotインスタンス♡ ✦取り込みジョブトリガをBrianに登録(30分後~5分毎)
✦取り込みジョブ ✦Hiveステップが終わっていなければ終了 ✦終わっていれば、S3に吐かれた集計結果をRDSにインポート ✦Brianから「自分自身を起動したトリガ」を削除
36Ⓒ Classmethod, Inc.
#cmdevio2015C
その他、細かいTips✦SNS - OperationNotificationTopic を作って活用する
✦運用情報の通知(AutoScalingの増減やヘルスチェックの結果等) ✦想定外の挙動やバグ疑いの通知。 ✦このようなものを受け取るのにSESは使わない。SNSが最適。
✦CloudWatch - Alarmを定義する ✦RDS の FreeStorageSpace
✦ディスクが有限であるかぎり、DiskFullのリスクは消えない ✦SQS の NumberOfMessagesPublished
✦Brianを利用する場合、メッセージが無いのはおかしい ✦SQS の ApproximateNumberOfMessagesVisible
✦溜まるということはWorkerのバグか、キャパ不足
37Ⓒ Classmethod, Inc.
#cmdevio2015C
と、いう構成全体定義
✦CloudFormationテンプレート ✦1761行(3/24現在)
✦一部の例外を除き、手ではAWSリソースを作らない ✦例外については後述
38Ⓒ Classmethod, Inc.
#cmdevio2015C
#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
#cmdevio2015C
モノリシック派
✦pros ✦CFnの「スタック」という概念に寄り添っている(と思う) ✦テンプレート間のパラメータ繋ぎ込みの仕組みが不要
✦cons ✦update時、意図しない範囲に影響が波及してしまう恐れ
41Ⓒ Classmethod, Inc.
#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.
#cmdevio2015C
Java 8 + Spring Framework
43
#cmdevio2015C
Javaは死んでいない
#cmdevio2015C
プロジェクト構成✦api: ドメインモデル・DB定義等 ✦batch: バッチJob実装 ✦worker: aws-sqsdからのメッセージに応じて
バッチJobを実行する小さなWebアプリ(6クラス) ✦webapi: JSON RESTful API(後述) ✦webclient: 静的JSクライアント(非Java、後述) ✦website: レガシーWebアプリ(シュリンク)
45Ⓒ Classmethod, Inc.
#cmdevio2015C
依存ダイアグラム
46Ⓒ Classmethod, Inc.
#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.
#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.
#cmdevio2015C
最近のJavaフレームワーク✦Play Framework ✦Dropwizard ✦Ninja framework ✦Spring Boot
✦アプリケーションサーバ(コンテナ)準備不要の、スタンドアローンアプリ。
✦ Javaプロセスを1つ立ち上げればHTTPサーバが動く。
49Ⓒ Classmethod, Inc.
#cmdevio2015C
#cmdevio2015C
1プロセスのための環境 ~ Docker✦最近のJavaフレームワークはDockerと相性が良い ✦Elastic BeanstalkもDockerをサポート
✦3日前にマルチコンテナもサポート開始!?
✦C-3「アプリケーションコンテナとAWSの話(仮)」 ✦詳しくは、大瀧プロのセッションにご期待ください。
51Ⓒ Classmethod, Inc.
#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.
#cmdevio2015C
#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.
#cmdevio2015C
SQS と Spring Batch✦SQSの at least once delivery ✦冪等ジョブ or 二重実行制御 ✦全ジョブを冪等にはしづらい(メール送信とか) ✦同じジョブパラメータのジョブは複数回起動出来ない
55Ⓒ Classmethod, Inc.
JobExecutionAlreadyRunningException JobInstanceAlreadyCompleteException
相性抜群
#cmdevio2015C
Single Command Deploy と
システムポータビリティ
56
#cmdevio2015C
–Miyamoto, Daisuke (2006)
“リポジトリからコードをチェックアウトし、 必要に応じて環境固有の設定をした後、
コマンド1つで起動・デプロイができるべき”
(再掲)
#cmdevio2015C
Gradle✦Groovyベースのビルドスクリプト ✦ Javaの依存ライブラリ管理 ~ ビルド・パッケージ
✦標準機能で実現可能。
✦Spring Bootアプリケーションの起動 ✦プラグイン: spring-boot-grade-plugin
✦DBの初期構築とマイグレーション ✦プラグイン: flyway-gradle-plugin(次のスライドにて)
✦Bastionを介したSSHトンネリング(DB / Brian操作) ✦プラグイン: sshoogr-gradle
58Ⓒ Classmethod, Inc.
#cmdevio2015C
Flyway ~ DBの進化的設計✦ Jiemamy is dead
✦スキーマにバージョンを付与 ✦前バージョンからの差分SQLを作成 ✦どこまで適用したかは、実際のDB上で管理 ✦未適用の差分SQLを順次適用することにより最新に ✦ただし、自動化されたロールバックは不可能
✦スキーマを1から構築し直すため、データを維持できない。59Ⓒ Classmethod, Inc.
#cmdevio2015C
#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.
#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.
#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.
#cmdevio2015C
Gradle Task Graph
64Ⓒ Classmethod, Inc.
#cmdevio2015C
その他タスク
✦ ./gradlew :portnoy-webapi:bootRun
✦ ./gradlew flywayMigrate
✦ ./gradlew remoteFlywayMigrate
✦ ./gradlew awsFullUndeploy
65Ⓒ Classmethod, Inc.
#cmdevio2015C
システム ポータビリティ
✦ ビルドとデプロイの自動化
―― Automated ✦ 自動化しない部分はポエム(文書)を書く
―― Documented ✦ つまり、システムの全てが記述されている
―― Full Described
66Ⓒ Classmethod, Inc.
#cmdevio2015C
AWSにおけるシスポタ✦1つのAWSアカウント内に複数の環境を構築できる。
✦例えば本番環境と開発環境等。 ✦ 社内で共通のAWSアカウントに展開する。
✦あらゆるAWSアカウントに環境を構築できる。 ✦例えば個人検証環境。サンドボックス。 ✦ 開発者毎の個人検証用AWSアカウントに展開する。
✦あらゆるリージョンに環境を構築できる。 ✦と、いいかもね。
67Ⓒ Classmethod, Inc.
#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")
#cmdevio2015C
CloudFormation Tips✦アプリケーションで利用するAWSリソース名等
✦S3バケット名、SQSキューURL、SNSトピックARN ✦DynamoDBテーブル名、SubnetID、EnvironmentType ✦RDBホスト名とポート番号、ユーザ名、パスワード
✦これらはCFnパラメータや、CFnリソースとして確定 ✦アプリケーション起動パラメータとして
Beanstalkアプリケーションに渡す ✦これらの値はDockerfile内で参照可能
69Ⓒ Classmethod, Inc.
#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/
#cmdevio2015C
CFnで定義できないもの
✦EC2キーペア ✦ IAMサーバ証明書
✦それぞれ事前に作成、アップロード ✦そのリソースIDをCFnパラメータに指定
71Ⓒ Classmethod, Inc.
#cmdevio2015C
Get system portability
✦ ./gradlew awsFullDeploy -Penv=prd
✦ ./gradlew awsFullDeploy -Penv=dev
✦ ./gradlew awsFullDeploy -Penv=personal
72Ⓒ Classmethod, Inc.
#cmdevio2015C
APIファースト
73
#cmdevio2015C
全ての機能はAPIを介して提供
✦全ての提供機能にAPIを用意する。 ✦要するにAWSの真似です。 ✦どうしたらみんなに使ってもらえるか?
✦RESTful JSON API ✦実装はSpring MVC ✦特筆事項は特に無し。普通に書いてます。
74Ⓒ Classmethod, Inc.
#cmdevio2015C
HATEOAS
✦Hypermedia as the Engine of Application State ✦へいとーす
✦要するに、HTMLってindexがあってそこからリンクを
辿ってあちこちを参照するよね! ✦ JSONもindexがあって、リンクを辿れるべきでは?
75Ⓒ Classmethod, Inc.
#cmdevio2015C
Understanding HATEOAS✦https://spring.io/understanding/HATEOAS
76Ⓒ Classmethod, Inc.
#cmdevio2015C
✦クライアント
システムに対する
情報提供を意図
✦とは言え、
人間にもやさしい
77Ⓒ Classmethod, Inc.
#cmdevio2015C
Spring HATEOAS✦Spring MVCの拡張。 ✦HATEOASの考えに則った、リンク等を扱える。 ✦http://projects.spring.io/spring-hateoas/
78Ⓒ Classmethod, Inc.
#cmdevio2015C
HAL✦Hypertext Application Language ✦http://stateless.co/hal_specification.html ✦HATEOASの具体的な仕様の一つ ✦Spring HATEOAS
でもサポートがある
79Ⓒ Classmethod, Inc.
#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表現
#cmdevio2015C
よくある RESTful API (1)
81Ⓒ Classmethod, Inc.
https://example.com /orgs/1 /projects/1 /aws-accounts/xxxx /addresses/142
#cmdevio2015C
よくあるRESTful API (2)
82Ⓒ Classmethod, Inc.
https://example.com/orgs/1
#cmdevio2015C
LSUDs向けAPIの問題点
✦「To: ${billing-to}
${organization-name} ご担当者さま」
✦1ページ表示あたりのAPIコール数が多くなりがち
83Ⓒ Classmethod, Inc.
#cmdevio2015C
embedded resourceの活用
✦主軸オブジェクトに
関連オブジェクトを
埋め込める!
84Ⓒ Classmethod, Inc.
https://example.com /orgs/1 /projects/1 /aws-accounts/xxx /addresses/142 ?embed=organization
#cmdevio2015C
#cmdevio2015C
CMP-APIのクライアントとしてのUI✦portnoy-webclient ✦完全静的JSクライアント ✦CMP-APIを、CORSを使って叩く。 ✦認証は、OAuth 2.0。
✦Resource owner password grant
✦MiddlemanとAngularJSで実装中 ✦私が実装してるンじゃないので、実は詳しく語れないw
86Ⓒ Classmethod, Inc.
#cmdevio2015C
#cmdevio2015C
#cmdevio2015C
更新系APIの形✦HATEOASやHALでも、更新系の定義は緩い ✦Read = GET は普通ですね ✦Create = POST はわかりやすい ✦Delete = DELETE もわかりやすい…? ✦Update
✦更新しないプロパティも含めて PUT すべき? ✦更新するプロパティのみを PATCH すべき?
89Ⓒ Classmethod, Inc.
#cmdevio2015C
時事ネタ
90Ⓒ Classmethod, Inc.
#cmdevio2015C
この辺、非常に面白いんですが
✦シンプルな結論は出ないんでその場その場で考えます。
✦普通にDELETEを用意することもあるし ✦PUTで全プロパティアップデートさせるのもアリ ✦PATCHで部分アップデートも必要に応じて ✦そして…
91Ⓒ Classmethod, Inc.
#cmdevio2015C
REST without PUT✦「リソース」それ自身の「削除(DELETE)」や
「アップデート(PUT)」などというものは存在しない。 ✦「リソース削除・更新イベントリソース」の
「作成(POST)」があるだけだ。
✦という悟りの世界も、場合によっては有効。 ✦結論、安易にどこか1つには寄せない。
92Ⓒ Classmethod, Inc.
#cmdevio2015C
#cmdevio2015C
APIドキュメント
✦利用者によるAPIの理解はAutomated出来ない。 ✦よろしい、ならばDocumentedだ。 ✦というか、Automated Documentationだ。
94Ⓒ Classmethod, Inc.
#cmdevio2015C
Swagger✦API仕様記述言語(JSONベース)
✦Swagger仕様ドキュメント
✦これを中心に、SDKやドキュメントの自動生成 ✦あれ、どこかで聞いたような…
✦そもそもSwagger仕様ドキュメントをどう作る? ✦コードに触れないなら自分でコリコリ書くしかない。 ✦コードを解析してSwagger仕様ドキュメントを自動生成。 ✦Swagger Spring MVC
✦https://github.com/springfox/springfox95Ⓒ Classmethod, Inc.
#cmdevio2015C
Swagger UI✦Swagger仕様ドキュメントを元に
APIドキュメントページのWeb UIを生成する。
96Ⓒ Classmethod, Inc.
#cmdevio2015C
Swagger UI からAPIを叩く✦認証して
✦パラメータ
入れて
✦Try it out!
97Ⓒ Classmethod, Inc.
#cmdevio2015C
結果
98Ⓒ Classmethod, Inc.
#cmdevio2015C
#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
#cmdevio2015C
#cmdevio2015C
APIファーストの結果✦弊社スタッフに
✦CMP-API と ✦Swagger UIのドキュメント と ✦ aurl を配布したら…
✦恐ろしい勢いで業務効率化ハックが始まった。 ✦Swagger UI と HATEOAS のリンクの影響か、
みんな自然にAPIを理解して普通に使ってくれる。
102Ⓒ Classmethod, Inc.
#cmdevio2015C
CMPの技術的な未来
103
#cmdevio2015C
出来てない事はまだまだ多い
✦CIツールによる自動デプロイ ✦Blue-Green Deployment ✦各種ログの管理と活用 ✦Spring Loaded突っ込みたい ✦Lombok突っ込みたい ✦TOTPによる多要素認証
104Ⓒ Classmethod, Inc.
Developer Day
#cmdevio2015C
クラスメソッドのAWSドッグフーディング・まとめ
105
C-1
Ⓒ Classmethod, Inc.
✦ 完全AWSネイティブ ✦ Java 8 + Spring Framework ✦ Single Command Deployとシステムポータビリティ(Full Described)
✦ APIファースト