テンプレートを使用したセキュリティグループの作成#

本構成は東日本/西日本リージョン1・2向けとなります。

要求事項#

仮想サーバやロードバランサー等のリソースや、ファイアーウォールやセキュリティグループのルール等、何度も利用する構成を定型化して、以下のような要求事項に対応します。

  • システムを一括で配備したい(自動化)
  • 開発/検証/本番等の環境を同一の内容で構築したい
  • 他のシステムでも再利用できるようにしたい、

対応するデザインパターン概要#

FJcloud-Oでは、システム上で提供される複数の仮想リソースを使用して、環境を自動で構築するオーケストレーション機能が提供されています。

オーケストレーション機能では、仮想ルータ、サブネット等のネットワークの設定や、ロードバランサー、仮想サーバ等のサーバの設定、 ファイアーウォールやセキュリティグループ等のアクセス制御設定等のシステムのかたまりを、スタックとして扱います。

スタックをYAML形式のテキストで定義したものをテンプレートと呼びます。
テンプレートをIaaSポータルやAPI経由で投入すると、オーケストレーション機能が働いてシステムを一括で構築することが出来ます。

本パターンでは、セキュリティグループを作成/更新するテンプレートを例として、スタックの作成/更新、およびスタックの削除を記載します。

Note

本パターンでは、以下を目的として記載しています。

  • テンプレートを使って スタックの作成/更新 の概要と手順を理解すること
  • テンプレート配備の上で、他の仮想リソースとは違う固有の考え方が必要なセキュリティグループの配備について理解すること
  • テンプレートの記載範囲 について検討が推奨されることを理解すること

  • セキュリティグループ以外の、実際のテンプレートの活用例は、以下を参照してください。
  • HEATテンプレート解説書
  • 構造 (イメージ図)#

    本パターンはセキュリティグループを作成/更新するだけのため、システム構成のイメージ図は省略します。

    実装サンプル#

    1. スタックの作成#

    (1) テンプレートの内容#

    テンプレートでは、以下のセキュリティグループを設定します。

    セキュリティ
    グループ
    テンプレート内容 スタック作成で設定されるセキュリティグループのルール
    SG_test_A ルール無し             egress のルールが1つも無い場合、デフォルトの egressルールが作成されます
    SG_test_B egress のルールを1つ設定                 設定した egress ルールのみ 作成されます
    SG_test_C ingress のルールを1つ設定                 設定したingress ルールと、デフォルトの egressルールが作成されます
    SG_test_D egress のルールを1つ設定 SG_test_Bと同じ

    Note

  • ここでは、セキュリティグループのルールの設定の仕方 (どういう設定が推奨されるか等) は記載しません。
     セキュリティグループをスタックで作成した場合に、どのようにセキュリティグループが作成されるかを記載しています。
  • セキュリティグループでは、セキュリティグループの作成時に、デフォルトの egress ルールを作成する機能があります。
     そのため、スタックの作成時に、テンプレートに記載した内容と実際に作成されるスタックの内容が異なる場合があります。
      テンプレート作成時の参考にしてください。
  • (2) スタックの作成#

    IaaSポータルでは、以下の手順でスタックを作成します。

    • 「テンプレート」⇒「スタック」と選択した画面で、画面右上の「+」ボタンをクリックします。
    • 以下を入力して「作成」をクリックすると、「スタック」画面に戻り、スタックが "CREATE_IN_PROGRESS" というステータスで作成中になります。
    項目 設定値例 備考
    スタック名 sample_stack 任意のスタック名を指定
    英数字と、"_"、"-"、"." のみ使用可。先頭文字は英字。
    テンプレート
    指定方法
    YAML 以下よりテンプレートの指定方法を選択
  • URL
  • ファイル
  • YAML
  • テンプレート
    ファイル                                
    (以下のテンプレートの内容を編集したものをコピー/ペースト)
    HOT_SG_stack_sample1
    テンプレートの指定方法に合わせて、項目名が以下のように変化
  • URL
  • ファイル
  • YAML
  • タイムアウト
    (分)
    10分 任意の値を入力
    失敗時のリソース削除                 「削除する」をチェックしない テンプレート実行失敗時に、失敗するまでに作成したリソースを削除する場合はチェックをする

    Note

    既存のセキュリティグループ数やセキュリティグループルール数との合計がプロジェクトの制限値を超える場合は、スタック作成が失敗するか、またはルールが一部作成されないで作成完了します。

    • しばらく時間をおいて、「スタック」画面をリロードします。
      スタックの作成が完了していると、ステータスが "CREATE_COMPLETE" となります。
      スタックの作成が失敗していると、ステータスが "CREATE_FAILED" となります。

    (3) スタックの確認#

    スタックが作成されたら、テンプレートの内容と実際の設定状況を照合して確認してください。

    Note

    スタックが "CREATE_COMPLETE" となっていても、セキュリティグループのルール数が制限値を超えていて、ルールが作成されていない場合があります。

    2. スタックの更新#

    (1) テンプレートの内容#

    テンプレートでは、以下のセキュリティグループを更新します。

    セキュリティ
    グループ
    テンプレート内容 スタック更新で設定されるセキュリティグループのルール
    SG_test_A SG_test_Bに対する ingress/egress ルールを追加                                 egress のルールがあるため、設定したルールが作成されます
    SG_test_B SG_test_Aに対する ingress/egress ルールを追加                                 egress のルールがあるため、設定したルールが作成されます
    SG_test_C ルール設定無し                                 更新前の状態にかかわらず、デフォルトの egressルールが作成されます
    SG_test_D ルール設定無し                                 更新前の状態にかかわらず、デフォルトの egressルールが作成されます

    Note

    セキュリティグループでは、上記表の SG_test_A と SG_test_B のように、相互に設定する場合が多くあります。
    テンプレートを用いてセキュリティグループを相互に設定した場合には、本パターンのようにまずセキュリティグループを作成し、その後にスタックの更新でセキュリティグループのルールを設定してください。
    なお、スタックの作成時に、セキュリティグループを相互に設定することはできません。

    (2) スタックの更新#

    IaaSポータルでは、以下の手順でスタックを更新します。

    • 「テンプレート」⇒「スタック」と選択した画面で、更新したいスタックの「アクション」メニューから、「編集」をクリックします。
    • 以下を入力して「更新」をクリックすると、「スタック」画面に戻り、スタックが "UPDATE_IN_PROGRESS" というステータスで更新中になります。
    項目 設定値例 備考
    スタック名 (スタック名) 更新対象となるスタック名が表示される
    テンプレート指定方法 YAML 以下よりテンプレートの指定方法を選択
  • URL
  • ファイル
  • YAML
  • テンプレートファイル (以下のテンプレートの内容を編集したものをコピー/ペースト)
    HOT_SG_stack_sample2
    テンプレートの指定方法に合わせて、項目名が以下のように変化
  • URL
  • ファイル
  • テンプレートファイル
  • テンプレートに渡すパラメータ (設定済の値) スタックの作成時に、テンプレートの parameters セクションで定義された値があれば表示されます。
    スタックの更新時に、テンプレートの parameters セクションに同じ項目が定義されているとエラーになります。
    テンプレートに同じ項目がある場合は、IaaSポータルでは削除してください。
    タイムアウト(分) 10分 任意の値を入力

    Note

    既存のセキュリティグループ数やセキュリティグループルール数との合計がプロジェクトの制限値を超える場合は、スタック更新が失敗するか、またはルールが一部更新されないで更新完了します。

    • しばらく時間をおいて、「スタック」画面をリロードします。
      スタックの更新が完了していると、ステータスが "UPDATE_COMPLETE" となります。
      スタックの更新が失敗していると、ステータスが "UPDATE_FAILED" となります。

    (3) スタックの確認#

    スタックが更新されたら、テンプレートの内容と実際の設定状況を照合して確認してください。

    Note

    スタックが "UPDATE_COMPLETE" となっていても、セキュリティグループのルール数が制限値を超えていて、ルールが更新されていない等がありえます。

    3. スタックの削除#

    (1) スタックの削除#

    IaaSポータルでは、以下の手順でスタックを削除します。

    • 「テンプレート」⇒「スタック」と選択した画面で、削除したいスタックの「アクション」メニューから、「削除」をクリックします。
    • 「スタック削除の確認」ウィンドウがポップアップされます。確認して「削除」をクリックします。
      「削除」クリックすると、「スタック」画面に戻り、"DELETE_IN_PROGRESS" というステータスで削除中になります。
    • しばらく時間をおいて、「スタック」画面をリロードします。
      スタックの削除が完了していると、スタックが一覧からなくなっています。
      スタックの削除が失敗していると、ステータスが "DELETE_FAILED" となります。

    Warning

    スタックを作成中/更新中に、スタックを削除しないでください。
    "DELETE_FAILED" となって、スタックが削除できなくなる可能性があります。

    メリット・効果#

    テンプレート配備 パターンを利用した場合のメリット・効果は以下の通りです。

    • 何度も利用する構成を定型化 (=テンプレート化) することにより、容易に、システムを一括で配備することが可能
    • 開発/検証/本番等の環境等、同一の内容で環境を構築したい場合に、容易に、複数の環境を同じ内容で配備することが可能
    • テンプレートを流用したり再利用することで、構築コストを低減可能

    注意事項#

    • 本パターンは2017年5月時点のFJcloud-O 東日本/西日本リージョン1・2で動作検証しています。
    • テンプレートでは、パラメータによりスタック作成時にしか指定できず、スタックの更新で変更ができないパラメータがあります。
      パラメータごとの詳細は HEATテンプレート解説書 でご確認ください。
    • テンプレートに設定したパラメータがプロジェクトの制限値を超えている場合は、スタック作成/更新が失敗したり、スタック作成/更新が完了していても不備が出たりする場合があります。

    その他#

    テンプレートへの記載範囲について#

    スタックを作成/更新で使用するテンプレートは、1つのテンプレートすべてまとめて記載するのではなく、複数のテンプレートに分割することを推奨します。
    1つのテンプレートにどこまでの内容を盛り込むか、以下の観点での検討してください。

    (1) システムに対する変更のタイミングによる検討#

    システムに対する変更のタイミングが重なることが想定される内容により、記載内容を分割します。

    具体例としては、以下の内容で区分すること等があげられます。

    • 仮想ルータやネットワーク系のテンプレート
    • ファイアーウォール用のテンプレート(頻繁に変更が入ることを想定)
    • セキュリティグループ用のテンプレート(頻繁に変更が入ることを想定)
    • オートスケールのテンプレート
    • NASサーバのテンプレート等々

    (2) 設定方式よる検討#

    本パターンで記載したセキュリティグループでは、スタックの新規作成時に、以下のように相互参照をするセキュリティグループをまとめて作成することはできません。

    設定対象
    セキュリティグループ名
    接続先 方向 プロトコル
    SG_a SG_b 送信 ssh
    SG_b SG_a 受信 ssh

    セキュリティグループについては、以下のような分割の方式が考えられます。

    • セキュリティグループをテンプレートのみで作成
      相互参照を含むセキュリティグループをテンプレートのみで作成する場合は、本パターンで記載したように、新規作成用と更新用のテンプレートを作成します。
      新規作成用のテンプレートでセキュリティグループを作成し、更新用のテンプレートでルールを設定します。
      新規作成用テンプレートと更新用テンプレートを残しておくことで、ある時点での設定状態を残しておくことが可能です。
      なお、セキュリティグループのテンプレートを他システムで流用できるようにする等、再利用性を高めるためには、セキュリティグループに何らか変更を加える際に、新規作成用のテンプレートと更新用のテンプレートで整合性がとれるよう留意してください。

    • セキュリティグループのグループをテンプレートで作成し、APIでセキュリティグループのルール追加/削除
      テンプレートと APIを併用する方式です。
      APIは、テンプレートよりも逐次変更に向いています。
      逆に、逐次変更であることから、ある時点のセキュリティグループの状態を再現するという用途には不向きです。
      API処理をシェルスクリプト化する等、再現性を高める工夫が必要になります。

    • セキュリティグループのグループを APIで作成し、APIでルール追加/削除テンプレート化を行わない、という選択もあります。
      システムの再利用性を高めるにはテンプレートは適していますが、類似のシステムを作ることがないのであれば、利用者が手慣れた手段 (APIまたはIaaSポータル) でセキュリティグループを設定することも合わせて検討してください。