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で個別にコマンド準備しないといけないし、これ同じ形式で扱えたらすごく楽なのになぁと・・・
能力低いので公式ドキュメントから行間を読んでゴニョゴニョするという能力がなく相変わらず苦労しました。
コメント