形式手法と aws のおいしい関係。- モデル検査器 alloy...

60
形式手法と AWS おいしい関係。 チェシャ猫 (@y_taka_23) JAWS Festa 東海道 2016 (2016/10/22) モデル検査器 Alloy によるインフラ設計技法

Upload: ytaka23

Post on 06-Jan-2017

2.820 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

形式手法と AWS のおいしい関係。

チェシャ猫 (@y_taka_23)

JAWS Festa 東海道 2016 (2016/10/22)

モデル検査器 Alloy によるインフラ設計技法

Page 2: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

AWS で「やっちまった」こと

ありませんか?

Page 3: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

本日の目次

1. インフラ設計、この厄介なるもの

2. 形式手法、この深淵なるもの

3. Alloy、この強力なるもの

4. モデリング・ケーススタディ

5. まとめ

Page 4: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

1インフラ設計、この厄介なるもの

問題を複雑にしている要因はそもそもどこにあるのか?

Page 5: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

インフラ設計の難しさ

▪ 長期間に渡って使用される

▫ 当初の想定に反する事態になりやすい

▫ 設計意図が引き継がれにくい

▪ 変更時の影響範囲が大きい

▫ 一部分のみの再設計が困難

▪ 構成要素が多く、系として複雑

▫ 全体を正しく把握しないと動かせない

Page 6: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

AWS をテストする手法たち

▪ awspec

▫ RSpec 形式で AWS リソースをテスト

▫ API にアクセスしてリソースの情報を取得

▪ AWS Config Rules

▫ 設定の変更履歴を追跡

▫ 条件を満たさないリソースを監視

▫ Lambda でカスタムルール作成可能

Page 7: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

実物に依存せず

「設計」に対して試行錯誤したい

Page 8: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

形式手法Formal Methods

Page 9: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

2形式手法、この深淵なるもの

数理的手法を応用することで何が得られるのか?

Page 10: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

形式手法とは

▪ システムを数学的対象として表現

▫ 選んだ対象によって特性が変わる

▪ 数学的対象に関する理論を用いて検証

▪ いわゆるテストと比較して

▫ より抽象的な設計を検証できる

▫ テストケースの漏れが生じない

▫ 一般的には学習コストが高い(なじみがない)

Page 11: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

様々な形式手法ツール

▪ 形式仕様記述 : Z、VDM++

▪ 定理証明 : Coq、Agda、Isabelle

▪ モデル検査 : Alloy、TLA+、SPIN

▫ 列挙可能な数学的対象でシステムを定義

▫ システムが満たすべき制約を記述

▫ 全探索で制約が満たされることを確認

Page 12: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

AWS でも使われた形式手法

▪ 分散アルゴリズムの検証

▫ DynamoDB、S3 に適用

▫ 意図せずしてデータが壊れないことを保証

▪ ツールは TLA+ を使用

▫ 当初 Alloy を検討するも頓挫

▫ 原因は「表現力が足りなかった」こと

▪ 普通の開発者が数週間で習得

http://cacm.acm.org/magazines/2015/4/184701-how-amazon-web-services-uses-formal-methods

Page 13: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

re:Invent 2016 でもセッションが

https://www.portal.reinvent.awsevents.com/connect/sessionDetail.ww?SESSION_ID=8311

Page 14: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

3Alloy、この強力なるもの

「関係」によってシステムを記述するとはどういうことか?

Page 15: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

Alloy はどんなツールなのか?

▪ 関係論理でシステムを定義

▫ データモデル的な表現に向く

▪ SAT ソルバにより具体例を発見

▫ 制約を満たす(満たさない)例を自動で列挙

▪ 発見した例を可視化

▫ 検証結果が読み取りやすい

▫ Lightweight を標榜、試行錯誤を支援

Page 16: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

初めての Alloy モデル

sig Subnet {}

sig Instance {

subnet : Subnet,

}

run {}

Page 17: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

初めての具体例その 1

Page 18: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

初めての具体例その 2

Page 19: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

初めての具体例その 3

Page 20: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

関係論理へのマッピング

▪ シグニチャ

▫ 有限集合を表す

▫ Subnet、Instance

▪ フィールド

▫ シグニチャ (= 集合) 上の関係を表す

▫ 実体は直積集合の部分集合

▫ subnet ⊆ Instance × Subnet

Page 21: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

フィールド = 部分集合

subnet0

instance0

instance1

instance2

subnet1 subnet2

(i0, s0) (i0, s1) (i0, s2)

(i1, s0) (i1, s1) (i1, s2)

(i2, s0) (i2, s1) (i2, s2)

Page 22: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

フィールド = 部分集合

subnet0

instance0

instance1

instance2

subnet1 subnet2

(i0, s0) (i0, s1) (i0, s2)

(i1, s0) (i1, s1) (i1, s2)

(i2, s0) (i2, s1) (i2, s2)

Page 23: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

フィールド = 部分集合 : 具体例その 1

Page 24: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

フィールド = 部分集合

subnet0

instance0

instance1

instance2

subnet1 subnet2

(i0, s0) (i0, s1) (i0, s2)

(i1, s0) (i1, s1) (i1, s2)

(i2, s0) (i2, s1) (i2, s2)

Page 25: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

フィールド = 部分集合 : 具体例その 2

Page 26: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

フィールド = 部分集合

subnet0

instance0

instance1

instance2

subnet1 subnet2

(i0, s0) (i0, s1) (i0, s2)

(i1, s0) (i1, s1) (i1, s2)

(i2, s0) (i2, s1) (i2, s2)

Page 27: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

初めての具体例その 3

Page 28: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

セキュリティグループを追加してみる

sig Subnet {}

sig Instance {

subnet : Subnet,

}

run {}

Page 29: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

セキュリティグループを追加してみる

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : Subnet,

securityGroup : SecurityGroup,

}

run {}

Page 30: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

インスタンスにつきセキュリティグループは常にひとつ?

Page 31: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

多重度の表現

▪ 対応する集合の要素の数を指定

▫ one : ちょうど 1 個

▫ lone : 0 個または 1 個

▫ set : 0 個以上

▫ some : 1 個以上

▪ ER 図における 1..* などに相当

Page 32: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

関係に多重度を指定する

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : Subnet,

securityGroup : SecurityGroup,

}

run {}

Page 33: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

関係に多重度を指定する

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : one Subnet,

securityGroups : some SecurityGroup,

}

run {}

Page 34: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

セキュリティグループを複数持つインスタンスが出現

Page 35: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

サブネット内には常に

インスタンスが存在するだろうか?

Page 36: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

2 種類の検査コマンド

▪ pred

▫ 条件が成り立つ具体例を探索

▫ run コマンドで検査

▪ assert

▫ 条件が成り立たない反例を探索

▫ check コマンドで検査

Page 37: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

具体例を探索する

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : one Subnet,

securityGroup : some SecurityGroup,

}

run {}

Page 38: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

具体例を探索する

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : one Subnet,

securityGroup : some SecurityGroup,

}

pred subnetShouldNotBeEmpty {

all s : Subnet | some subnet.s

}

run subnetShouldNotBeEmpty

Page 39: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

具体例 : すべてのサブネットがインスタンスを持つ

Page 40: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

反例を探索する

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : one Subnet,

securityGroup : some SecurityGroup,

}

pred subnetShouldNotBeEmpty {

all s : Subnet | some subnet.s

}

run subnetShouldNotBeEmpty

Page 41: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

反例を探索する

sig Subnet {}

sig SecurityGroup {}

sig Instance {

subnet : one Subnet,

securityGroup : some SecurityGroup,

}

assert subnetShouldNotBeEmpty {

all s : Subnet | some subnet.s

}

check subnetShouldNotBeEmpty

Page 42: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

反例 : インスタンスを持たないサブネットが存在する

Page 43: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

Alloy によるモデル検査の流れ

▪ シグニチャとフィールドでモデルを定義

▪ 検査したい性質を記述

▫ pred + run : 性質を満たす具体例を探す

▫ assert + check : 反例を探す

▪ 結果を見て、必要ならモデルを修正

▫ テスト駆動開発に似た使用感

▫ 繰り返す過程で設計が洗練される

Page 44: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

4モデリング・ケーススタディ

システムをモデル化する際頭の中では何が起きるのか?

Page 45: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

Alloy によるモデル記述のコツ

▪ 最初から完璧を目指さない

▫ 可視化機能をうまく利用、TDD をイメージ

▫ 行き詰ったら定義の仕方を変えてみる

▫ 関係の方向を逆にするとうまくいったりする

▪ 必要な要素を見極める

▪ パーツごとに分割して考える

▫ システムの中で、分割しやすいラインを考える

Page 46: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

サンプル : 単一のパブリックサブネットを持つ VPC

http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Scenario1.html

Page 47: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

サンプルの構成要素

▪ AWS 上のリソースに関する条件

▫ EC2 インスタンス

▫ VPC、サブネット、インターネットゲートウェイ、

EIP

▫ ルートテーブル

▫ セキュリティグループ

▪ AWS 以外の一般論に関する条件

▫ CIDR、プロトコル、ポート番号など

Page 48: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

パーツ 1 : CIDR に関する部分

▪ CIDR ブロック

▫ 含む / 含まれるを関係で定義

▫ 制約を与えて木構造(ループがない)にする

▪ プロトコル

▫ TCP、UDP、ICMP

▪ ポート番号

▫ ICMP のとき、かつそのときに限り空集合

Page 49: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

パーツ 1 の正しくない例

Page 50: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

パーツ 1 の正しい例

Page 51: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

パーツ 2 : EC2 インスタンスに関する部分

▪ EC2 インスタンス

▫ ちょうど 1 個のサブネットに属する

▫ 1 個以上のセキュリティグループを持つ

▪ サブネット、VPC

▫ ちょうど 1 個の CIDR ブロックを持つ

▪ インターネットゲートウェイ

▪ Elastic IP アドレス

Page 52: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

パーツ 3 : ルートテーブルに関する部分

▪ ルートテーブル

▫ 0 個以上のルート設定を持つ

▪ ルート

▫ Destination となる CIDR ブロック

▫ Target は以下のいずれか(= 和集合の要素)

■ EC2 インスタンス

■ インターネットゲートウェイ

Page 53: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

パーツ 4 : セキュリティグループに関する部分

▪ 構造はルートテーブルと似ている

▪ セキュリティグループ

▫ 0 個以上のイン / アウトバウンドルールを持つ

▪ ルール

▫ プロトコル、ポート番号

▫ Source / Destination

■ CIDR ブロックとセキュリティグループの和集合

Page 54: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

仕様から設計を発見したい

Page 55: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

具体例を見つけたい仕様を記述する

▪ Web サーバのインスタンスが 1 つ存在

▫ インターネットから HTTPS 接続可能

▫ 管理用のネットワークから SSH 接続可能

▫ その他の場所からは接続不可能

▪ 「接続可能」の条件を定式化

▫ ルーティングが正しく設定されている

▫ セキュリティーグループが解放されている

Page 56: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

サンプルと同じ構成を自動で設計!

Page 57: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

5まとめ

結局、この 25 分間で我々は何を得たのか?

Page 58: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

本日のまとめ

▪ 形式手法で設計を検証できる

▪ ツールは使い方が肝心

▪ インフラ設計に Alloy がおすすめ

Page 59: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

AWS での「やっちまった」が

減ることを祈って

Presented by

チェシャ猫 (@y_taka_23)

Page 60: 形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta

CREDITS

Special thanks to all the people who made and released

these awesome resources for free:

▪ Presentation template by SlidesCarnival

▪ Photographs by Unsplash