MavenリポジトリをS3上に構築してMaven/Gradle/sbtから使う

帰省していた妻と子供を迎えに羽田空港まで行ったのに、下の子がまったく嬉しそうじゃなくてガッカリな中村です、こんにちは。

今日は、S3にMavenインハウスリポジトリを構築して、3つのビルドツール(Maven/Gradle/sbt)から扱うための設定を紹介します。

S3にリポジトリ構築するに至った背景

まず、実際の設定内容を紹介する前に、なぜS3上にリポジトリ構築しようとしたのかと、そのメリットを簡単に説明します。

MavenもしくはJavaベースの言語を利用していた場合、インハウスリポジトリを構築すると色々便利だということは、WEB+DB PRESS Vol.39の記事中でも紹介しています。私達も、今までは社内サーバ上にMavenリポジトリを構築していましたのですが、社内サーバのメンテナンスコストも馬鹿にならなくなり、もっとメンテナンスコストを減らせるものに移行しようと決断しました。

メンテナンスコストを減らすために、真っ先に思い浮かんだのがS3です。S3をリポジトリとして利用することができれば、自前でサーバを持つ必要がなく、メンテナンスコストはほぼ0にできると考えました。

ビルドツールの設定

というわけで、ここからはS3を利用するための設定を、各々のビルドツールで説明します。NulabではMavenの他にも、プロジェクトによってはGradleやsbtを利用しているので、それぞれのツールでの実現方法も調査しました。

なお、リポジトリの構築自体は、単純にバケット(と必要ならばフォルダ)を構築するだけです。

Maven

MavenからS3をリポジトリとして利用するには、Springが提供しているAWS Maven Wagon Pluginを利用します。

<build>
  <extensions>
    <extension>
      <groupId>org.springframework.build</groupId>
      <artifactId>aws-maven</artifactId>
      <version>5.0.0.RELEASE</version>
    </extension>
  </extensions>
</build>

このPluginを使うと、下記のようにs3上のバケットを指定できるようになります。

<repositories>
  <repository>
    <id>s3-repos</id>
    <name>S3 Repository</name>
    <url>s3://your-bucket/</url>
  </repository>
</repositories>

ACCESS_KEY/SECRET_KEYは、通常通り.m2/settings.xmlで渡せるほか、環境変数”AWS_ACCESS_KEY_ID”やシステムプロパティでも渡すことができます。

なお、私達が扱ってる中にはなかったのですが、parent POMを参照するようなartifactは扱えないようです。ご利用の際はご注意ください(参考:Why S3 is not the perfect Maven repository)。

Gradle

先日リリースされたGradle 2.4からデフォルトでサポートされました(リリースノート)。デフォルトサポートということもあって、最も手軽に扱えますね。

maven {
  url "s3://your-bucket/"
  credentials(AwsCredentials) {
    accessKey "xxxxxxxxx"
    secretKey "xxxxxxxxxxxxxx"
  }
}

sbt

sbtでは、Frugal Mechanic SBT S3 Resolverを利用しました。なお、Sbt S3 resolverというプラグインも公開されており、starやwatchの数がこちらの方が多くよさそうだったのですが、残念ながらMavenスタイルのartifactには対応していないため、私達の利用範囲では対象外としました。

まず、project/plugins.sbtにプラグインを追加します。

addSbtPlugin("com.frugalmechanic" % "fm-sbt-s3-resolver" % "0.5.0")

プラグイン追加後は、下記のようにresolversでs3バケットを指定します。

resolvers += "S3 repository" at "s3://your-bucket/"

認証情報の設定は、環境変数やシステムプロパティ、または~/.sbt/.s3credentialsという設定ファイルを用います。

AWS IAMユーザのポリシー設定

S3にリポジトリ移行したことによって、S3にアクセスするためのユーザをAWSに追加する必要がでてきました。必要ない権限は極力与えない方がいいので、グループにこのような最低限のポリシーを設定して各ユーザに付与しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket",
                "arn:aws:s3:::your-bucket/*"
            ]
        }
    ]
}

今回は、S3にMavenリポジトリを構築して、各ビルドツールから扱うための設定を紹介しました。各々の設定はそこまで難しくないのですが、それぞれのツールを一緒に解説しているサイトがなかなかなかったことや、GradleのS3対応はつい先日サポートされたばかりなので知らない方も多いだろうと思って、ブログ記事として紹介しました。

Nulabでは、ビルドツールと仲良くなりたい開発者を募集しています。詳細は、こちらからご確認ください。

(アイキャッチ写真: Stephanie Chapman

より良いチームワークを生み出す

チームの創造力を高めるコラボレーションツール

製品をみる