【AWS】EC2インスタンスの停止(シャットダウン)時にログファイル等を自動でS3に保存する方法

こんにちは、Aireです。

本記事では、EC2インスタンスを停止(シャットダウン)、再起動または終了(削除)するときに、ログ(ログ以外も可能)をS3に自動で保存する方法を紹介します。

本方法では、インスタンス内にログの自動保存用スクリプト一式を事前に仕込んで置くことで、OSの停止をトリガーにスクリプトを実行するようにしています。

目次

前提条件

ログの自動保存用スクリプト一式を準備する前に、以下の前提条件に問題がないか確認してください。

  1. [必須]インスタンスにAWS CLIがインストールされていること…AWS CLIコマンドを使用してファイルをS3にアップロードします。
  2. [必須]インスタンスからS3にアクセスできること
    • アクセス経路…VPC上にInternet GatewayやVPCエンドポイントなど、インスタンスからS3にアクセスできる環境を用意します。
    • アクセス権限…S3へのアクセス権限を含むIAMロールをインスタンスにアタッチするか、または、AWS CLIのアクセスキー情報をインスタンス内にファイルとして保存します。セキュリティの観点から前者を推奨します。
  3. [任意]インスタンスのメタデータ(インスタンスID)にアクセスできること…本記事では、S3にアップロードするファイル名にインスタンスIDを含めています。含めない場合は本条件は省略可能です。
    • インスタンスのアクセス可能なメタデータのバージョンV1およびV2であること…インスタンスIDなどのメタデータは、インスタンス内のメタデータエンドポイントにアクセスすることで取得できます。通常インスタンスを作成すると、アクセス可能なメタデータのバージョンV2のみとなりますが、インスタンスIDのメタデータバージョンはV1であるため、インスタンスIDを利用したい場合は、インスタンスの作成時にV1およびV2を選択するか、作成後に設定変更を行います。変更方法は公式ドキュメント(既存インスタンスのインスタンスメタデータオプションの変更)を参照してください。

Linuxインスタンスの場合

ログの自動保存用スクリプト一式の準備

本記事で準備するスクリプトは以下です。これらのファイルをOS上の任意の場所に格納してください。

  1. ログ保存スクリプト
  2. インスタンスの停止時に、ログ保存スクリプトを実行するためinit.dスクリプト

ログ保存スクリプト

以下のスクリプトは、システムログである”/var/log/messages”と”/var/log/secure”に日時情報とインスタンスIDを付与してS3へのアップロードを行います。本スクリプトのパスは任意です。

インスタンスの停止時にログ保存スクリプトを実行するためのinit.dスクリプト

以下のスクリプトは、OSの停止または再起動時にログ保存スクリプトを実行します。ログ保存スクリプトのパス情報は適宜修正してください。

ログの自動保存サービスの登録と起動

以下のコマンドを実行し、cp_log_to_s3サービスの登録と起動を行います。

動作確認テスト

以下のコマンドを実行しcp_log_to_s3サービスを停止するか、インスタンス(OS)を停止または再起動し、ログ保存の動作確認を行います。

指定したS3フォルダの下に日付フォルダ(YYYYMMDD_hhmmss)が作成され、その中にログファイル(messages_shutdown_<IP address>_i-xxxxxxxxxxxxxxxxx_YYYYMMDD_hhmmss.gz、secure_shutdown_<IP address>_i-xxxxxxxxxxxxxxxxx_YYYYMMDD_hhmmss.gz)が保存されていれば成功です。

Windowsインスタンスの場合

ログの自動保存用スクリプト一式の準備

以下のスクリプトファイルを準備します。

  1. ログ保存スクリプト

ログ保存スクリプト

以下のPowerShellスクリプトは、WindowsイベントログであるSystemログとSecurityログに日時情報とインスタンスIDを付与してS3へのアップロードを行います。本スクリプトのパスは任意です。

ローカルグループポリシーにログ保存スクリプトを追加(GUI操作の場合)

ローカルグループポリシーエディターを開き、インスタンスの停止時に実行したいスクリプトを設定します。

  1. [User Configuration]-[Windows Settings]-[Scripts (Logon/Logoff)]に移動し、[Logoff]の[Properties]を開きます。

[Computer Configuration]-[Windows Settings]-[Scripts (Startup/Shutdown)]で、[Shutdown]の[Properties]を設定することができますが、こちらの設定をしてもシャットダウン時にスクリプトが実行されませんでした。試しに[Logoff]の[Properties]を設定したところ、シャットダウン時にスクリプトが実行されたので参考手順として紹介しています。(シャットダウン時に内部処理としてログオフが行われたことでスクリプトが動作したものと推察)

  1. [PowerShell Scripts]タブを開き、[Add]ボタンをクリックします。
  1. [Browse]ボタンをクリックします。
  1. 既定のパス(C:\Windows\System32\GroupPolicy\User\Scripts\Logoff\)が表示されるので、ここにログ保存スクリプトを格納・選択し、[Open]をクリックします。
  1. [OK]ボタンをクリックし、[Properties]画面を閉じます。
  1. コマンドプロンプトまたはPowerShellを開き、gpupdateコマンドを実行します。

ローカルグループポリシーにログ保存スクリプトを追加(CLI操作の場合)

PowerShellを開き、インスタンスの停止時に実行したいスクリプトを設定します。

  1. ログ保存スクリプトを格納するフォルダを作成します。ここではC:\Windows\System32\GroupPolicy\User\Scripts\Logoff\を作成します。
  1. C:\Windows\System32\GroupPolicy\gpt.iniに以下の内容を記載します。gpt.iniはグループポリシーテンプレート(GPT)全体の設定ファイルです。ローカルグループポリシーエディター(GUI操作)でスクリプトを指定する場合は、本ファイルに設定が自動で反映されます。
項目説明
gPCUserExtensionNamesUser Configuration(ユーザーの構成)でポリシーが設定されているクライアント側拡張(CSE)のリスト。
gPCUserExtensionNames=[{CSEのGUID}{サーバ側拡張のGUID}]
[{42B5FAAE-6536-11D2-AE5A-0000F87571E3}{40B66650-4972-11D1-A7CA-0000F87571E3}]
Versionグループポリシーオブジェクト(GPO)のバージョン情報。[ユーザーの構成のバージョン(4桁の16進数)]+[コンピュータの構成のバージョン(4桁の16進数)]で構成された8桁の16進数を、10進数に変換した値。今回のようにユーザー構成の情報のみを新規に設定した場合、ユーザーの構成のバージョン(0001)とコンピュータの構成のバージョン(0000)により65536(= 00010000)が算出されます。65536
  1. C:\Windows\System32\GroupPolicy\User\Scripts\Logoff\psscripts.iniに以下の内容を記載します。psscripts.iniは実行するスクリプトの情報を記載します。ローカルグループポリシーエディター(GUI操作)でスクリプトを指定する場合は、本ファイルに設定が自動で反映されます。
項目説明
nCmdLine実行するスクリプト。複数のスクリプトを実行する場合は、先頭の値を増やしていきます。(0CmdLine、1CmdLine、…)cp_log_to_s3.ps1
nParametersスクリプトのオプション。実行するスクリプトに合わせて、先頭の値を指定します。(0Parameters、1Parameters、…)なし(今回使用するスクリプトにはオプションなし)
  1. コマンドプロンプトまたはPowerShellを開き、gpupdateコマンドを実行します。

本節の手順はgpt.inipsscripts.iniを直接編集するためおそらく非推奨です。あくまで自己責任でお願いします。

動作確認テスト

インスタンス(OS)を停止または再起動し、ログ保存の動作確認を行います。

指定したS3フォルダの下に日付フォルダ(YYYYMMDD_hhmmss)が作成され、その中にログファイル(system.evtx_shutdown_<IP address>_i-xxxxxxxxxxxxxxxxx_YYYYMMDD_hhmmss.zip、security.evtx_shutdown_<IP address>_i-xxxxxxxxxxxxxxxxx_YYYYMMDD_hhmmss.zip)が保存されていれば成功です。

インスタンスを停止または再起動した場合、S3フォルダにログが保存されないケースが10回中1〜2回ありました。原因は分かりませんが留意事項として共有しておきます。

この記事を書いた人

目次