$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

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

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

やり方としては、インスタンス作成時に実行するスクリプトを定義できる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

CloudFormationでEC2の立ち上げをした

CloudFormationでVPCを構築し、CloudFormationに入門する方法を知った - $shibayu36->blog; の続き。今回は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」のChapter3に従って、EC2の立ち上げとセキュリティグループの設定をした。


設定したPRは https://github.com/shibayu36/aws-network-basis/pull/2 。今回はそんなに難しくなかったのだけど、はまったところとしては

  • コンソールでの操作の流れと違い、セキュリティグループは先に作り、EC2に割り当てるという風にしないといけない
    • コンソールだと、EC2作成の時にセキュリティグループを新しく作成できる
  • ImageIdはami-***というのを直接指定したほうが楽
    • なんかマッピングを作ってそこから取り出すとかやっているところもあった
  • VPC内に作るEC2にセキュリティグループを割り当てるときは、NetworkInterfacesの設定の中にセキュリティグループ割当の設定を書く

という感じ。


終わり。

CloudFormationでVPCを構築し、CloudFormationに入門する方法を知った

最近CloudFormationに入門しようとしている。それで、AWS CloudFormation への入門に「Amazon Web Services 基礎からのネットワーク&サーバー構築」を使ってみた - えいのうにっきの記事をみて、これはいい入門の仕方だなあと思い、「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」を購入して、CloudFormationで構築するということをやっている。

今回はChapter2の「ネットワークを構築する」をCloudFormationでやってみた。

CloudFormationの概念や使い方を理解するには

やってみようとすると、まずCloudFormationの概念を理解するのに戸惑う。公式のチュートリアルを見ても、???となるだけだった。そこで参考にしたのが以下の資料。

dev.classmethod.jp

ただし、これを読んだだけだと、「入門3 VPCにサブネットやルーティングテーブルやインターネットゲートウェイを構築する」の設定ファイルの記述量がそこそこある & 僕はVPCをちゃんと触ったことが無かったなどの理由から、ちゃんと理解は出来なかった。

そこで、一気にVPCを全部構築するのではなくて、「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」で解説されているコンソールでの操作を模倣するように、一つずつリソース定義して実行を繰り返してみた。これをすると、だいぶ理解が進んで、自分で考えてCloudFormationの設定ができるようになった。

こういう感じで進めていくのがおすすめ。また https://github.com/a-know/aws-network-basicid:a-know さんが構築していった記録が残っているので、これを見ると作ってく様子をトレースできるのでおすすめ。

CloudFormationでVPCの設定

YAMLで定義した。https://github.com/shibayu36/aws-network-basis/pull/1 のPRのとおり。

どういう流れで進めていったかというと、

  • 例えば、本でVPCを作る操作をしているのを見るとすると
  • 本の操作をコンソールで実際にやってみて、VPCを作る
  • 「cloudformation vpc」でググると、AWS::EC2::VPC - AWS CloudFormationが出て来る
  • これに従って、自分で定義を書いてみる
  • CloudFormationで実行する
  • 自分でコンソールで作ったのと、CloudFormationで作ったものの情報を見比べて、同じものが出来ていることを確認する

という流れで、パブリックサブネット作成や、インターネットゲートウェイの作成・アタッチなどなどを一つずつ行った。一気にやると何がおかしくなったのかわからなくなるので、一つずつ記述して実行してみるというのがポイント。

まとめ

今回は「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版」のChapter2の「ネットワークを構築する」をCloudFormationでやってみた。CloudFormationの考え方を理解できて非常に良かった。