More Related Content More from 都元ダイスケ Miyamoto More from 都元ダイスケ Miyamoto (20) 20150329 Developers.IO 2015 C-1 クラスメソッドのAWSドッグフーディング2. #cmdevio2015C
自己紹介
✦ よく訓練されたアップル信者、都元です。
✦ Webアプリ屋出身のAWS屋
✦ AWS歴3.5年
✦ @daisuke_m
✦ 人間CloudFormer
2Ⓒ Classmethod, Inc.
CloudFormation
EC2S3
Glacier
ElasticMapReduce
AutoScaling
ELB
CloudFront
RDS
DynamoDB
ElastiCache
RedShift
IAM
CloudWatch
Beanstalk
Data Pipeline
OpsWorks
CloudHSM
CloudSearch
SWF
SQS
SNS
SES
ElasticTranscoder
Route53
VPC DirectConnect
StorageGateway
Mechanical Turk
CloudTrail
AppStream
Kinesis
3. #cmdevio2015C
Do you know?
✦ DBの進化的設計を実現する開発プロセス
✦ 要するにRailsのmigrationのような
✦ 現在のJavaでいうFlywayのような
✦ EclipseプラグインによるER図エディタ
3Ⓒ Classmethod, Inc.
2006-2012
Jiemamy
9. #cmdevio2015C
この問題の解決方法
✦ 原始的 → 文書化(Documented)
✦ 陳腐化しやすい。
✦ みんなドキュメントを書きたくない。
✦ エクセルは都市伝説。
✦ モダン → 自動化(Automated)
✦ DBの構築とスキーマのマイグレーションを自動化する。
9Ⓒ Classmethod, Inc.
11. #cmdevio2015C
あらためてJiemamy
✦ DB構成情報を1つに集約 (smart model)
「重要なことはファイルを扱うようにデータベースを扱えるツールを持つことだ。」
「スキーマとテストデータから成るデータベース」
✦ データファイルをVCS管理 (smart version control)
「マスターデータベースをソースコードと同様に構成管理の下に置くのである。」
「全システムを管理する強力な構成管理ツールの下にあれば、もし最悪の事態が起こっても元に戻すのは
難しいことではない。」
✦ ビルドフェーズでDB整備 (smart build / deploy)
「すべての開発者のデータベースに変更を自動的に適用する」
11Ⓒ Classmethod, Inc.
∼ツール面からDBの進化的設計をサポート∼
18. #cmdevio2015C
CMPとは
✦ (1) 弊社サービス「メンバーズ」のお客様向けポータル
✦ AWSご利用料金の確認と分析
✦ CloudTrailの集計結果確認
✦ ライセンス期限管理
✦ etc
✦ (2) 社内向け業務システム
✦ コンサルティング資料
✦ 運用サポート情報管理
✦ 請求書発行
18Ⓒ Classmethod, Inc.
✦ (3) AWS実験場
✦ AWS実運用経験の場
✦ CloudFormation
✦ Elastic Beanstalk
✦ Elastic MapReduce
✦ IAM
31. #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
35. #cmdevio2015C
詳細なCSV(Detailed Billing Report)
✦ 要するに、毎月数GBオーダーのCSVが1日数回…
✦ 当初、このCSVをそのままRDSにインポート
✦ GROUP BYクエリ等で表示していたが、重すぎ
✦ オレオレMaterialized View…にも限界が
✦ 「1年で10倍成長します」
✦ .oO( 1年後は数十GBオーダーのCSVか… )
✦ よろしい、ならばEMRだ。
35Ⓒ Classmethod, Inc.
36. #cmdevio2015C
EMR バックグラウンドJob
✦ 集計ジョブ
✦ Brianにより定期的にジョブキック
✦ AWSにより新しいDBRが届いていれば
✦ EMRクラスタを立ち上げてHiveステップを登録
✦ もちろんSpotインスタンス♡
✦ 取り込みジョブトリガをBrianに登録(30分後∼5分毎)
✦ 取り込みジョブ
✦ Hiveステップが終わっていなければ終了
✦ 終わっていれば、S3に吐かれた集計結果をRDSにインポート
✦ Brianから「自分自身を起動したトリガ」を削除
36Ⓒ Classmethod, Inc.
37. #cmdevio2015C
その他、細かいTips
✦ SNS - OperationNotificationTopic を作って活用する
✦ 運用情報の通知(AutoScalingの増減やヘルスチェックの結果等)
✦ 想定外の挙動やバグ疑いの通知。
✦ このようなものを受け取るのにSESは使わない。SNSが最適。
✦ CloudWatch - Alarmを定義する
✦ RDS の FreeStorageSpace
✦ ディスクが有限であるかぎり、DiskFullのリスクは消えない
✦ SQS の NumberOfMessagesPublished
✦ Brianを利用する場合、メッセージが無いのはおかしい
✦ SQS の ApproximateNumberOfMessagesVisible
✦ 溜まるということはWorkerのバグか、キャパ不足
37Ⓒ Classmethod, Inc.
42. #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.
45. #cmdevio2015C
プロジェクト構成
✦ api: ドメインモデル・DB定義等
✦ batch: バッチJob実装
✦ worker: aws-sqsdからのメッセージに応じて
バッチJobを実行する小さなWebアプリ(6クラス)
✦ webapi: JSON RESTful API(後述)
✦ webclient: 静的JSクライアント(非Java、後述)
✦ website: レガシーWebアプリ(シュリンク)
45Ⓒ Classmethod, Inc.
47. #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.
48. #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.
51. #cmdevio2015C
1プロセスのための環境 ∼ Docker
✦ 最近のJavaフレームワークはDockerと相性が良い
✦ Elastic BeanstalkもDockerをサポート
✦ 3日前にマルチコンテナもサポート開始!?
✦ C-3「アプリケーションコンテナとAWSの話(仮)」
✦ 詳しくは、大瀧プロのセッションにご期待ください。
51Ⓒ Classmethod, Inc.
52. #cmdevio2015C
Dockerfile 例
FROM dockerfile/java:oracle-java8
EXPOSE 8080
WORKDIR /opt/portnoy-webapi/
ADD logback.xml /opt/portnoy-webapi/logback.xml
ADD 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.
54. #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.
55. #cmdevio2015C
SQS と Spring Batch
✦ SQSの at least once delivery
✦ 冪等ジョブ or 二重実行制御
✦ 全ジョブを冪等にはしづらい(メール送信とか)
✦ 同じジョブパラメータのジョブは複数回起動出来ない
55Ⓒ Classmethod, Inc.
JobExecutionAlreadyRunningException
JobInstanceAlreadyCompleteException
相性抜群
59. #cmdevio2015C
Flyway ∼ DBの進化的設計
✦ Jiemamy is dead
✦ スキーマにバージョンを付与
✦ 前バージョンからの差分SQLを作成
✦ どこまで適用したかは、実際のDB上で管理
✦ 未適用の差分SQLを順次適用することにより最新に
✦ ただし、自動化されたロールバックは不可能
✦ スキーマを1から構築し直すため、データを維持できない。
59Ⓒ Classmethod, Inc.
63. #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.
68. #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")
70. #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/
80. #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表現
92. #cmdevio2015C
REST without PUT
✦ 「リソース」それ自身の「削除(DELETE)」や
「アップデート(PUT)」などというものは存在しない。
✦ 「リソース削除・更新イベントリソース」の
「作成(POST)」があるだけだ。
✦ という悟りの世界も、場合によっては有効。
✦ 結論、安易にどこか1つには寄せない。
92Ⓒ Classmethod, Inc.
100. #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