CloudFormationきっかけterraformは少々触ったことあるけど、AWSならCloudFormationがあり、どっちが良いんだろう?という素朴な疑問が出てきて、そもそもCloudFormation経験0じゃどうしようもないから触ってみようと思いました。́)ゴールCloudFormationの雰囲気を知る。入門する場所さがしエンジニアとしては公式ドキュメントを最初にみるべきでしょ、というスタンスで見たのがココ。うーん、入門しづらい...。Startedを読むことになるよこれだと。CloudFormationテンプレートによるインフラ構築です。Googleの検索結果としてはCloudFormation超入門の方が上に来ていたけれど、記事として新しいし、何より"5分と6行"って具体的な数字が提示されていると読む気になりますよね。CloudFormationテンプレートによるインフラ構築を読みつつ手を動かします。執筆者の濱田孝治さんの小粋な文章のおかげでサクサク読めますし、想定読者とゴールを文章の初めに出してくる所など、良い記事のお手本としても勉強になります。ブラックベルトを読めということらしい「まずは基本のBlackBeltから。CloudFormationへのリンクが大きく貼られているのでとりあえずクリックして開くと、90ページもある長大なスライドに少々気圧されますが、「ここでは基本的なCloudFormationの特徴(p4〜p19)あたりをみていただければ十分です。」と親切で優しいコメントでホッとしながらスライドを読みます。スライドはAWSジャパンの益子直樹さんが作成されたとのこと。基本部分をざっと読んでいくと冒頭(p4-p10)だけで以下のことが分かってきます。大規模環境作るならInfrastructure-as-codeでしょAWSでそれ(Infra-as-code)やるならCloudFormationがあるぜJSONやYAMLでテンプレートを作るんだベストプラクティスが盛り込まれたテンプレートが利用できるよCloudFormation自体の利用は無料だよ興味深いのはp11の"AWSから提供されているデプロイ&マネージメント関連サービス"という図。Deploy)やBeanstalkなども並べた上で、CloudFarmationの位置付けが"Provision"であることが明確に分かります。この図を見ることが出来ただけでも僕としては大満足な資料でした。CloudFormationCloudFormationが「簡単じゃないけど柔軟性がパない」サービスらしいことが分かります。そのままp90までスライドを読み進めるたくなりましたが、何はともあれ手を動かせよという心の声に従い濱田さんの記事に戻ります。濱田さんの解説でCloudFormationを理解していく記事では益子さんのスライドのポイント部分を引用しながら解説されています。「サービスごとの位置づけが俯瞰できるこういうスライドは、頭が整理されて非常にありがたい。」というコメントには何度も頷きつつ、テンプレートとスタックという用語について理解を進めます。テンプレート=YAML,JSONファイルスタック=テンプレートから作成されたAWS上のサービス群この時点では理解しました。いざ初めてのCloudFormationでのデプロイ!「一昔前は、テンプレートはJSONのみ対応で人間が編集するには辛いものがあったのですが、YAML対応により、簡単に人間の手でも設定ファイルを編集できるようになりました。素晴らしい!」とありますので、今後はYAML一択なんだと納得しつつサンプルファイルをコピペします。10.0.0.0/16ここでタイトルの6行のテンプレートを放り込みます。5クリックほどでVPCを作成することができました。テンプレートの中身を理解する6行のVPC作成テンプレートの解説を読みます。6行なので怖くありませんし、モチベーションも下がらずありがたいです。公式ドキュメントへのリンクもあり、この時点でやっと日本語公式ドキュメントの存在を知ります。(日本語のCloudFormation紹介ページから日本語CloudFormationユーザガイドへの導線が無いんじゃ...?)AWSTemplateFormatVersionAWSTemplateFormatVersionについてはお作法とのことで、そういうものとして納得します。任意項目のようですが将来バージョン更新が入る可能性を考えると記載しておいたほうが良さそうです。これで6行の中の1行について理解できました。ResoucesResourcesが利用したいAWS上のサービスを記載するところです。6行の中の5行を占めていますからメインの部分であることは間違いありません。IDにはテンプレート内でユニークな名前を記載します。このあたりは企業・プロジェクトの文化に依存するところですね。IDを利用しても競合はしませんでした。typeに具体的なサービスを書いていくそうです。リソースプロパティタイプのリファレンスへのリンクが紹介されています。以下のようなリソースが大量に(この時点では241個)記載されており、今後もサービス増加に合わせて増えて行くことでしょう。AWS::EC2::EIPAWS::EC2::InstanceAWS::RDS::DBClusterAWS::RDS::DBInstanceネーミングルールは「AWS::<サービス名>::<サービス要素(正しい言葉が不明)>」という形のようですね。サービスごとにいくつの要素があるかを確認してみました。WorkSpacesダントツで38個も要素を持つEC2が多いですね。次点は18個のApiGatewayでした。EC2でできること沢山あるんだなぁという小並感を持ちます。properties前述した各Resourceに指定するプロパティです。「公式ドキュメントとにらめっこしながら、指定していきます。あれこれって?Ansibleでやったことあるやつじゃん?ここまでやって強烈な既視感を覚えます。Ansibleでさんざんやってきたことと同じなのです。僕は日頃からサーバ構成をAnsibleで行っています。本番機へデプロイとなります。この流れがCloudFormationにもそのまま適応できそうです。重要なのはCloudFormationに詳しい云々の前に、AWS上で何をしたいか(プロビジョンしたいか)をちゃんと決めるということで、AWSの知識が前提とされていることがよくわかりました。VPCだけではなく、VPCに必要なインターネットゲートウェイなども含むテンプレートをデプロイします。構成図もきちんと載せてくれていますのでイメージもしやすいです。濱田さんマジありがとう。以下がコードになります。FrontendRouteTable6行から50行に大幅ボリュームアップしていますが、Ansibleで鍛えたYAML力を発揮して読んでいきます。IDは任意の文字列を人間が決めているのでWhyやwhatを読み取る(できれば)落ち着いて(必要なら公式ドキュメントを開き)プロパティを読んでいくというところです。今後本格的にCloudFormationを使っていくうちに変わるかもしれないですが、Type行だけ抜くのは初めて読むテンプレートを理解するのに良いやり方じゃないかなと思ったりします。50行が7行に一旦落とし込めるし。AWS::EC2::SubnetRouteTableAssociationわおシンプル><組み込み関数6行サンプルには無かったものとして、組み込み関数"!Ref"についての解説がされています。ID>という形で表現するそうです。「こういうふうに関連するリソースが多々あるものについては、一つのテンプレートファイルにまとめて、リソースIDを!Refで参照させるのが、CloudFormationテンプレートを作成するときの重要なお作法。他にもいくつかの組み込み関数があるそうですので公式ドキュメントをご参照くださいとのこと。現在の組み込み関数は以下の通り。Fn::Base64条件関数(And,Equals,if,Not,Orなど)Fn::FindInMapFn::GetAttFn::GetAZsFn::ImportValueFn::JoinFn::SelectFn::SplitFn::SubRef上のFn::hogeという書き方は、YAMLの場合は短縮形の!hogeと書くこともでき、サンプルは専ら短縮形なので混乱しないよう注意しましょう。続いてDependsOn属性についての説明があります。!Refを使用すると暗黙的な依存関係が適用されるそうですが、DpendsOn属性を使えば明示的に宣言できるとのこと。Properties:「記事のまとめと、今後の学習指針」を読んでのまとめサブネットやルーティングを備えたちゃんとしたVPCを作成できた達成感に浸りながら(濱田さん製サンプルYAMLを流し込んだだけですが)濱田さんのまとめを読みます。最小構成で始めて基礎を理解していくことがオススメと理解しました。効率の良い学び方も提示されていて大変ありがたい。(具体的な項目は今日何度目かわかりませんが元記事を参照)そしてDevelopers.IOのCloudFormation関連のカテゴリへのリンクがあり、興味深い記事が多くあることを知りました。【CloudFormation入門2】テンプレート作成を効率化するバリデーション機能と自動実行シェルの紹介の記事があることも発見しました。益子さんのブラックベルトスライドもきちんと読んで理解したいところ。今後も「俺のCloudFormation道は始まったばかりだぜ!」な意気込みで触りながら理解を深めて行きたいと思います。CloudFormationテンプレートによるインフラ構築は本当に良記事なのでCloudFormation入門者は皆読んで幸せになって欲しい!おすすめですよ。参加してきましたS3のWebページリダイレクト機能を試す2020年の目標ALBとTargetGroup一式をTerraformにimportしてみる2019年の振り返り月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。