連載第4回の今回は、EC2にたまにスケジュールされることのある「イベント」とその対応についてご紹介します。AWSサポートに問い合わせられる内容なども紹介しながら、EC2のイベントと可用性について、改めて考えてみたいと思います。
今回の記事では以下の流れで内容を解説していきます。
- Amazon EC2の紹介と、EC2のイベントについて(今回)
- イベントに対するよくある質問(今回)
- イベント対応を楽にするための運用上のアイデア(次回)
そもそもAmazon EC2とは
はじめに、多くの方はもうご存知かもしれませんがAmazon EC2について少しご紹介します。EC2(Elastic Compute Cloud)はスケーラブルな仮想コンピューティング環境を提供するAWSサービスです。もっと簡単に言えば、クラウド環境で動作する仮想マシン提供サービスとなります。
必要なリソース量やネットワーク設定を決めて起動すると数分程度でインスタンスと呼ばれる仮想マシンが立ち上がり、利用可能な状態になります(EC2を取り巻くネットワークについては前回までの記事で詳しく紹介されていますのでぜひ読んでみてください)。
LinuxならSSH、WindowsならRDPを使ってインスタンスにアクセスすると、そこからは自由にカスタマイズして使用することができます。
また、AWSサービスの大きな特徴として、APIから起動や停止といったサーバー操作も行うことができます。インスタンス起動時に必要な処理も自動化でき、プログラムから自動でWebサーバやアプリサーバを起動させるといったことも可能です。
こうした柔軟性がEC2の大きな特徴です。
EC2の稼働環境
インスタンスの起動はWebコンソールやAPIから簡単にできてしまうのでハードウェアを意識することはあまりないかもしれませんが、EC2インスタンスはもちろん物理的なハードウェアの上で起動します。このEC2が稼働している物理的なハードウェアは、英語では「Underlying Host」、日本語では「仮想サーバーホスト」や「ホストコンピュータ」などと呼ばれます。
インスタンスタイプによっては稼働するCPUスペックなどハードウェア仕様が公開されているものもあり、こういった記述をみるとクラウドサービスといえども物理的なハードウェアで動作していることを実感できます。
また、先日行われたAWSのイベントre:Invent 2016の、AWS VP & Distinguished Engineer James Hamiltonのセッションでは、AWSで実際に使われているネットワークスイッチ、サーバーハードウェアやストレージハードウェアが紹介されました。
セッションの中では実際のハードウェアの写真も登場していて、こういったところからもEC2インスタンスが稼働する「仮想サーバーホスト」の存在をより身近にイメージしていただけるのではないかと思います。
セッション内ではAZのスケール感なども紹介されていますので、AWSの内側に興味がある方はぜひ一度YouTubeで公開されているセッションのビデオを見てみてください。
これに加え、EC2ではプレースメントグループやハードウェア専有インスタンスなど、インスタンスの物理的な配置をある程度コントロールできるオプションもあります。
EC2の「イベント」
このようにAWSのインフラストラクチャ上で動作するEC2インスタンスですが、稀に「イベント」がスケジュールされることがあります。
イベントとは、EC2インスタンスが稼働している仮想サーバーホストの障害やメンテナンスに伴って発生する、EC2インスタンスの再起動、停止等の動作を指します。
EC2インスタンスにイベントがスケジュールされた場合、マネジメントコンソールのイベントタブや、APIからの確認が可能です。マネジメントコンソールから確認する場合には、EC2のコンソールを開き[Events]メニューを選択するとイベントの設定されているEC2インスタンスの一覧が表示されます。
また、個々のEC2インスタンスのプロパティにも設定されているイベントが表示されます。
APIやAWS CLIを利用する場合はdescribeInstanceStatus APIでイベント情報の取得が可能です。イベントが予定されているインスタンスが存在する場合、以下のようにEventsプロパティとして返却されます。
$aws ec2 describe-instance-status --instance-id i-c3870335 { "InstanceStatuses": [ { "InstanceStatus": { "Status": "ok", "Details": [ { "Status": "passed", "Name": "reachability" } ] }, "AvailabilityZone": "us-west-2a", "InstanceId": "i-c3870335", "InstanceState": { "Code": 16, "Name": "running" }, "SystemStatus": { "Status": "ok", "Details": [ { "Status": "passed", "Name": "reachability" } ] }, "Events": [ { "Code": "instance-stop", "Description": "The instance is running on degraded hardware", "NotBefore": "2015-05-23T00:00:00.000Z" } ] } ] }