一部のEC2インスタンスタイプで「最新の」コンソールアウトプットが取得できるようになっているので確認した

EC2インスタンスのコンソール出力は、基本的には起動・停止・再起動などのタイミングでした取得できません。しかし今年の5月のアップデートで、一部の新しいインスタンスタイプにおいてはいつでも最新のものが取得できます。実際に動作を試してみました。
2018.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

二ヶ月ほど前の話になりますが、5/9 に EC2 関連のアップデートが行われ、一部のインスタンスタイプにて「最新(latest)の」コンソール出力(システムログ)が取得できるようになりました。

下記のドキュメントにもありますが、従来はコンソール出力は取得できるようになるまでに時間もかかり、また特定のタイミングでしか更新されないものでした。

Linux/Unix の場合、マシンに接続されている物理的なモニターに通常表示されるようなコンソール出力がインスタンスコンソール出力に表示されます。コンソール出力は、インスタンス遷移状態(開始、停止、再起動、終了)の直後に投稿されたバッファされた情報を返します。 表示される出力は、継続的には更新されず、更新する価値があると思われる場合にのみ更新されます。

Windows インスタンスの場合は、インスタンスコンソール出力に直近のシステムイベントログエラーが 3 つ表示されます。

それが 5/9 のアップデートにより、--latest オプションを付けることで、実行時点で最新のログが取得できるようになった、とのことです。

オプションで、インスタンスのライフサイクル中に最新のシリアルコンソールの出力をいつでも取得できます。このオプションは Nitro ハイパーバイザーを使用するインスタンスタイプでのみサポートされます。Amazon EC2 コンソールではサポートされていません。

実際のところを確認してみました。

対象インスタンスタイプ

この機能は、「Nitro ハイパーバイザーを使用するインスタンスタイプ」のみサポートされているとのことです。AWS CLI のドキュメントによると、'18/07 の時点で下記のインスタンスタイプが該当します。

試してみた

実際に試してみます。コンソール出力はマネジメントコンソールからも取得できますが、今回新設されたオプションは CLI でのみ指定できます。具体的な書式としては下記になります。

$ aws ec2 get-console-output \
    --instance-id (EC2インスタンスID) --latest

--latest オプションを付けない場合は、従来通りのコンソール出力の取得になります。

AWS CLI の例に漏れず、このコマンドラインだと出力は JSON になります。コンソール出力だけを /var/log/messages のように見てみたいだけの場合は、下記のように --query--output を付けると使いやすいでしょう。こちらは --latest がない場合でも同じです。

$ aws ec2 get-console-output \
    --instance-id (EC2インスタンスID) --latest \
    --query Output --output text

対応していないインスタンスタイプの場合

まずは対応していない場合で試してみます。適当に t2.nano で起動したインスタンス( Amazon Linux )に対して実行してみます(インスタンスIDはわかりやすく匿名化してます)。

$ aws ec2 describe-instances \
    --instance-ids i-xxxxT2NANOxxxxxxx \
    --query 'Reservations[].Instances[].InstanceType' \
    --output text
t2.nano

$ aws ec2 get-console-output \
    --instance-id i-xxxxT2NANOxxxxxxx --latest \
    --query Output --output text

An error occurred (UnsupportedOperation) when calling the GetConsoleOutput operation: 
This instance type does not support retrieving the latest console logs

ご覧のような形で見事に弾かれました。もちろん --latest を付けない場合は普通に取得できます。

対応しているインスタンスタイプの場合

こんどは M5 ファミリのインスタンスタイプで試してみます。まずは起動直後、まだ通常だとコンソールログが取得できない状態です。

$ aws ec2 describe-instances \
    --instance-ids i-xxxxM5LARGExxxxxx \
    --query 'Reservations[].Instances[].InstanceType' \
    --output text
m5.large

$ aws ec2 get-console-output \
    --instance-id i-xxxxM5LARGExxxxxx
{
    "InstanceId": "i-xxxxM5LARGExxxxxx",
    "Timestamp": "2018-07-07T03:16:35.000Z"
}

この状態で --latest オプションを付けると、見事にコンソールログが取得できました!

$ aws ec2 get-console-output \
    --instance-id i-xxxxM5LARGExxxxxx --latest \
    --query Output --output text
[    0.000000] Command line: root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
 :
Cloud-init v. 0.7.6 finished at Sat, 07 Jul 2018 04:03:08 +0000. Datasource DataSourceEc2.  Up 17.32 seconds
Amazon Linux AMI release 2018.03
Kernel 4.14.33-51.37.amzn1.x86_64 on an x86_64

起動時に何度か上記コマンドをたたいてみた感じですが、取得できるログは概ねインスタンス起動 1分後から、1分ごとにアップデートされていく感じでした。それでも、--latest なしのログは取得できるようになるまでに 10分近くかかりましたから、起動メッセージをいち早く確認したいという用途では助かるのではないでしょうか。

また、改行されていないログは取得できないようです。つまりログインプロンプトは取得できずなのですが、これは従来の場合も同じです。プロンプトそのものが重要になるパターンはあまりない印象ですが、もし必要な場合は、スクリーンショットを取得すればそこで確認可能なのでこちらで代用しましょう1

ではせっかくなので、試しに、コンソールログに任意のメッセージを書き出してみます。SSH でログインして下記のように実行してみます。

[ec2-user@ip-172-31-44-216 ~]$ curl http://169.254.169.254/latest/meta-data/instance-id ; echo
i-xxxxM5LARGExxxxxx

[ec2-user@ip-172-31-44-216 ~]$ curl http://169.254.169.254/latest/meta-data/instance-type ; echo
m5.large

[ec2-user@ip-172-31-44-216 ~]$ echo 'Hello, Nitro World !!' | sudo tee /dev/console
Hello, Nitro World !!

/dev/console に書き込んだコンソールメッセージが、下記のようにちゃんと取得できました(取得できたのは、上述した「起動後の 1分間隔」のタイミングが過ぎてからでした)。

$ aws ec2 get-console-output \
    --instance-id i-0bfba7c99b28bbed5 --latest \
     --query Output --output text | tail
 :
Amazon Linux AMI release 2018.03
Kernel 4.14.33-51.37.amzn1.x86_64 on an x86_64
ip-172-31-44-216 login: Hello, Nitro World !!

これであれば、例えば「ログインできなくなったが動作はしている」状態のインスタンスに何が起きたのか / 起きているのか、確認する手段がひとつ増えたと言えるのではないでしょうか。

なおその後 2時間ほど時間をおいてみたのですが、--latest を付けない状態だととうとう Hello, Nitro World の文字列は取得できませんでした。

まとめ

Nitro ハイパーバイザのインスタンスタイプ限定ではありますが、コンソールログが短いスパン&再起動などのイベントが起きずとも取得できるようになりました。ある EC2 インスタンスを長く使い続けるようなオンプレミス型の運用をしている場合、こういったアップデートは地味ですが助けになります。M5/C5 は東京でも使えます。状況が許せば積極的に使っていきたいところですね。

備考


  1. ただし、スクリーンショットが取得できるようになるタイミングは従来のシステムログ取得と同様の仕様の模様です