ScalaでもAWS S3互換にファイルをアップロードしたい

はじめに

S3にファイルをアップロードするコードを追加するのに、いきなりAWSを契約するのは勇気が要る*1のでとりあえずS3のコンパチ品でテストしてみることにしました。

github.com

Minio

こちらのMinioさん、単一のファイルをダウンロードして実行するだけで使える割とよさげなオブジェクトストレージサーバです。

minio server C:\Hoge

また、何かと不遇な扱いを受けるWindowsにもきっちりと対応しているナイスガイで、弊社の好感度は割と高めです。

AWS SDK

S3のコンパチ品を使う以上、S3のSDKはもちろん動くよねってことでAWS Java SDK For Amazon S3を投入します。

sbtに

libraryDependencies += "com.amazonaws" % "aws-java-sdk-s3" % "1.11.277"

を追加し、あとはネット上に死ぬほど転がっているJavaのサンプルコードをもとにぽぽーんとコードを書けばあっという間にアップロードが出来ます。かんたんですね

val credentials = new BasicAWSCredentials("access-key", "secret-key")
val clientConfiguration = new ClientConfiguration
clientConfiguration.setSignerOverride("AWSS3V4SignerType")

val s3Client = AmazonS3ClientBuilder
  .standard()
  .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://192.168.0.100:9000", Regions.US_EAST_1.name()))
  .withPathStyleAccessEnabled(true)
  .withClientConfiguration(clientConfiguration)
  .withCredentials(new AWSStaticCredentialsProvider(credentials))
  .build()

val f = new File("""C:\Users\jyuch\gitzip\backup-201802090041.zip""")
s3Client.putObject(new PutObjectRequest("gitbucket", f.getName, f))

おわりに

楽っちゃ楽なのですが、fat jarを生成するとバイナリサイズが+10MBになるのは割とアンニュイな感じです。

github.com

*1:契約後1年は無料枠があるっぽいですが

gitbucket-windows-backup-pluginの0.4をリリースしたお話

はじめに

悪いプログラミング言語なんてものはない、あるのは悪いプログラマだけだってね。連日のデスマーチの責任を取るってことでPM達が一斉に辞職したよ。

という訳でgitbucket-windows-backup-pluginの0.4をリリースしました。

github.com

新機能

バックアップの成功時もしくは失敗時にメール通知を行うようにしました。

バックアップの成功時もしくは失敗時にメール通知を行うには、GitBucketのSMTP設定を設定したうえで以下のような設定をbackup.confに追加します。

winbackup {
  # バックアップ成功時に通知メールを送信します(オプション デフォルトはfalse)
  notify-on-success = true

  # バックアップ失敗時に通知メールを送信します(オプション デフォルトはfalse)
  notify-on-failure = true

  # 通知先を指定します
  notify-dest = ["jyuch@localhost"]
}

弊社の環境ではGmailでテストを行っております。その他の環境で動かない場合はいい感じに頑張ってもらうか弊社まで連絡下さい。

backup.conの完全な説明はREADMEをご覧ください。

おわりに

バージョニングについてですが、別に不安定だからバージョン1にならない訳ではなく内部の実装がいまだに定まらないので*1とりあえず0.xでバージョニングしようってだけです。また、変えるのは内部実装だけで外部とのコントラクトの部分(設定ファイルの書式やAPIのパス等)はよほどのことがない限りか変えるつもりはありません。

弊社の環境では旧来のバックアップシステムを停止してこのプラグインでバックアップを一本化していますし、リストアテストもいい感じにうまくいってるっぽいのでとりあえずは大丈夫かなといった感じです。一緒に人柱になりましょう。

おわり

*1:0.5系でまたごそっと内部実装を変えることを計画しています

GitBucketのバックアッププラグインを作ったお話

はじめに

弊社の環境ではWindowsでGitBucketを動作させていますが、GitBucketのバックアップを気合と根性とJenkinsと自作プログラムとpsql*1PowerShellで行っていたのが割とつらみポイントが高めだったので、オールインワンでバックアップを行ってくれるプラグインを作りました。

github.com

名前に『Windows』と入っていますが、別にWindows固有の機能を使っているという訳ではないのでたぶんLinuxMacでも動くと思います。

概要

一定間隔で以下のデータのバックアップをZIPで固めて指定されたディレクトリに移動します。

テスト環境

一応以下の環境でテストを行っています。

OS

データベース

インストールと設定

リリースページからダウンロードしてきてGITBUCKET_HOME/pluginsに配置します。

そして、GITBUCKET_HOME/backup.confを以下のように設定します。

# バックアップタイミング(必須)
# 書式についての詳細は http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html を参照
# 以下の例だと毎日12AMにバックアップを実行します
akka {
  quartz {
    schedules {
      Backup {
        expression = "0 0 0 * * ?"
      }
    }
  }
}

winbackup {
  # バックアップのZIPの保存先を指定します(オプション)
  # 指定しなかった場合、GITBUCKET_HOMEに保存します。
  archive-destination = """C:\archive-dest-dir"""

  # ZIPの最大保持数(オプション)
  # 指定されなかった場合、無限に保持します。
  archive-limit = 10
}

互換性

GitBucketの各バージョンに適合するプラグインバージョンについてはREADMEをご覧ください。

ライセンス

ライセンスはApache License 2.0ですよろしくおねがいします

おわりに

単機能な上にあまりエレガントな実装ではないのですが、弊社の欲しい機能は一通り網羅出来たので弊社的にはOKです。

あとは

  • APIを叩くと任意のタイミングでバックアップを実行できる
  • バックアップ終了後にS3とかのストレージサービスに自動でアップロードする

みたいな機能も付け加えてもいいかもしれません。

*1:データベースがPostgreSQLなので