@ryoma7i (ま いしど)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

S3にログをアップロード用シェルの書き方について

こちらのHPを参考にして作成しようとしております。
https://qiita.com/kizawa2020/items/bb786b5ad637c1c4e9a3

まだ複数バケットができる予定なのですがまだ決まっておりませんのでなんともなのですが・・・。
上記のホームページよりスクリプトほぼそのままで利用する予定です。
すみませんが複数のログを送ろうとする場合はどのようにしたらいいんでしょうか?
以下を使って同じバケットに送るログであればダブルコーテーションの中にカンマで区切って
ログファイルを複数入れていけばいいのかなと考えてますが、
バケットが違う場合でも増やしていく場合の書き方を教えていただけると助かります。

※具体的には一つのシェルで全部の複数の種類のログを送るようにするには
ということになります。
こんな感じなので当たり前のように書いてもらっても残念ですがよくわかりません。。
当方は初心者なのですがそれでもわかるように記載してもらえませんでしょうか。
どうぞよろしくお願い致します。

initial parameter
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
LOG_FILE="/var/log/backup/logbackup.log"
BUCKET_NAME="s3://(バケット名)"

0 likes

1Answer

バケット名を引数で与えるように変えて、スクリプトを複数回実行するのが手っ取り早いと思います。

スクリプトの

BUCKET_NAME="s3://(バケット名)"

TOOL=$1
LOGS=${@:2}

TOOL=$1
BUCKET_NAME=$2
LOGS=${@:3}

と変えて、 logrotate のスクリプト実行箇所を以下のようにすればいけます。

sh /usr/local/bin/s3upload.sh syslog s3://バケット1 $*
sh /usr/local/bin/s3upload.sh syslog s3://バケット2 $*
0Like

Comments

  1. @ryoma7i

    Questioner

    回答ありがとうございます。
    つまりは置場のバケットに合わせて logrotate.dのところをログ毎に作っていけば労力少なくできそうということでしょうか?
    (間違っておりましたら、ご指摘くださいませ)

    そうなるとバケット名を確定したらそれぞれのlogrotate.d配下に書き込んでいけますね。

    この直上にあった LOG_FILE="/var/log/backup/logbackup.log"
    ですが
    こちらについては複数のログファイルの場所をダブルコーテーションで挿み、カンマで区切って複数記載で問題はないでしょうか?
  2. > logrotate.dのところをログ毎に作っていけば労力少なくできそうということでしょうか?

    そうです。

    LOG_FILE はアップロードするログファイルではなく、このアップロードスクリプトの実行結果を記録するログファイルです。そのままで構いません。

    複数のログファイルをアップロードする場合は、 logrotate.d の設定の { より上の行にファイルパスを書いてください。これらのファイルはすべて各バケットにアップロードされます。

    /var/log/ログファイル1
    /var/log/ログファイル2
    {
    sharedscripts
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    sh /usr/local/bin/s3upload.sh syslog s3://バケット1 $*
    sh /usr/local/bin/s3upload.sh syslog s3://バケット2 $*
    endscript
    }
  3. @ryoma7i

    Questioner

    ありがとうございます。

    やっと理解できました。
    ほとんど logrotate.dでコントロールが出来ちゃいますね

    試してみます。
  4. @ryoma7i

    Questioner

    すみません
    時間が空きましたが、やっと環境が整いテストしてるところなのですが
    何度か試しているのですが飛んでいきません。

    確認なのですが、 logrotate.d 以下のファイルは送り先が基本的に一つなので
    複数 sh /usr/local/bin/s3upload.sh syslog s3://バケット1 $* この行を追加
    しようという考え方はなかったです。
    同じであっても同じ内容をすべて追記していくという意味でしたでしょうか?
    同じ送り先なので1行のみを実行してました。

    複数ある場合であればログファイル1~ バケット1~のように同じ並びで追記ということですよね?

    あとすみませんこちらはよくあるAWSのCPコマンドと同等になりますでしょうか?
    バケットの配下にサーバ名でフォルダ分けをしようと考えてましたが、AWSのCPコマンドだと
    ディレクトリがあってないフォルダがある場合は作ってくれるようです。
    こちらでは作らないとダメでしょうか?

    LOG_FILEのログを確認したところ引数が指定されていませんとありました。
  5. @ryoma7i

    Questioner

    すみません
    時間が空きましたが、やっと環境が整いテストしてるところなのですが
    何度か試しているのですが飛んでいきません。

    確認なのですが、 logrotate.d 以下のファイルは送り先が基本的に一つなので
    複数 sh /usr/local/bin/s3upload.sh syslog s3://バケット1 $* この行を追加
    しようという考え方はなかったです。
    同じであっても同じ内容をすべて追記していくという意味でしたでしょうか?
    同じ送り先なので1行のみを実行してました。

    複数ある場合であればログファイル1~ バケット1~のように同じ並びで追記ということですよね?

    あとすみませんこちらはよくあるAWSのCPコマンドと同等になりますでしょうか?
    バケットの配下にサーバ名でフォルダ分けをしようと考えてましたが、AWSのCPコマンドだと
    ディレクトリがあってないフォルダがある場合は作ってくれるようです。
    こちらでは作らないとダメでしょうか?

    sh自体はAWSでロールを作ったので以下の3行は消してます。
    export AWS_CONFIG_FILE="/root/.aws/config"
    export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxx"
    export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


    LOG_FILEのログを確認したところ引数が指定されていませんとありました。
    引数はどこのことを示してるのでしょうか。
    どうぞよろしくお願い致します。
  6. > 同じであっても同じ内容をすべて追記していくという意味でしたでしょうか?
    > 同じ送り先なので1行のみを実行してました。

    > 複数ある場合であればログファイル1~ バケット1~のように同じ並びで追記ということですよね?

    sh /usr/local/bin/s3upload.sh syslog s3://バケット1 $*

    これ1行で、 syslog に関するログファイルをすべてバケット1に送信するという意味です。「同じ並びで追記」というのはよく分かりません、どのようなコマンドを想定していますか?

    > あとすみませんこちらはよくあるAWSのCPコマンドと同等になりますでしょうか?

    はい。 aws s3 cp コマンドと同様に、バケット以下にフォルダを作ります。(細かいことを言うと S3 にフォルダの概念はなく、スラッシュもファイルの名前の一部に過ぎないのですが、フォルダを作れるイメージで合っています。)
    自分でフォルダを作る必要はありません。

    フォルダ名はスクリプトの

    DEST=$BUCKET_NAME/$YEAR/$YMDDATE/$TOOL

    で定義されているとおり、「/(年)/(年月日)/(ツール名)/」になります。

    > LOG_FILEのログを確認したところ引数が指定されていませんとありました。
    > 引数はどこのことを示してるのでしょうか。

    s3upload.sh スクリプトへの引数です。 logrotate.d の例で言えば「syslog s3://バケット1 $*」の部分です。
    例の通りに設定を書けば引数は指定されると思います。どこかで指定せずに実行されたのではないでしょうか。
  7. @ryoma7i

    Questioner

    ありがとうございます。

    いや・・・。失礼しました少し混乱してるかな・・。

    これ1行で、 syslog に関するログファイルをすべてバケット1に送信するという意味です。「同じ並びで追記」というのはよく分かりません、どのようなコマンドを想定していますか?
    →何も想定してません、何か別のものがあったのかと。説明下手ですみません。


    S3で登録しているバケット名を以下のように入れました。
    syslog s3://hoge-bucket-prod-01

    この後ろに/サーバ名を追加した感じです。
    バケット名1とかではもちろんないのですよ。

    この記載間違ってますかね?
    バケット名の前にTokyoとかOsakaとかリージョン入れるのでしたっけ?

    それとも"$*"のところは〆の文言かと勘違いしてましたでしょうか?
  8. syslog s3://hoge-bucket-prod-01/サーバ名 $*

    のように書いたということですかね?これで合っています。($* は必要なので、書いてなければ書いてください。)

    リージョンは引数には入れません。もしリージョンを指定したければ設定ファイル /root/.aws/config に書くか、スクリプト内の上の方に

    export AWS_REGION=ap-northeast-1

    のように書くか、どちらかで行けます。
  9. @ryoma7i

    Questioner

    ありがとうございます。

    ご指摘の記載通りになってます。
    やはり記載の形式としてはあってますね。
  10. 記述が合っているなら引数エラーが出るのは変ですね。試しにターミナルで

    sh /usr/local/bin/s3upload.sh syslog s3://hoge-bucket-prod-01/サーバ名 "適当なログファイルのパス"

    を実行して、正しくアップロードできるどうか確認してください。
  11. @ryoma7i

    Questioner

    ありがとうございます。
    エラーが出ることなくコマンド自体は通りましたので飛んだかと思ったのですが
    コンソールから見れないのでログを吐き出すようにしてみたところ
    行 40: aws: コマンドが見つかりませんとありました。

    ちょっと今動かしたのがもともとのお手本に入れ替えてましたので
    二つ目のdoneのところのようです。


    ※二つ目のdoneを削除して同様に実施したところ

    行 42: 予期しないトークン 'fi'周辺に構文エラーがあります
    行 42: 'fi'

    すみませんが、何かありますでしょうか。どうぞよろしくお願い致します。
  12. @ryoma7i

    Questioner

    すみません
    いろいろお手数おかけしております。

    cliのインストールが完了し手動で実行したのですが、エラーも何もなく終わりました。
    しかしながらまた飛んでおりません。
    ログを吐き出すようにしてましたので確認したのですが、ログファイルは空でした。。

    なにか確認できるようなところがありましたら教えていただけますでしょうか。
  13. @ryoma7i

    Questioner

    いろいろ弄ってみましてaws cpコマンドを使ったところアップロードが出来ました。
    こんな感じです。
    aws s3 cp /var/log/secure-* s3://hoge-prod-01/サーバ名
    ただ*はだめのようでファイル名を全指定しないと無理だったようです。ので
    バケット名については問題ないようです。

    でなのですが、引数が指定が指定されませんと出ているのはこれらのことなんでは?
    という気がしてきました・・・。
    以下(ロールで実施するために消しました。)
    export AWS_CONFIG_FILE="/root/.aws/config"
    export AWS_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxx"
    export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    これらをなくして動かすようにするためにはそうすべきでしょうか?
    rootの直下に隠しフォルダaws自体が無かったです。
    すみませんが、なんとかご教授お願い致します。

  14. ロールを付与するならそれら3行は不要なので消しても大丈夫です。

    「引数が指定されていません」というメッセージは、スクリプトを実行するとき引数を1つも与えていない場合にだけ出ます。よってその3行を消すかどうかは関係ありません。

  15. @ryoma7i

    Questioner

    ありがとうございます。

    「引数が指定されていません」というメッセージは、スクリプトを実行するとき引数を1つも与えていない場合にだけ出ます。よってその3行を消すかどうかは関係ありません。
    →とのことですが、どの引数のことかわかるようにする方法はありますか?

    以下ならS3に飛びました。ただしは効かなかったので日付指定したのとフォルダではなく
    サーバ名のファイルが出来てました。。
    aws s3 cp /var/log/secure-
    s3://hoge-prod-01/servername

    logroted.d配下にS3のアドレスに記載せず、シェルにS3のアドレスを記載して以下のようにして
    打ち込んだところはログが発生してませんでした。
    sh /usr/local/bin/s3upload.sh syslog "/var/log/messeage-20230412" > /tmp/hoge.log

    すみません、自分で弄ってやってみてわかったのはこんな感じでした
    他に何か確認ができるようなところはございますでしょうか?

  16. どの引数のことかわかるようにする方法はありますか?

    s3upload.sh に渡す引数のことです。たとえば

    sh /usr/local/bin/s3upload.sh syslog "/var/log/messeage-20230412"

    と実行したとき、 syslog "/var/log/messeage-20230412" 部分が引数です。引数を渡さずに

    sh /usr/local/bin/s3upload.sh

    と実行したときにだけ、「引数が指定されていません」エラーが出ます。このエラーメッセージの文章は s3upload.sh が独自に出力するものですから、他のコマンド(たとえば aws s3 cp)から出ることはないと思います。

  17. シェルにS3のアドレスを記載して以下のようにして
    打ち込んだところはログが発生してませんでした。
    sh /usr/local/bin/s3upload.sh syslog "/var/log/messeage-20230412" > /tmp/hoge.log

    s3upload.sh はすべてのログを LOG_FILE に書き込むようになっており、標準出力に何も出力しません。よって > /tmp/hoge.log をつけても /tmp/hoge.log には何も書き込まれません。

  18. @ryoma7i

    Questioner

    すみません、いろいろ整理して教えてもらってて
    結論からすると確かにご指摘の通りでした。。
    ログローテとs3upload.shの実行時間を1時間遅らせて設定していました。
    ご指摘の通りsh /usr/local/bin/s3upload.sh だけで動かしていましたとなります。
    大変失礼いたしました。

    しかしながらs3upload.shのログを確認したところs3upload.shの実行時にしか
    ログが出てきていないため、ログローテの際には動いていないことだったことはわかりました。

    再度ログローテを強制的に実施したところ以下が多数出てました。
    sharedscripts外さないといけないかなってのとただどこのパスが間違えてるのでしょうか
    間違えがあるとしても気づけておりません。
    usage: aws s3 sync or or
    Error: Invalid argument type

  19. logrotate.conf か s3upload.sh の中で aws s3 sync を呼んでいませんか?その構文が間違っているようです。

  20. @ryoma7i

    Questioner

    すみません
    調べてたものとの転記ミスしてました。

    ですのでどこにもsyncありませんでした。

    usage: aws s3 cp or   or
    Error: Invalid argument type

  21. logrotate.conf での s3upload.sh の呼び出しが間違っています。以下のように書く必要があります。

    sh /usr/local/bin/s3upload.sh syslog s3://hoge-bucket-prod-01/サーバ名 $*

    エラーの原因は、最後の引数 $* を忘れているか、その前の引数が s3:// で始まっていないだと思われます。

Your answer might help someone💌