#===============================================================================
#
#【スタックでセキュリティグループを更新するサンプル】
#
# ○スタック更新パターン
# SG_test_A:テンプレート上に SG_test_Bに対する ingress/egress ルールを追加
# SG_test_B:テンプレート上に SG_test_Aに対する ingress/egress ルールを追加
# SG_test_C:テンプレート上に ルール設定無し
# SG_test_D:テンプレート上に ルール設定無し
#
# ○留意事項
# SG_test_A の中に SG_test_B のルールを設定し、かつ、
# SG_test_B の中に SG_test_A のルールを設定したい場合は、
# スタックの更新で設定する
#
# ※少なくともいずれか1つのセキュリティグループのIDが必要となるため、
# スタックの新規作成時では上記のような設定は出来ない
#
#===============================================================================
heat_template_version: 2013-05-23
description: Security Group Update
parameters:
SG_test_A_id:
type: string
# default: ********-****-****-****-************
default:
##################################################
# defaultの値には、スタック作成により作成された #
# セキュリティグループのIDを設定する #
##################################################
SG_test_B_id:
type: string
# default: ********-****-****-****-************
default:
##################################################
# defaultの値には、スタック作成により作成された #
# セキュリティグループのIDを設定する #
##################################################
resources:
SG_test_A:
type: OS::Neutron::SecurityGroup
properties:
name: SG_test_A
rules:
# セキュリティグループ SG_test_B との間で 双方向に sshを許可
# 以下のように、ルールを複数行で記載することもできる
- direction: ingress
ethertype: IPv4
port_range_max: 22
port_range_min: 22
protocol: tcp
remote_mode: remote_group_id
remote_group_id: { get_param: SG_test_B_id }
# get_param 関数で、parametersセクションで設定した
# セキュリティグループIDの値を取得している
- direction: egress
ethertype: IPv4
port_range_max: 22
port_range_min: 22
protocol: tcp
remote_mode: remote_group_id
remote_group_id: { get_resource: SG_test_B }
# get_resource 関数で、resourcesセクションで定義した
# セキュリティグループのIDを取得できる
#
# ★注意
# SG_test_A で "remote_group_id: { get_resource: SG_test_B }" と設定した場合、
# SG_test_B で "remote_group_id: { get_resource: SG_test_A }" と設定できない
# 別々のセキュリティグループが相互に get_resource 関数で
# お互いの ID を参照することはできない
# ■スタック更新後の SG_test_A の更新状況
#
# スタックの Update で、egressのルールがあれば、
# セキュリティグループのルールはすべて置換される
#
# 上記のルール設定により、SG_test_A は、
# スタック更新完了時には以下のように更新される
#
# ○スタック更新前
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │egress │IPv6 │(空) │- │(空) │
# │egress │IPv4 │(空) │- │(空) │
# └─────┴───────┴──────┴─────┴──────┘
#
# ○スタック更新後
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │ingress │IPv6 │tcp │22 │SG_test_B │
# │egress │IPv4 │tcp │22 │SG_test_B │
# └─────┴───────┴──────┴─────┴──────┘
SG_test_B:
type: OS::Neutron::SecurityGroup
properties:
name: SG_test_B
rules:
# セキュリティグループ SG_test_A との間で 双方向に sshを許可
# 以下のように、ルールを複数行で記載することもできる
- direction: ingress
ethertype: IPv4
port_range_max: 22
port_range_min: 22
protocol: tcp
remote_mode: remote_group_id
remote_group_id: { get_param: SG_test_A_id }
- direction: egress
ethertype: IPv4
port_range_max: 22
port_range_min: 22
protocol: tcp
remote_mode: remote_group_id
remote_group_id: { get_param: SG_test_A_id }
# SG_test_A で "remote_group_id: { get_resource: SG_test_B }" を設定しているため、
# SG_test_B で "remote_group_id: { get_resource: SG_test_A }" を設定できない
# SG_test_A と SG_test_B とで相互で設定するためには、
# SG_test_B の方でセキュリティグループのIDを get_param 関数で指定する
# ■スタック更新後の SG_test_B の更新状況
#
# スタックの Update で、egressのルールがあれば、
# セキュリティグループのルールはすべて置換される
#
# 上記のルール設定により、SG_test_B は、
# スタック更新完了時には以下のように更新される
#
# ○スタック更新前
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │egress │IPv4 │tcp │22 │0.0.0.0/0 │
# └─────┴───────┴──────┴─────┴──────┘
#
# ○スタック更新後
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │ingress │IPv6 │tcp │22 │SG_test_A │
# │egress │IPv4 │tcp │22 │SG_test_A │
# └─────┴───────┴──────┴─────┴──────┘
SG_test_C:
type: OS::Neutron::SecurityGroup
properties:
name: SG_test_C
rules:
# ルール無し設定
# ■スタック更新後の SG_test_C の更新状況
#
# スタックの Update で、セキュリティグループのデフォルトの egressルールを空にすることはできない
# スタックではなく手動でルールを削除すれば、セキュリティグループのルールを空にすることはできる
#
# 上記のルール無し設定により、SG_test_C は、
# スタック更新完了時には以下のように更新される
#
# ○スタック更新前
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │egress │IPv6 │(空) │- │(空) │
# │egress │IPv4 │(空) │- │(空) │
# │ingress │IPv4 │tcp │22 │0.0.0.0/0 │
# └─────┴───────┴──────┴─────┴──────┘
#
# ○スタック更新後
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │egress │IPv6 │(空) │- │(空) │
# │egress │IPv4 │(空) │- │(空) │
# └─────┴───────┴──────┴─────┴──────┘
SG_test_D:
type: OS::Neutron::SecurityGroup
properties:
name: SG_test_D
rules:
# ルール無し設定
# ■スタック更新後の SG_test_D の更新状況
#
# デフォルトの egressルール (スタックの新規作成時にSG_test_AとSG_test_Cに作成されたルール) が
# 存在しないセキュリティグループでも、セキュリティグループのルールを空にできない
# スタックではなく手動でルールを削除すれば、セキュリティグループのルールを空にすることはできる
#
# 上記のルール無し設定により、SG_test_D は、
# スタック更新完了時には以下のように更新される
#
# ○スタック更新前
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │egress │IPv4 │tcp │22 │0.0.0.0/0 │
# └─────┴───────┴──────┴─────┴──────┘
#
# ○スタック更新後
# ┌─────┬───────┬──────┬─────┬──────┐
# │方向 │Ethernetタイプ│IPプロトコル│ポート範囲│接続先 │
# ├─────┼───────┼──────┼─────┼──────┤
# │egress │IPv6 │(空) │- │(空) │
# │egress │IPv4 │(空) │- │(空) │
# └─────┴───────┴──────┴─────┴──────┘