EC2 Image Builderが失敗してデバッグするときに便利な設定 #reinvent

re:Invent 2019で発表された新サービスであるEC2 Image Builderを試していて、パイプラインからのイメージ作成が失敗しました。この調査に役に立つ設定(Terminate instance on failure)があるのですが、利用するのにちょっとした注意点があったのでまとめておこうと思います。
2019.12.31

西澤です。re:Invent 2019で発表された新サービスであるEC2 Image Builderを試していて、パイプラインからのイメージ作成が失敗しました。この調査に役に立つ設定(Terminate instance on failure)があるのですが、利用するのにちょっとした注意点があったのでまとめておこうと思います。

きっかけ(EC2 Image Builder が失敗した)

せっかくの新サービスなので、なんとなく触っていたところ、イメージ作成に失敗してしまいました。あまり特別な設定をしたつもりは無かったのですが。

何はともあれ調査をしようとエラーメッセージを確認しましたが、何やらよくわからないエラーメッセージでどうしようかと考えていたところ、ふと思いました。「イメージ作成中にサーバ上で何が起こっているのか確認したいな」と。

イメージ作成に失敗したらTerminateしないオプション

設定項目そのままなのですが、EC2 Image Builderでは"Terminate instance on failure"というオプションがあります。こちらの設定はデフォルトでは、有効になっているのですが、こちらを無効にすることで、正常完了時にはそのままTerminateされるEC2インスタンスが、BuildフェーズまたはTestフェーズにおいて失敗したタイミングでそのインスタンスがそのまま保持されます(その為、逆に意図せずインスタンスを残すことがないように注意が必要です)。

ちょっと言い訳がましいですが、私が検証に着手したサービスリリース当初は画面上でこちらの設定を確認する方法がありませんでしたので、AWS CLIでも設定を確認しました。

$ aws imagebuilder get-infrastructure-configuration \
>     --infrastructure-configuration-arn ${InfraConfigArn} \
>     --query "{name:infrastructureConfiguration.name,terminateInstanceOnFailure:infrastructureConfiguration.terminateInstanceOnFailure}" \
>     --output table
-----------------------------------------------------------------------------------------
|                            GetInfrastructureConfiguration                             |
+--------------------------------------------------------+------------------------------+
|                          name                          | terminateInstanceOnFailure   |
+--------------------------------------------------------+------------------------------+
|  TestPipeline-infrastructureConfiguration-68bc0eba268e |  False                       |
+--------------------------------------------------------+------------------------------+

こちらの設定をAWS Management Consoleから変更する際の注意なのですが、"Edit"ボタンから設定の変更画面に入った時に、直前の設定状態に関わらずデフォルトでチェックが入った状態になります。意図せずこの設定をデフォルトの"True"にしてしまう可能性がありますのでご注意ください。

この設定を"False"にしておけば、ビルドやテスト失敗時にEC2インスタンスにSSH(WindowsならRDP)ログインすることが可能です。もちろん、SSHキーの設定やSecurityGroupの設定もお忘れなく。

またこの設定をAWS CLIから変更する方法も確認にしたのですが、以下の通りです。"--client-token"は冪等性を担保するために任意の64文字以内の文字列を指定する必要がありました。ちょっとトリッキーな感じだったので、APIから操作する場合には注意した方が良さそうです。

$ aws imagebuilder update-infrastructure-configuration \
    --infrastructure-configuration-arn ${InfraConfigArn} \
    --no-terminate-instance-on-failure \
    --instance-profile-name ${EC2ROLE} \
    --client-token ${RANDOM_STRINGS_64CHARS}
{
    "requestId": "c84c9f75-a150-4384-baa9-c453fcd17db4"
}

まとめ

EC2にログインしたら負けとか言わないでください。実際の調査結果については今回は触れません。この記事はre:Invent中に試して書き始めていたのですが、サービスリリース当初で正確な動作が確認できなかったこともあり、公開がすっかり遅くなってしまいました。EC2 Image Builderに限らず、新サービスもどんどん試して触って、AWSを活用するために役立つ情報を発信していけたらと思います。