AWS LightSailのApacheログをS3に転送する

2023年09月06日
 
2023年11月27日

2023/11/27 誤った箇所を訂正しました。ご指摘ありがとうございました。
こんにちは。ゆーろんです。
今回はAWS LightSailのWordPreess構成におけるApacheのログをS3に転送する方法を1つを紹介します。

LightSailのログをS3に転送する方法

LightSailのログをS3に転送する方法はいくつかあります。
私の知る限りの具体例を2つ出してみます。

  1. CloudWatch Agentを利用してCloudWatch logsにログ転送後Lambda+EnventBridgeを用いてS3に転送
  2. aws cliを利用したS3転送用のShellScriptを用意してCronやSystem-timerで回す

1の手法の特徴はログの様子をCloudWatchで観測できる点です。
ただ今回の場合、インスタンスはLightSailですから、AWSリソースも多く使用する必要があること、目的がS3に送ることなのに関して構成が回りくどいことから不採用にします。

2の手法はログをaws cli経由でS3に転送するといった単純なものです。
設定もS3転送用のIAMユーザの作成、aws cliのインストールやShellScriptの用意と定期実行系への登録で済みます。以上のことからこの手法を今回は採用します。

今回の目的

Apacheのaccess_logを日付毎に取得/生成し、それをS3に転送することを目的とします。

設定手順

1. Apacheのアクセスログを日付ベースで作成させる

デフォルトではApacheのログはaccess_logに書き続けられます。
そのため日毎のaccess_log.日付などを生成しそこにログを書いてもらう必要があります。

LightSailのWordPress構成の場合Bitnami環境で構築されています。
設定ファイルは/opt/bitnami/apache/conf/httpd.confとなります。
このファイルをviやvimで開いてもらってCustomLog “logs/access_log” commmonの記述部分を以下のように変更します。


CustomLog "|/opt/bitnami/apache/bin/rotatelogs /opt/bitnami/apache/logs/access_log-%Y%m%d 864000 540" combined

上記記述はApacheの機能でログをローテーションさせています。
具体的には「access_log-20220314のようにログファイルを1日(864000秒)に1回、UTC+9時間(540分)のオフセットでcombined(commonにリファラやagent情報を含める)モードで作成/ログを保存する」という記述になります。

設定を保存後、以下コマンドでapacheを再起動します。


sudo /opt/bitnami/ctlscript.sh restart apache

2. AWSにてS3転送用のIAMユーザを作成する

AWS Console等でS3転送用のIAMユーザを作成します。
与える権限はS3に書き込みができるような権限(S3FullAccessなど)を与えます。

またIAMユーザ生成の際に作成したアクセスキー、シークレットキーはメモしておきます。

3. aws cliにS3転送用IAMユーザ情報を登録する

Lightsailのbitnami環境ではaws cliはすでにインストールされています。
以下コマンドを入力してaws cliにS3転送用IAMユーザ情報を登録します。


aws configure

その後、コンソールに表示される情報に従って、アクセスキー、シークレットキー、AWSのリージョン情報(例: ap-northeast-1)、デフォルトの保存形式(.txt, .logなど)を登録します。

4. 任意のフォルダにShellScriptを作成する

任意のフォルダにtouchコマンド等でShellScriptを作成します。今の回例では“send_accesslog_s3.sh“と作成しました。
以下に記述例を示します。


#!bin/bash

PATH=$PATH:/usr/bin/aws

AWS_SHELL_PATH="/usr/bin/aws"

LOG_DIR="/opt/bitnami/apache/logs/"

S3_BUCKET="<S3バケット名>>"

LOG_FILE="access_log-"

TODAY="$(date +%Y%m%d)"

$AWS_SHELL_PATH s3 cp "$LOG_DIR$LOG_FILE$TODAY" "s3://$S3_BUCKET/$TODAY.log"

sudo rm -rf "$LOG_DIR$LOG_FILE$TODAY"

内容はS3にログ転送後ログをサーバから削除するというものです。

注意点としては環境変数にAWSコマンドのパスを通すことと、AWSコマンドをAWS_SHELL_PATHのように直接指定することです。
これをしないとawsコマンドが実行できないため忘れないようにしてください。

5. CrontabにShellScriptを登録する

以下コマンドで作成したShellScriptをCronに登録します。
今回はCrontabを使用します。


sudo crontab -e

ファイルが開いた後、以下記述を追加して保存します。


10 15 * * * /bin/bash <作成したShellScriptのパス>

日本時間0時(UTC15時)10分に作成したシェルスクリプトが実行されるという記述になります。

よろしければシェアしてくださいね!
タグ: LightSailApacheAWS

関連記事