コンテナ開発において作成した 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
- ストレージは、GB/月あたり
リポジトリの作成
- ECR リポジトリの作成は、 AWS のマネジメントコンソールから行えます。コンソールのサービス一覧より「Elastic Container Registry」を選択します。
- ECR のページが表示されたら、「リポジトリの作成」ボタンを押します。
- 次の画面で、リポジトリ名を決めて、設定内容を確認して「リポジトリを作成」を選択します。
- 「タグのイミュータビリティ」を有効にすると、後からプッシュされたイメージのタグが同じだった場合、上書きされることを防ぐことが出来ます。
- 「プッシュ時にスキャン」を有効にすると、Docker イメージがプッシュされた際に、そのイメージのソフトウェアの脆弱性のチェックが走ります(参考: https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/image-scanning.html )。
- 「暗号化設定」を有効にすると、保管されるコンテナイメージが暗号化されます。
ライフサイクルポリシーの作成
- ライフサイクルポリシーを設定し、イメージが増えすぎてしまうのを防ぎます。
- 作成したリポジトリを選択し、 画面左側メニューの「Lifecycle Policy」を選択します。
- 「ルールの作成」を押すと、ルールの作成画面に遷移します。
- 以下の画面のように設定すると、「タグ付けされていない 14 日以上経ったイメージを期限切れにして削除する」といったルールになります。
- ライフサイクルポリシーは JSON で設定することも出来ます。
- 公式ドキュメントの例も参考にしながら、「アクション→JSONの編集」からポリシーの JSON を記述し、設定することが出来ます。
Amazon ECR Docker Credential Helper をインストールする
- Amazon ECR Docker Credential Helper をインストールして ECR のリポジトリに
docker push
やdocker pull
を出来るようにします。- これを使わない場合、
aws ecr get-login
で得られる値をもってdocker login
で接続する必要があります。
- これを使わない場合、
- macOS へのインストールは下記のコマンドで完了します。
- Windows 等他の OS でのインストール方法については、上記ツールのページを参照してください。
$ brew install docker-credential-helper-ecr
{ "credHelpers": { "[account_id].dkr.ecr.[region].amazonaws.com": "ecr-login" } }
以下のどちらかを満たしておく必要があります。
- 環境変数
AWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
を設定する - 設定ファイル
~/.aws/credentials
を用意し、認証情報を設定する- 設定方法は、設定ファイルと認証情報ファイルの設定を参照
- 環境変数
以上の設定で、リポジトリが ECR かどうかを意識する必要なく、
docker login
もせずに、以下のようにdocker pull
やdocker push
が行えます。
$ docker pull [アカウント名].dkr.ecr.[リージョン名].amazonaws.com/[リポジトリ名]:[タグ] $ docker push [アカウント名].dkr.ecr.[リージョン名].amazonaws.com/[リポジトリ名]:[タグ]
まとめ
- Docker イメージレジストリとして ECR を利用する方法を紹介しました。
- これを利用して、 AWS の各種サービスでコンテナを利用したり、 デプロイメントパイプラインを構築する方法は、別の機会に紹介します。