(Google+)39この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。訓練されたアップル信者、都元です。方は、ひとまずCloudFormation入門を読んでみてください。ところで、EC2において「何らかの役目を持ったサーバ」を立てる場合、方針は大きく分けて2つあります。1つ目は「プレーンなAMIからサーバを立ち上げ、必要なものをインストール及び設定し、そのAMIを取得。この機能特化AMIからインスタンスを立ち上げる」という方針。1つは「機能特化したAMIは作らず、プレーンなAMIにUserDataを与え、起動したら勝手に特化するように仕組む」という方針です。前者は、AMIさえ作ってしまえば、あとはそれを立ち上げるだけですので、そういった面から見れば非常に運用が楽です。AMIというのはある意味ブラックボックスですので、同じAMIを再現する手順はきちんと管理しなければすぐに迷子になってしまうでしょう。Code)されますので、その辺りは安心です。今流行のChefも同じような考え方ですね。Chefは主に、起動したサーバの内部でミドルウェアのインストール状態や設定等を再現可能な方法で記述するのに活用されています。CloudFormationはその一つ外側、AWSの世界に特化した各リソースの構成を再現可能な方法で記述するのが主な役割です。言え、簡単なものであれば、Chefを使わなくても初期化・構築は可能です。UserDataを使えば。EC2のUserDataを使ったインスタンスの初期化・構築これはCloudFormation入門でもさらっとご紹介した手法ですね。]]}}これはこれで非常にお手軽な手なので、手順がシンプル場合は是非活用すべきです。ファイルをダウンロードしてzipを展開して配置する等、処理が複雑になって来ると、何かと機能的に物足りなくもなって来ます。記述も複雑になり可読性も低下しますし、例えばダウンロードに失敗した場合はスタックの作成を中止/ロールバックしたい、といった要件も出て来たりします。実際CloudFormationをガツガツ使い始めると、構築がこの程度で済むケースは半数程度です。複雑になってきた場合は、どうすればいいでしょうか。cfn-initを使ったインスタンスの初期化・構築このような初期化・構築の仕組みとして、CloudFormationはcfn-initというヘルパースクリプトを用意しています。*1のでgistに上げました。読者の皆さんは、まずはきっちり読む必要ありません。以下のポイントに注目して、眺めてみてください。Roleを定義し、Webサーバに割り当てている。UserDataで、何やらcfn-init等のスクリプトを起動している。EC2Instanceリソースに、何やら"Metadata"という見慣れないプロパティが定義してある。この値はPropertiesの子(child)ではなく、Propertiesの兄弟(sibling)に位置している。AWS::CloudFormation::WaitConditionHandleやAWS::CloudFormation::WaitConditionという見慣れないリソースが定義してある。読む起点はここですね。UserDataに定義したスクリプトが実行されます。updateするのはお好みで。]]}}続いてerror_exitという関数を定義しておきます。中身ではcfn-signalというスクリプトを呼んでいます。このスクリプトの-eオプションとして0を与えた場合、「リソースの生成成功」というシグナルをCloudFormationに通知します。なく非0だった場合は、「リソースの生成失敗」を通知することになります。completeというメッセージと共に、成功の通知をしているのが分かりますね。大事なのはcfn-initスクリプトの呼び出しです。このスクリプトを呼び出したタイミングで、以下の処理が動きます。yum等による各種パッケージのインストールs3cmd-1.5.0-alpha3.tar.gzをダウンロードし、/opt以下に展開。初期化・構築に必要な基本的な要素はだいたい押さえられていますね。実際にどのようなパッケージをインストールするか等の定義は、以下の部分に書かれています。どのような記述ができるのか、詳細はドキュメントを参照して下さい。}Chefでは繰り返し実行できる「冪等性」という性質が大事な要素ですが、そのような性質が要らない場合、つまり初回起動時に決まった形を構築するだけであれば、「cfn-initを使ってで全て定義してしまう」というのはバランスの良い選択ではないでしょうか。最後にAWS::CloudFormation::WaitConditionHandleとAWS::CloudFormation::WaitConditionリソースですが、これは、いつまで経ってもcfn-signalで成功のシグナルが飛んで来なかった場合や、cfn-signalにより失敗が通知された場合にスタックの生成全体を失敗させる仕組みとして使われています。書き方はほとんどイディオムなので、このままコピペで構いません。}ちなみにAWS::CloudFormation::WaitConditionにはCountというプロパティがありまして、デフォルト値は1となっています。成功シグナルを1回受信したら成功とする、という動きをします。この値を、AutoScalingのDesiredCapacityと一致させたりすると...。うはww夢がひろがりんぐwwwというわけで、このテンプレートを走らせてみると、TomcatとPHPが共存した不思議なサーバの出来上がりです。試してみたい方は、yumに存在しないパッケージをMetadataに指定してみたりして、スタックの生成が失敗するかどうか、試してみるのも良いと思います。cfn-init等のスクリプトは内部でCloudFormationのAPIを叩いています。いうことはAPIキー及びシークレットが必要ですよね。Roleで賄われています。Role機能が登場する前の古い情報に当たった場合、cfn-initコマンド呼び出し時に、その引数にAPIキー及びシークレットを渡している例を見かけるかもしれません。その情報では、この引数として渡すためのAWS::IAM::Userを作成し、そこからAWS::IAM::AccessKeyを使って...、ということをしていると思います。resources」というチェックボックスにチェックを入れなければならなくなり...。当時は面倒臭かったんですねー。Roleを使うことによって、このような手間は一切不要になりました。Management脚注CloudFormationって、本気で書いてるとすぐ数百行行っちゃうんですよねー。数千行でもビビらなくなりましたが。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。濱田孝治253re:Invnetの動画検索でもめちゃくちゃ便利ですが、その他ブログやホワイトペーパーやGitHubも横断検索できるので、是非一度使ってみてください。CAFEの他、NTTデータとセブンイレブンの取り組みや、サインポスト、Zippinなどの各社と流通・小売業との連携を業界マップに作成してみました。PolicyのConditionにaws:CalledViaというキーが追加されました。いったキーなのかご説明します。夏目祐樹409こんにちは、CX事業本部の夏目です。MacのタッチバーのタッチIDが非常に便利なのですが、Terminalでsudoを叩かないと行けないときに使えたらなぁと思ったので、情報を共有します。臼田佳祐295ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介256SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。濱田孝治253re:Invnetの動画検索でもめちゃくちゃ便利ですが、その他ブログやホワイトペーパーやGitHubも横断検索できるので、是非一度使ってみてください。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。