3大クラウドのストレージ使ってsyslogのログローテーションしてみる
Samba使ってマウントしたファイルサーバってのを以前に準備しました。
その応用で業務にてsyslogサーバ立ててマウントしてそこにログを逃がす形式で構築する機会がありました。しかしながら、よく考えるとマウントしたディレクトリに移動させるよりローテートの際にコマンドで直でストレージに送ればいいかなと思って試してみました。AWSだけだと面白くないのでGCSとAzureBlobにも対応してみました。次回やるときに苦労するの嫌なので現時点で一撃でやれるようにShellにしてます。
◆Shellスクリプト実行環境の前提
・AWS:IAMロールでS3フルアクセス可能なものが存在しEC2に付与されている。AWS-CLIインストール済でクレデンシャル発行済
・GCP:GCEのアクセススコープで[ストレージ]がフル設定となっている
・Azure:V-NETとストレージアカウントとBlobコンテナーが設定されていること
・Ubuntu22.04LTSにて確認(ロケールと言語は日本語に変換済)
◆Shell本体
#!/bin/bash
LOGDIR=/var/log/remote
CONFIG=10-remoete.conf
LOGNAME=syslog
S3BUCKET=s3://202402-syslog-srv-test
GCSBUCKET=gs://202402-syslog
RESOURCENAME=syslogexam
AZ_ACCOUNTNAME=202402storageaccount
AZ_CONTAINERNAME=202402-syslog-test
EXPIRY=$(date -d "+10 years" +%Y-%m-%dT00:00:00Z)
CMD="logrotatecommand"
# AWS
read -p "## Do you want to setting AWS ? (y/n) [y]: " -e -i "y" awsResponse
if [ "$awsResponse" == "y" ] || [ "$awsResponse" == "Y" ]; then
echo "*** AWS setting start ***"
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
sudo apt -y install unzip
unzip awscliv2.zip
sudo ./aws/install
rm -Rf awscliv2.zip aws
CMD="aws s3 mv ${LOGDIR}/ ${S3BUCKET}/ --recursive --recursive --exclude '*' --include \"*-\$(date '+%Y-%m-%d')\""
fi
# GCP
read -p "## Do you want to setting GCP ? (y/n) [y]: " -e -i "n" gcpResponse
if [ "$gcpResponse" == "y" ] || [ "$gcpResponse" == "Y" ]; then
echo "*** GCP setting start ***"
CMD="gsutil mv -r ${LOGDIR}/*/\"*-\$(date '+%Y-%m-%d')\" ${GCSBUCKET}/"
echo "*** GCP setting Done ***"
fi
# Azure
read -p "## Do you want to setting Azure ? (y/n) [y]: " -e -i "n" azureResponse
if [ "$azureResponse" == "y" ] || [ "$azureResponse" == "Y" ]; then
echo "*** Azure setting start ***"
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
az login
wget https://aka.ms/downloadazcopy-v10-linux
tar -xvf downloadazcopy-v10-linux
sudo rm -f /usr/bin/azcopy
sudo cp ./azcopy_linux_amd64_*/azcopy /usr/bin/
sudo chmod 755 /usr/bin/azcopy
rm -f downloadazcopy-v10-linux
rm -rf ./azcopy_linux_amd64_*/
ACCOUNT_KEY=$(az storage account keys list --account-name ${AZ_ACCOUNTNAME} --resource-group ${RESOURCENAME} --query "[0].value" --output tsv)
SAS=$(az storage container generate-sas \
--account-name ${AZ_ACCOUNTNAME} \
--account-key ${ACCOUNT_KEY} \
--name ${AZ_CONTAINERNAME} \
--expiry ${EXPIRY} \
--permissions rwl \
--output tsv )
sudo tee /usr/local/bin/azure_bkup_copy.sh <<_EOS_
#!/bin/bash
for dir in ${LOGDIR}/*; do
azcopy copy \$dir "https://${AZ_ACCOUNTNAME}.blob.core.windows.net/${AZ_CONTAINERNAME}/?${SAS}" --recursive --include-pattern "*-\$(date '+%Y-%m-%d')"
rm \$dir/*-\$(date '+%Y-%m-%d')
done
_EOS_
sudo chmod +x /usr/local/bin/azure_bkup_copy.sh
CMD=/usr/local/bin/azure_bkup_copy.sh
echo "*** Azure setting Done ***"
fi
# rsyslog.confのポート開放
sudo sed -i 's/#module(load="imtcp")/module(load="imtcp")/' /etc/rsyslog.conf
sudo sed -i 's/#input(type="imtcp" port="514")/input(type="imtcp" port="514" ruleset="remote")/' /etc/rsyslog.conf
sudo sed -i 's/#module(load="imudp")/module(load="imudp")/' /etc/rsyslog.conf
sudo sed -i 's/#input(type="imudp" port="514")/input(type="imudp" port="514" ruleset="remote")/' /etc/rsyslog.conf
# ディレクトリとリモートホスト用設定作成
sudo mkdir -p ${LOGDIR} && sudo chgrp syslog ${LOGDIR} && sudo chmod 775 ${LOGDIR}
sudo tee /etc/rsyslog.d/${CONFIG} <<_EOS_
\$umask 0022
#template(name="HostDateTemplate" type="string" string="${LOGDIR}/%hostname%/%fromhost%-%\$year%-%\$month%-%\$day%.log")
template(name="HostDateTemplate" type="string" string="${LOGDIR}/%hostname%/${LOGNAME}")
ruleset(name="remote") {
action(type="omfile" DynaFile="HostDateTemplate" FileCreateMode="0644" dirCreateMode="0755")
}
_EOS_
sudo tee /etc/logrotate.d/remote <<_EOS_
${LOGDIR}/*/* {
daily
missingok
dateext
dateformat -%Y-%m-%d
rotate 1
notifempty
create 664 root syslog
postrotate
${CMD}
systemctl restart rsyslog
endscript
}
_EOS_
# デーモン再起動
sudo systemctl restart rsyslog.service
◆参考
・syslog、logrotate
・S3
・GCP
・Azure
一番楽だったのがGCSです。何も足さなくていいという感じでした。次がAWS、AWS-CLI入れないとダメだったけどまだまし。Azureは使いにくい。なんですかAzCopy入れた上に認証情報までわざわざ端末上で拾ってこないといけないという面倒くささ、こういう用途で使うならAWSかGCPの方がハードル低いですね。
それにしても、クラウド個別CLIを1個で扱えるCLIとかないんですかねS3とGCSとAzureBlobで個別にコマンド準備しないといけないし、これ同じ形式で扱えたらすごく楽なのになぁと・・・
それにしても、クラウド個別CLIを1個で扱えるCLIとかないんですかねS3とGCSとAzureBlobで個別にコマンド準備しないといけないし、これ同じ形式で扱えたらすごく楽なのになぁと・・・
能力低いので公式ドキュメントから行間を読んでゴニョゴニョするという能力がなく相変わらず苦労しました。
コメント