ステートレスセキュリティグループ#
本構成はFJcloud-O 東日本/西日本リージョン3向けとなります。
要求事項#
ステートレスセキュリティグループ(セキュリティグループ:以降「SG」と記載)は、以下のようなユースケースにおいて利用します。
- IPCOMのロードバランサ機能と組み合わせたWebアクセスにおいて、より高いトランザクション性能(400TPS以上)を引き出したい
- クライアント端末からの大量同時アクセス(10,000コネクション以上)を受け付けたい
対応するデザインパターン概要#
FJcloud-Oの東日本第3/西日本第3リージョンにおいては、以下2つのSGを選択できます。
stateful:true
(ステートフルSG=デフォルト)stateful:false
(ステートレスSG=オプション)
ステートフルSGは要求した通信に対して戻りのルールが動的に生成されるもので、多くのクラウドやネットワークアプライアンスで利用されています。
ステートレスSGは動的に戻りのルールを生成しないため、戻りのルールを予め記載しておく必要がありますが、多数の通信が同時に利用される場合、以下のような性能上のメリットがあります。
- ステートフルSGのように逆方向ルールを動的に生成/削除する必要がないため、ネットワーク上の負荷が比較的軽い
このため、より高いトランザクション性能が要求されるケースや、大量の同時アクセスのあるケースにおいて、特に性能改善が見込まれます。
実装サンプル#
構成例1:シンプルパターン#
シンプルなユースケースとなります。
上記構成に対応した、ステートフルSGとステートレスSGの実装サンプルは、以下のとおりです。
ステートレスSGを指定する場合は、APIから設定してください。(ポータル操作では実行できません)
SGに関するグループの作成、ルールの編集については、APIリファレンスをご覧ください。
「SG_WEB_external」を ステートフルSG(stateful:true
) で設定する場合
方向 | ポートレンジmax | ポートレンジmin | プロトコル | セキュリティグループまたはCIDR | ethertype |
---|---|---|---|---|---|
受信 | 80 | 80 | tcp | 0.0.0.0/0 | IPv4 |
「SG_WEB_external」を ステートレスSG(stateful:false
)で設定する場合
方向 | ポートレンジmax | ポートレンジmin | プロトコル | セキュリティグループまたはCIDR | ethertype |
---|---|---|---|---|---|
受信 | 80 | 80 | tcp | 0.0.0.0/0 | IPv4 |
送信 | 65535 | 1 | tcp | 0.0.0.0/0 | IPv4 |
Note
クライアント側の送信元ポートで何が使われるか不明の場合、全ポート指定(1~65535)を推奨します。
構成例2:ロードバランサーによる負荷分散パターン#
IPCOMを含んだ構成となります。
IPCOMの設定については、IPCOMスタートガイドをご覧ください。
FJcloud-O上でIPCOMを利用する場合、例外的にステートフルSG・ステートレスSGとも双方向の設定になります。
このため、IPCOMに関する部分はステートフルSG・ステートレスSGともにルール数は変わりません。
「SG_LB」を ステートフルSG(stateful:true
) で設定する場合
方向 | ポートレンジmax | ポートレンジmin | プロトコル | セキュリティグループまたはCIDR | ethertype |
---|---|---|---|---|---|
送信 | Null | Null | Null | ::/0 | IPv6 |
送信 | Null | Null | Null | 0.0.0.0/0 | IPv4 |
受信 | Null | Null | icmp | 0.0.0.0/0 | IPv4 |
受信 | 65535 | 1 | tcp | 0.0.0.0/0 | IPv4 |
受信 | 65535 | 1 | udp | 0.0.0.0/0 | IPv4 |
受信 | Null | Null | 112(VRRP) | 0.0.0.0/0 | IPv4 |
「SG_LB」を ステートレスSG(stateful:false
)で設定する場合
方向 | ポートレンジmax | ポートレンジmin | プロトコル | セキュリティグループまたはCIDR | ethertype |
---|---|---|---|---|---|
送信 | Null | Null | Null | ::/0 | IPv6 |
送信 | Null | Null | Null | 0.0.0.0/0 | IPv4 |
受信 | Null | Null | icmp | 0.0.0.0/0 | IPv4 |
受信 | 65535 | 1 | tcp | 0.0.0.0/0 | IPv4 |
受信 | 65535 | 1 | udp | 0.0.0.0/0 | IPv4 |
受信 | Null | Null | 112(VRRP) | 0.0.0.0/0 | IPv4 |
「SG WEB internal」は、負荷分散対象仮想サーバ向け通信の送信元IPアドレスをIPCOMのIPアドレスに変換する設定例(src-napt)となります。
「SG WEB internal」を ステートフルSG(stateful:true
) で設定する場合
方向 | ポートレンジmax | ポートレンジmin | プロトコル | セキュリティグループまたはCIDR | ethertype |
---|---|---|---|---|---|
受信 | 80 | 80 | tcp | 192.168.10.10/32 | IPv4 |
「SG WEB internal」を ステートレスSG(stateful:false
)で設定する場合
方向 | ポートレンジmax | ポートレンジmin | プロトコル | セキュリティグループまたはCIDR | ethertype受信 |
---|---|---|---|---|---|
受信 | 80 | 80 | tcp | 192.168.10.10/32 | IPv4 |
送信 | 65535 | 1 | tcp | 192.168.10.10/32 | IPv4 |
Note
IPCOM(192.168.10.10)へ戻る通信も、送信ポートを特定できないため、1~65535を指定しています。
メリット・効果#
ステートレスSGを使用した場合、ステートフルSGに比べて以下のようなメリットがあります。
- より高いトランザクション性能を出せる
- より多くのコネクション(対地間接続、同時アクセス)を可能にする
それぞれのメリット・デメリットは以下のとおりです
ステートフル | ステートレス | |
---|---|---|
メリット | ・SGルール数を減らせる ・戻りの通信の記述が不要なため分かりやすい ・ポータル、APIともに設定可能 |
・ステートフルが持つ性能上のボトルネックを回避できる |
デメリット | ・通信量が多い場合、性能面でボトルネックになる可能性がある | ・行きと戻り双方向のルールを常に記載するため、管理が煩雑 ・ステートフルに対して単純にルール数が2倍になるため、設定上限数を気にする必要あり ・ポータル上で設定不可(2020年9月時点)、APIのみ設定可能 |
注意事項#
-
本パターンは、2020年9月時点のFJcloud-O 東日本/西日本リージョン3検証環境で動作検証しています。
-
ステートレスとステートフルのSGを同時に設定しないでください。FJcloud-O内に構築された同一システム内(=同一プロジェクト内)ではどちらかのSGに統一してください。 同時に設定した場合、ステートレスとステートフルのルール適用順序が保証されません。
-
FJcloud-Oの他システム(=別プロジェクト)、およびFJcloud-O以外のシステムと連携する場合、他システム側のSGがステートフルかステートレスかは影響しません。
-
ステートレスSGの場合、EgressとIngressのルールを両方記述する必要があります。SGの上限値を超えないようご注意ください。
東日本/西日本リージョン3における、1プロジェクトあたりのセキュリティグループルール数の上限値はデフォルト100となります。
上限の値が問題になりそうな場合は、ヘルプデスクまでご相談ください。
ステートレスSGの場合、逆方向ルールを動的に生成できず予め記載しておくことになるため、ファイアーウォールで保護された環境か、インターネット接続のないプライベート空間での使用が前提 となります。
その他#
検証時の構成例#
2020年6月時点のFJcloud-O 検証環境で性能測定した例となります。
- 疑似Internet環境にて、TPS性能測定を実施
- 負荷試験機:JMeter
- Load Balancer:IPCOM (フレーバ:C3-4)
- Webサーバ:CentOS 7.3 (フレーバ:C3-4)
- SGルール:構成例②に示したSGルールを踏襲
性能測定の構成例にて、SGルールをStatefulとStatelessに設定した際のTPS性能を比較した場合、Statefulに比べてStatelessにて3.5倍程度の性能向上が見込まれます。
- コネクション数の算出方法
仮想サーバあたり、送信IPアドレス×受信IPアドレス×送信ポート数×受信ポート数×プロトコル数の組み合わせ×VMにアタッチされているポート数 で算出します。