Amazon ECR が思った以上に簡単だったのでDocker Private Registry はコレでいいんじゃないか

こんにちは。
みなさんはいかがお過ごしでしょうか? 私はすっかりDockerかぶれになっています。

Dockerは気軽に環境を作ったり壊したりできる手軽さと、Virtualboxと比べてリソースをそこまで食わないのが嬉しいところですね。

VagrantでVMを3つくらい起動した挙句メモリが足りなくなり、
Macがグレーの画面でハングアップなんていうVagrantあるあるからおさらばできるだけでもかなりのメリットがありますね。

そんなDockerにすっかりかぶれてしまった私なので、当然CIはDroneを使うわけです。
droneは DockerベースのCIサーバーで、特徴としては

  • Docker上でビルドを行うので、常にクリーンな環境でビルドできる。
  • 設定がTravisCI、CircleCIのようにリポジトリのルートにおいた yaml ファイル一個で済むのでスマート&Git管理下における。

という感じの田中美奈子と同じくらいナウいCIサーバーです。

詳しくはこの辺を見ていただくとなんとなく特徴がわかると思います。

そんなある日、プロジェクトで使っているCIサーバーであるDroneでOracleJDKをつかいたくなってしまいました。
OpenJDKのコンテナなら、Oracleから提供されているので

1
image: oracle/openjdk:8

などと、.drone.ymlに設定すれば、たやすく環境が手に入ります。
しかしながら、OracleJDKはライセンスの関係か、オフィシャルのコンテナイメージ用意されていないようです。

ローカル環境で使うだけならば手元で docker build してあげればいいのですが、Droneちゃんは、レジストリからしかイメージを取得できないようでした。

自前でプライベートレジストリを構築するという選択肢もありましたが、ここは将来的に ECS を使うことも見据えて ECR を使っておこうということになりました(自分の中で)。

まとめ

手順等も書きますが、そもそもそんなに難しくないですし、AWSの画面にコマンド一覧出るので、とりあえずここでは言いたいことだけ書きなぐっておきます。

  • ECR簡単なので、Docker使っている場合は選択肢に入れていいと思います
  • 転送量課金なので、そこは気をつけたほうがいいかも
  • 現在バージニア、オレゴン、アイルランドでしか提供されていないので、それ以外のリージョンで「あれ? 出てこない?」とかならないように注意
  • EC2にIAMロールつけとくと、アクセスキーとか、ユーザーとか気にしなくていいからお気楽です(Amazonも推奨してます。)

一応雑な手順も書きましたので、興味があったら以下手順も見てみてください。

手順

Amazon ECR の準備

ECRは現在 3つのリージョンでしか使えませんこの辺参照
なので、今回は us-east-1 RegionでECRを使いたいと思います。

ECR Repository の作成

  1. はじめてECSを使うとウィザードに誘導されます。今回はひとまずECRだけ用意するので「Store container images securely with Amazon ECR」だけにチェックを入れて進みます。
  2. 次の画面でリポジトリ名(dockerのイメージ名)を設定すれば作成完了です。

ECR イメージ作成用インスタンスの作成

  1. EC2用IAMロール作成
    今回は、アクセスキーの管理の手間を省くため、EC2のIAMロールに ECR関連の権限を付与することにします。そのため、先にEC2用のIAMロールを作っておきます
    1. IAM -> 「新しいロールの作成」
    2. 適当なロール名を設定
      • 「ECR_CREATER」とかなんでもいいと思います
    3. AWS サービスロールから Amazon EC2 を選択
    4. 「AmazonEC2ContainerRegistryPowerUser」あたりをチェックしてロールの作成
  2. EC2インスタンスの作成
    1. 適当なイメージからEC2インスタンスを作成します
      • リージョンはどこでも良いので、いつも使っているリージョンで良いと思います
      • AMIもdockerが使えればなんでも良いです。今回はAmazonLinuxにしました
      • インスタンスタイプもまずは t2.micro とかで大丈夫です。足りなかったら後でスケールアップしましょう
      • たくさんイメージを作る・使う場合はディスクを大きめにしておくといいかもしれません
  3. イメージの作成

    1. 作成したインスタンスへログイン
    2. dockerのインストール

      1
      yum install docker
    3. dockerの起動

      1
      service docker start
    4. イメージの作成

      1
      docker build -t ${dockerのイメージ名} .
  4. イメージをRepositoryへ登録

    1. ECRへのログイン

      • aws ecr get-login でログイン文字列がもらえるのでバッククォートで直接実行するとログインできます。
        1
        `aws ecr get-login --region us-east-1`
    2. イメージへのタグ付け

      • ecr のマニュアル通りです
        1
        docker tag ${dockerのイメージ名}:latest XXXXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/${dockerのイメージ名}:latest
    3. イメージのPush

      1
      docker push XXXXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/${dockerのイメージ名}:latest

最後に

こんな感じにDockerレジストリが作れてしまうとは! と、私はひとりで感動してしまいました。
AWSなんでそれなりにお金はかかりますが、懐に余裕があれば選択肢の一つにしてもいいかも知れません。