えいのうにっき

a-knowの日記です

nginx で EU からのアクセスを拒否する

「あ、EUからのアクセスを拒否したいな......」と思うこと、ありますよね。私も今日、そう思いました。

私は趣味と実益を兼ねて(いるつもり)、いくつかのしょうもないWebサービスを個人で運用してるのですが、そこに対するEUからのアクセスを遮断したいと思い、それを nginx で対応してみたので、そのメモです。

続きを読む

サーバーが高負荷状態になったときのプロセス一覧を自動で出力させておく

趣味でお世話をしているサーバーインスタンスのうちのひとつが、最近以下のような事象を時折起こしておりまして。

  • 深夜に一時的に高負荷状態に陥る
  • 朝起きてみたらそれに気づく(終息している)

さすがに趣味の範疇なので、深夜に飛び起きて対応できるようなアラート通知設定はしておらず、とはいえ起きてからその理由を探ろうとするのだけど、終息したあとに見られるものといったらせいぜい以下のようなことくらい?

  • モニタリングツール(Mackerel)のその当時のグラフの様子
  • アプリケーションログを見る
  • /var/log とかに出力されてるログを見る

今回の場合だとCPU使用率とLA(ロードアベレージ)が高騰していたことくらいしかわからずで、そのときにどういうプロセスがリソースを食ってたんだろう、みたいなことは把握することができなかった。

f:id:a-know:20180520211911p:plain

こんなかんじ。diskはちょっとハネてるかな...。。

対象のサーバーには Mackerel(mackerel-agent)を導入している。そこで、この原因を突き止めるための施策として、チェックプラグインとそのアクション機能を使って「そのサーバーが高負荷状態に陥ったときのプロセスリスト」を自動で出力させるように仕込んでみた。

続きを読む

Golangアプリケーションから Google Cloud Storage にアップロードする

cloud.google.com/go/storage を使う。

func uploadGcs(r *http.Request) error {
    bucketname := "bucketname" // GCSバケット名
    objname := "objname" // "foo/var/baz.png" みたいなかんじ
    ctx := r.Context()

    client, err := storage.NewClient(ctx)
    if err != nil {
        log.Printf("failed to create gcs client : %v", err)
        return err
    }

    // GCS writer
    writer := client.Bucket(bucketname).Object(objname).NewWriter(ctx)
    writer.ContentType = "image/png" // 任意のContentTypeに置き換える

    // upload : write object body
    if _, err := writer.Write(([]byte)(uploadData)); err != nil {
        log.Printf("failed to write object body : %v", err)
        return err
    }

    if err := writer.Close(); err != nil {
        log.Printf("failed to close gcs writer : %v", err)
        return err
    }
    return nil
}

GCSにアクセスするための認証情報は、認証の概要  |  Google Cloud に書いてあるとおり、

上記のことをしておけば、自動的に認証情報がロードされ、GCSへのアクセスもできるようになる。簡単。

ちなみに appengine の場合

は、context ctxgoogle.golang.org/appengine を使って ctx := appengine.NewContext(*http.Request) として取得するだけで、その appengineアプリケーションと同じプロジェクト内のGCSにアクセスできるようになる。