「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サーバのスタック作成の順で。
画像のとおり、二つのスタックが出来て、aws-network-basis-networkの出力タブにはエクスポートされた値が載っている。これでネットワーク設定とWebサーバ設定を分割できた。
あとはWebサーバ側に設定を増やしたり、Parametersのような仕組みを使って、PrivateIpAddressだけ変えられるようにしておけば、ぽこぽこWebサーバを作成することができそうですね。
まとめ
今回はCloudFormationのクロススタック参照を利用してネットワーク設定とWebサーバ設定を分けるようにしてみた。スタック設定を分割しておくと、あまり変えたくないネットワーク設定側をいじらずに、Webサーバをぽこぽこ作れるようになったので良さそう。