(レポート) ARC401: クラウドファースト #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。
re:Invent 2015でCloud Firstというその名もズバリなセッションに参加していたのでレポートします。本セッションでは世界屈指のバイオ科学メーカーであるモンサントの

クラウドのセオリー

クラウドのセオリーとして5個の重要なトピックが有ります。

  • 自動化:全てソフトウェアで定義される
  • 伸縮性:無限のスケール+利用時払い
  • 高可用性:Multi-AZ/リージョン+シャード/レプリカ
  • セキュリティ:やり直し+構築で補正
  • 水平スケーラブル:都度提供というよりいつでも使えるもの

クラウドのセオリー ⇒ クラウド・アーキテクチャ 

  • 自動化 ⇒ 高次元の自動化
  • 伸縮性 ⇒ 短命な環境
  • 高可用性 ⇒ フォルトトレラント
  • セキュリティ ⇒ 構築によるセキュリティ
  • 水平スケーラブル ⇒ 並行、コモディティ

高次元の自動化

  • 自動テスト
  • 継続的インテグレーション
  • 継続的デリバリー
  • 自動化されたインフラストラクチャ
  • 自動化された障害検知
  • 自動回復
  • ...そしてより自動化するための自動化ツール!

フォルトトレラント

内部アプリの誤った考えは、

  1. ハードウェアは信頼性がある
  2. ネットワークは信頼性がある
  3. データベースは信頼性がある
  4. その他のサービスは利用可能である
  5. 内部ネットワークはセキュアである
  6. ...

第一世代クラウドの誤った考えは、

  1. 他の人のフォルトトレラントのコードは実際にフォルトトレラントである
  2. 全て全てステートレス
  3. 全て再実行できる
  4. アプリケーションは全ての障害を処理する
  5. データは誰かのお陰で魔法のように処理される

構築によるセキュリティのやり直し

仮定によるセジュリティ、設計によるセキュリティ、セキュリティの自動化

水平スケーラブル

  1. スケーリングのオーバーヘッドは、ノード追加によってせいぜいリニアに増加する
  2. 読み書きの両方がスケールアウトする
  3. システムは任意のノードが無くなっても拡張性を提供できる
  • これ(CAP)は競合を理解するアプリが必要です

インフラストラクチャの自動化

クラウドアーキテクチャ

AWS CloudFormation

CloudFormationはJSONで記述しなければなりません

CloudFormationTemplate Generator

モンサントではCloudFormationをタイプセーフに記述するためにScala DSLのテンプレートジェネレータを作成しています

https://github.com/MonsantoCo/cloudformation-template-generator

参照整合性

Auto Scaling Group

Security Group

この様に少ないコードで記述できます

Stax

StaxというCloudFormationスタックを構築、管理するツールを作成しています

https://github.com/MonsantoCo/stax

Stax as a Service

マイクロサービス・ライフサイクル

Scala

ソフトウェアエンジニアリングのためのモダンな言語には以下のものが有ります。

  • 抽象データ型(ADT) → Scala, Haskell, Swift, OCaML, SML
  • 強制不変性 → Scala, Haskell, Clojure, Erlang, OCaML, SML
  • パターンマッチングと分割代入 → CoffeeScript, Scala, Haskell, Swift, OCaML, Erlang, SML
  • 型レベルプログラミング → Haskell, Scala, C++
  • Futures、Actors、Async → Erlang, Scala, Java
  • 型クラス → Haskell, Scala, ~OCaML

ハイブリット オブジェクト指向/関数プラグラミング

Javaからの移行と下位互換性を提供します。

高度な抽象化

  • 抽象データ型(ADT)
  • 強制不変性
  • パターンマッチングと分割代入
  • 型レベルプログラミング++
  • Futures、Actors、Async
  • 型クラス

高度な型制約

  • 高度なジェネリックと分散
  • 高い種類
  • F-有界多型
  • セルフタイプ
  • タイププロジェクション
  • 型メンバ
  • パス依存型
  • タイプの改良
  • チューリング完全!

プロジェクト・アズ・ア・サービス

  1. コードリポジトリ/Wiki/Issueを作成する
  2. シンプルなサービステンプレート
  3. CIとDocker化
  4. 継続的デリバリ

ScalaLoggingとELKによるロギング

統合的

  • サービス:log4j
  • コンテナ:logspout
  • CoreOS:journal forwarder
  • Bastion/NAT:rsyslog
  • ELB:S3 (ELK coming soon)
  • S3:S3 (ELK coming soon)
  • CloudTrail:S3 → TrailDash
  • RDS:(coming soon)

簡単に使える

  • ScalaLoggingの標準インタフェース
  • 自動フォーマット
  • JSON形式のログメッセージ
  • ELKで直接書き込める
  • 標準の項目

KamonとPrometheusで自動化

計測と配送

  • KamonからPrometheus Exporterへ、Prometheus JVMより多くのメトリクスを保存
  • トラッキングの向上
  • 複雑なデータマッピングの向上
  • 定期的にSprayメトリクスを収集してKamonへプッシュ

オートディスカバリ、ダッシュボード、アラート

  • より自動化されたカスタムDockerコンテナ ー etcdディスカバリ
  • カスタムのデフォルトダッシュボード
  • EC2/EBS/RDSの自動起動
  • OAuthの統合
  • SNS通知の統合
  • デフォルトのアラート

https://github.com/MonsantoCo/spray-kamon-metrics

次は何

改善と進化

  • AWS Service Catalog
  • EC2 Container Service
  • AWS IAM
    • EC2 CS Role
    • RDS Role
  • Amazon API Gateway
  • VPC Flow Logs - CloudFormationサポート?
  • デプロイ管理を反転
  • CloudFormationのアップデート予測

高次元の自動化

  • 自動テスト:Scalatest
  • 継続的インテグレーション:Jenkins
  • 継続的デリバリー:Router-Udpater
  • 自動化されたインフラストラクチャ:Stax →Stax-as-a-Service
  • 自動化された障害検知:Alert Manager
  • 自動回復
  • ...そしてより自動化するための自動化ツール!

さいごに

モンサントではAWSでのインフラストラクチャの自動化を推し進めています。モンサントのgithubリポジトリにはStaxを始め多数のプロダクトがあるので、興味が有る方は一度覗いてみると良いと思います。