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で個別にコマンド準備しないといけないし、これ同じ形式で扱えたらすごく楽なのになぁと・・・
構築とかについてはTerraformとかPulumiとかあるんですがcopyとかmvとかの部分でマルチクラウドの差を吸収できるようなツールがないのでなんか面倒くさいなぁと思いながらやってました。
能力低いので公式ドキュメントから行間を読んでゴニョゴニョするという能力がなく相変わらず苦労しました。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)