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

Preview:

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ファースト

Recommended