Amazon ECR で Docker イメージを保管する

コンテナ開発において作成した Docker イメージを保管するコンテナレジストリとして、 AWS で提供されている Amazon ECR (Elastic Container Registry) を利用してみます。

Amazon ECR とは

  • AWS が提供するコンテナレジストリのサービスです。
  • IAM を使ってリポジトリーポリシーを決めることで、リポジトリリポジトリ内のイメージへのアクセス権を制御できます。
    • プライベートリポジトリとして利用可能です。
  • ECR に保管されたイメージは、ECS や EKS といった、コンテナを利用する AWS の各種サービスでの利用のほか、 AWS 外でも利用することができます。

ECR の料金

  • 料金は、ストレージの利用量とデータ転送量による従量課金です。
    • ストレージは、GB/月あたり 0.10USD です。
    • データ転送は、リージョンによって料金が異なりますが、東京リージョンでは以下のようになっています。
      • データ受信には料金はかからない
      • データ送信
        • 1 GB/月まで: 0.00USD/GB
        • 次の 9.999 TB/月: 0.114USD/GB
        • 次の 40 TB/月: 0.089USD/GB
        • 次の 100 TB/月: 0.086USD/GB
        • 150 TB/月以上: 0.084USD/GB

リポジトリの作成

  • ECR リポジトリの作成は、 AWS のマネジメントコンソールから行えます。コンソールのサービス一覧より「Elastic Container Registry」を選択します。
  • ECR のページが表示されたら、「リポジトリの作成」ボタンを押します。

f:id:linkode-okazaki:20200828101124p:plain

  • 次の画面で、リポジトリ名を決めて、設定内容を確認して「リポジトリを作成」を選択します。
    • 「タグのイミュータビリティ」を有効にすると、後からプッシュされたイメージのタグが同じだった場合、上書きされることを防ぐことが出来ます。
    • 「プッシュ時にスキャン」を有効にすると、Docker イメージがプッシュされた際に、そのイメージのソフトウェアの脆弱性のチェックが走ります(参考: https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning.html )。
    • 「暗号化設定」を有効にすると、保管されるコンテナイメージが暗号化されます。

f:id:linkode-okazaki:20200828100718p:plain

  • リポジトリが作成されたら発行される URI は、イメージのプッシュやプルを行う際に必要です。

f:id:linkode-okazaki:20200828100714p:plain

ライフサイクルポリシーの作成

  • ライフサイクルポリシーを設定し、イメージが増えすぎてしまうのを防ぎます。
  • 作成したリポジトリを選択し、 画面左側メニューの「Lifecycle Policy」を選択します。

f:id:linkode-okazaki:20200828100710p:plain

  • 「ルールの作成」を押すと、ルールの作成画面に遷移します。
    • 以下の画面のように設定すると、「タグ付けされていない 14 日以上経ったイメージを期限切れにして削除する」といったルールになります。

f:id:linkode-okazaki:20200828100706p:plain

  • ライフサイクルポリシーは JSON で設定することも出来ます。

f:id:linkode-okazaki:20200828100701p:plain

f:id:linkode-okazaki:20200828100657p:plain

Amazon ECR Docker Credential Helper をインストールする

  • Amazon ECR Docker Credential Helper をインストールして ECR のリポジトリdocker pushdocker pull を出来るようにします。
    • これを使わない場合、aws ecr get-login で得られる値をもって docker login で接続する必要があります。
  • macOS へのインストールは下記のコマンドで完了します。
    • Windows 等他の OS でのインストール方法については、上記ツールのページを参照してください。
$ brew install docker-credential-helper-ecr
  • ECR を操作できる権限を付与した、 AWS CLI のプロファイルに切り替えておきます。
  • .docker/config.json を以下のように編集します。
{
  "credHelpers": {
    "[account_id].dkr.ecr.[region].amazonaws.com": "ecr-login"
  }
}
  • 以下のどちらかを満たしておく必要があります。

  • 以上の設定で、リポジトリが ECR かどうかを意識する必要なく、docker login もせずに、以下のように docker pulldocker push が行えます。

$ docker pull [アカウント名].dkr.ecr.[リージョン名].amazonaws.com/[リポジトリ名]:[タグ]
$ docker push [アカウント名].dkr.ecr.[リージョン名].amazonaws.com/[リポジトリ名]:[タグ]

まとめ

  • Docker イメージレジストリとして ECR を利用する方法を紹介しました。
  • これを利用して、 AWS の各種サービスでコンテナを利用したり、 デプロイメントパイプラインを構築する方法は、別の機会に紹介します。

参考資料