$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

CloudFormationのクロススタック参照を利用してネットワーク設定とWebサーバ設定を分ける

「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」でAWSサーバ構築とCloudFormationに入門した - $shibayu36->blog;で、サーバ構築を1ファイルで行い、CloudFormationの1スタックでネットワーク設定もWebサーバ設定もDBサーバ設定も書いていた。しかし考えてみると

  • ネットワーク設定はほぼ変わらないのであまり触りたくないはずだけど、Webサーバはぽこぽこ新しいのを作りたくなりそう
  • 全ての設定が1ファイル1スタックで行われているのは、管理が大変そう

と思った。

調べてみるとクロススタック参照というのを利用すると、スタックを分けて設定できるようだった。そこで、これを利用し、ネットワーク設定とWebサーバ設定を分けるようにしてみた。

スタック設定の分割を行う

参考になったのは AWS CloudFormation の更新 – YAML、クロススタック参照、簡略化された置換 | Amazon Web Services ブログ の記事。これによると、参照される側はOutputsを利用して設定をエクスポートし、参照する側はImportValueを利用して設定を読み込めば良いようだ。よって次の作戦で良い。

  • ネットワーク設定では、WebサーバのEC2インスタンス設定に利用するサブネットとセキュリティグループの設定をエクスポートする
  • Webサーバの設定では、!ImportValueを利用して、設定を読み込む

やってみた結果がこちら。

大体元々の全部入りの設定と同じ。違うところとしては二つ。一つ目はネットワーク側の以下の部分で、aws-network-basis:PublicSubnetやaws-network-basis:SecurityGroupForWebServerという名前で別スタックから参照できるようにしているところ。

Outputs:
  PublicSubnet:
    Value: !Ref PublicSubnet
    Export:
      Name: aws-network-basis:PublicSubnet
  SecurityGroupForWebServer:
    Value: !Ref SecurityGroupForWebServer
    Export:
      Name: aws-network-basis:SecurityGroupForWebServer

二つ目はWebサーバ側でImportValueを使って読み込んでいるところ。

      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: 0
          DeleteOnTermination: true
          PrivateIpAddress: 10.0.1.10
          SubnetId: !ImportValue aws-network-basis:PublicSubnet
          GroupSet:
            - !ImportValue aws-network-basis:SecurityGroupForWebServer

これで設定ファイルの作成は完了。

設定を使ってスタックを作成する

コンソールのスタック作成から行う。ネットワークのスタック作成 -> Webサーバのスタック作成の順で。

f:id:shiba_yu36:20180417074102p:plain

画像のとおり、二つのスタックが出来て、aws-network-basis-networkの出力タブにはエクスポートされた値が載っている。これでネットワーク設定とWebサーバ設定を分割できた。

あとはWebサーバ側に設定を増やしたり、Parametersのような仕組みを使って、PrivateIpAddressだけ変えられるようにしておけば、ぽこぽこWebサーバを作成することができそうですね。

まとめ

今回はCloudFormationのクロススタック参照を利用してネットワーク設定とWebサーバ設定を分けるようにしてみた。スタック設定を分割しておくと、あまり変えたくないネットワーク設定側をいじらずに、Webサーバをぽこぽこ作れるようになったので良さそう。