$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サーバをぽこぽこ作れるようになったので良さそう。

「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」でAWSサーバ構築とCloudFormationに入門した

AWSのネットワークやサーバ構築の基本知識が欲しかったのと、CloudFormationでどうAWSの構成を作るかについて知りたかったので、「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」を読みながらCloudFormationの設定を作るということをやった。AWS CloudFormation への入門に「Amazon Web Services 基礎からのネットワーク&サーバー構築」を使ってみた - えいのうにっきのやり方を真似させてもらった感じ。

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

この本はAWSでのサーバ構築ハンズオンのような形で書かれているので、とにかく書かれている操作をやってみるとAWS上でサーバが構築されていって、AWSのサーバ構築の基本知識について学ぶことができた。これまでEC2については知っていたけど、VPC周りの知識は全くなかったが、この本によってAWSVPC、サブネット、ルートテーブル、インターネットゲートウェイ、セキュリティグループあたりの知識がだいぶ身に付いたと感じる。なので、AWSに入門したい!と思ったらまず読むものとして最適であった。


また、この本に従ってCloudFormationの設定も書いていった。書いたコードは https://github.com/shibayu36/aws-network-basis 。この本をトレースしながらCloudFormationで設定を書いていったのも非常に良かった。理由は

  • 今回使われるAWSコンポーネント達の仕組みをちゃんと理解しないと、CloudFormationの設定を書けないので、理解が進む
  • CloudFormationの入門を探すと、VPCを構築する設定例が出てくるが、そもそもVPCの設定自体が初心者にはとっかかりにくい。そのためVPCの設定と一緒に学ぶことで、CloudFormationの入門もしやすかった

PR形式でCloudFormationの設定を進めていって、https://github.com/shibayu36/aws-network-basis のREADME.mdにまとめたので、参考にどうぞ。


こんな感じで、この本を読みながらCloudFormationの設定を書いていくのが非常に勉強になった。非常に良い本だったのでおすすめです!!!

参考

CloudFormationで立ち上げたEC2に自動でApacheをインストールして起動するようにした

CloudFormationでVPCを構築し、CloudFormationに入門する方法を知った - $shibayu36->blog;CloudFormationでEC2の立ち上げをした - $shibayu36->blog; の続き。今回は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」のChapter4に従って、立ち上げたEC2で自動でApacheをインストールして起動するようにしてみた。

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版

やり方としては、インスタンス作成時に実行するスクリプトを定義できるUserDataという仕組みと、MetadataにAWS::CloudFormation::Initを定義していく方法の二つを利用する。

設定を行う

https://github.com/shibayu36/aws-network-basis/pull/3 が設定。これにより、EC2立ち上げ時にApacheをインストールして起動するまでを自動化することが出来た。

参考にしたのは以下の資料。

デバッグする

今回の設定を行うのは結構はまった。デバッグをどのようにしたかについても書いておく。

まずそもそもUserDataがちゃんと設定できているかは以下のコマンドで確認できる。参考: インスタンスメタデータとユーザーデータ - Amazon Elastic Compute Cloud

ssh <立ち上がったEC2>
curl http://169.254.169.254/latest/user-data

CloudFormationのMetadataが正しく設定できているかは以下のコマンド。aws cliを利用する。stack-nameやlogical-resource-idは自分が設定したのに置換すると良い。(あとコンソールで見れないのかな?と思ったけど、方法が分からなかった)

aws cloudformation describe-stack-resource --stack-name=aws-basis-network-cfn --logical-resource-id=EC2ForWebServer

さらにインスタンス作成時にUserDataのスクリプトが実行されたログを見たければ、/var/log/cloud-init.logや/var/log/cloud-init-output.logを見れば良い。

あとはログも見つつ、自分でUserDataに定義したスクリプトを一行ずつ実行していくと、どこが変になっているかわかりやすいのでおすすめ。


こんな感じで調べていったら、僕の場合は最初cfn-hupをUserDataに入れていたのだけど、これはいろいろ設定していないと起動しないことが分かった。なので、今回はその部分を消してうまくいくようになった。
https://github.com/shibayu36/aws-network-basis/pull/3/commits/eb8a043d36ef53155454c28a1099bfcadc2d769e