投稿者: sumito.tsukada

  • CloudWatchにログが送れずDISKが枯渇

    CloudWatchにログが送れずDISKが枯渇

    はじめに

    AWSで稼働しているAmazonLinuxのdiskサイズが枯渇した

    原因

    何かが肥大化しているのが通例なので、duコマンドで調べていったら

    /var/log/awslogs.log

    が数ギガ使っていたということにたどり着いた

    もちろんログローテートはしているが、数ギガ使っているというのは明らかに異常

    何がawslogs.logに書き込んでいるか。

    Linuxにある各種ログファイルを

    CloudWatchMonitoringScripts
    http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip

    を用いてCloudWatchに送っているが、このスクリプトが送信した情報は

    /var/log/awslogs.log

    に書かれる。これが肥大化していた

    どのようなエラー内容か

    /var/log/awslogs.log

    tailで見ると、以下のようなログが出力されていた。

    ClientError: An error occurred (AccessDeniedException) when calling the PutLogEvents operation: User: arn:aws:iam::****:user/**** is not authorized to perform: logs:PutLogEvents on resource: arn:aws:logs:ap-northeast-1:****:log-group:/var/log/cron/cron:log-stream:ALL

    AccessDeniedException

    をみて、awsコマンドの設定周りが怪しいとあたりがついた

    awsconfigについて

    前途した通り、LinuxサーバはCloudWatchMonitoringScriptsを用いてログを送付しているが、

    設定ファイルは/etc/配下に格納している。

    それぞれ、awsコマンドを使う上での環境設定ファイルと、監視対象のログを記載したファイル

    [plugins]
    cwlogs = cwlogs
    
    [default]
    region = ap-northeast-1
    aws_access_key_id=***
    aws_secret_access_key=***

     

    [general]
    state_file = value
    logging_config_file = value
    use_gzip_http_content_encoding = false
    
    [/var/log/maillog/maillog]
    datetime_format = %b %d %H:%M:%S
    file = /var/log/maillog/maillog
    buffer_duration = 5000
    log_stream_name = ALL
    initial_position = start_of_file
    log_group_name = /var/log/maillog/maillog

     

    設定自体は問題なさそう。

    原因

    /etc/awslogsが最初に呼ばれるわけではない。

    起動ユーザーの.awsディレクトリ配下が先に呼ばれる。

    そのため、.awsディレクトリが存在していると、

    ログが送れないなどの事象が発生する。

    [default]

    中身は[default]しか書かれていなかったが、設定ファイルが存在していた。

    これが存在していたことにより、/etc/awslogsディレクトリが読み込まれず、Cloudwatchに送付できていなかったようだ。

    対処

    空の.awsディレクトリを削除し、awslogsを再起動

    正常にcloudWatchにログが送付され、DISKの肥大化も解消した

    参考情報

    本記事のみならず、AWSについて体系的に学ぶことができるのでおすすめ。

  • SQLで累積和を計算する

    SQLで累積和を計算する

    はじめに

    最近SQLをガリガリ書くことも少なくなってきたので、
    redashを使ってこんな情報を集計したいなーと思っても、どうやって書けばいいか頭を悩ませることがある。

    単純な合計の場合、sum関数を使えば簡単に表示できるが、累積和を表示しようとした際、工夫が必要だった。

    元データ

    MySQLが公開している、世界の都市や人口についてまとまっているサンプルデータを利用。

    https://qiita.com/S-T/items/923cf689ee5f44525457

    やりたいこと

    合算し累計を算出したい

    元データ

    SELECT NAME,
           Population
           
    FROM city
    WHERE countryCode = 'JPN'
      AND ID IN (1532,
                 1533,
                 1534);
    

    累積和を計算

    SET @cumulativeSum=0;
    
    SELECT NAME,
           Population, 
           @cumulativeSum:=@cumulativeSum+Population AS Population_Sum
           
    FROM city
    WHERE countryCode = 'JPN'
      AND ID IN (1532,
                 1533,
                 1534);

    追加したところは
    SET @cumulativeSum=0;と
    @cumulativeSum:=@cumulativeSum+計算したいカラム名をいれただけ。


    最初このやり方にたどり着くまでに
    SQLでcase文書いて、sumして。。という書き方をしたが、かなりシンプルにおさえることができた。

    注意事項

    残念ながら、ユーザ定義変数 はあくまでもSQLの実行・評価前に定義するための変数で、Select内で更新することを想定していない為、値の保証はしていないようだ

    https://dev.mysql.com/doc/refman/5.6/ja/user-variables.html

    SELECT などのほかのステートメントでは、予想した結果が得られることもありますが、これは保証されません。次のステートメントでは、MySQL が最初に @a を評価し、続いて 2 番目の割り当てを行います。

    複数のクエリを試してみたが、動かない場合もあった。

    SET @gokei=0;
    
    SELECT counseling_date AS date,
           sum(member_status_id = 0 AND ordinal_attendance = 1) AS free_counseling_1,
           @gokei:=@gokei+sum(member_status_id = 0 AND ordinal_attendance = 1) as gokei
           
    FROM counseling
    WHERE counseling_date BETWEEN '2018-06-01' AND '2018-06-30'
    group by date

    これは工夫が必要なので、case文を使うなど工夫するしかなさそうだ。

    解決策ご存知の方はご教示ください

     

  • 世界最高の子育てを読んだ

    世界最高の子育てを読んだ

    世界最高の子育て

    「世界最高の子育て」という子育ての本を読んだ。
    4歳の子供を持つ身として、どのように今後教育していくべきか、何かヒントになれば。という考えで読んだ。

    (さらに…)

  • Redash Meetup 3.0.0 まとめ

    Redash Meetup 3.0.0 まとめ

    前回redashのMEETUPに参加ならびに登壇させていただき、非常に多くの学びがあった
    第三回の勉強会を開催するという話しを聞き、さっそく参加させてもらった

    前回は勉強会での情報の多さ、濃さを受け、今回はレポートとして残そうと思い、自分の関心のある視点をベースにまとめる事にした

    (さらに…)

  • たった1メアドを転送するだけのメールサーバ を作る事になった夜

    たった1メアドを転送するだけのメールサーバ を作る事になった夜

    概要

    一度は誰もがやるであろう「自分の名前のドメイン売ってるかな」というやつ。

    例外なく私も調べ、そして sumito.jp というドメインが空いていた事を知り、勢いで買った。
    主に使っていたのは無料のメール転送サービス。そのサービスが突如打ち切られる事になり、自分でどうにかするしかなくなった。
     

    (さらに…)

  • awsコマンドでLoadAverageが高騰してEC2にログインできない

    awsコマンドでLoadAverageが高騰してEC2にログインできない

    Amazon Linuxに30分後にログインできなくなる問題が発生。

    サーバの構築自体はAnsibleを使って複数台同じ手順で作っているので、中身は一緒のはず。原因を調べた。 (さらに…)