Amazon ECRの概要

AWSの資格をいくつか取得したはいいもののハンズオンが不十分なため、
実際にシステムを構築するために必要な基礎知識について、
BlackBeltを参考にしながら理解を深めるために整理します。

## Amazon ECRとは

#### コンテナイメージレジストリのマネージドサービス

- コンテナ（例：Docker）

開発者のPC、テスト環境、本番環境でOSのバージョン、インストールされているライブラリ、設定などが微妙に異なり、「開発環境では動いたのに、本番環境では動かない」という問題が頻繁に発生する。

Dockerは、アプリケーションとその依存関係（OSの一部、ライブラリ、ミドルウェア、設定ファイルなど）を「コンテナ」という独立したパッケージにまとめる。

このコンテナイメージを一度作成すれば、どの環境でも同じように実行できるため、環境による差異をなくし、一貫性と再現性の高い環境を簡単に構築できる。

- コンテナイメージ

コンテナをつくる設計図のようなもの

- ECR

コンテナイメージ（アプリの設計図）を安全に保管・管理するための場所。AWSが管理してくれるため、倉庫の管理についてあれこれ心配する必要はない。

## レジストリとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/2daf4771-52bd-4849-afaa-31ada1b54da8.png)

- レジストリ
    - AWSアカウント毎に用意される
    - イメージを保存するためのリポジトリを複数作成できる
    - Dockerクライアントを認証して利用
- リポジトリ
    - Dockerイメージ、OCIイメージ、OCI互換アーティファクトを保存
        - OCIイメージとは：コンテナイメージの互換性と相互運用性を高めるために策定された**業界標準**に準拠したコンテナイメージのこと
- リポジトリポリシー
    - リポジトリとリポジトリ内のイメージへのアクセス権を制御
- 認証トークン
    - IAM認証情報を利用して、レジストリに対して認証する

#### サポートする2つのアクセスタイプ

- プライベートレジストリ(Amazon ECR)
    - 利用する(pull・push等)にはIAMベース認証が必要
- パブリックレジストリ(Amazon ECR Public)
    - 認証無しでもイメージのpullが可能
    - 公開されているイメージを検索可能
- Amazon ECR / Amazon ECR Publicでサポートされている機能が異なる（後述）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/97d6b0cc-cb94-467e-8bb3-0eccd055930d.png)

#### 利用例(コマンドの差異：pushとpullを例にした場合）

- プライベートレジストリ
    - 開発者：docker push **123456789012.dkr.ecr.<region>.amazonaws.com**/<image>:<tag>
    - 認証されていない利用者：利用不可
- パブリックレジストリ
    - 開発者：docker push **public.ecr.aws**/<alias>/<image>:<tag>
    - 認証されていない利用者：docker pull **public.ecr.aws**/<alias>/<image>:<tag>
- Amazon ECR Docker Credential Helper

## 主な機能

#### イメージのクロスリージョンレプリケーション　＜プライベートレジストリ＞

- コンテナイメージを、別リージョン・別AWSアカウントにレプリケーションすることが可能
- イメージをPushした際、自動でレプリケーションされる
- 脆弱性の検出結果はレプリケーションされない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/c7bd060f-eb2e-4c47-94da-c8fb702b4a0d.png)

#### イメージの脆弱性スキャン　＜プライベートレジストリ＞

- ECRにpushされたコンテナイメージの脆弱性を検出する
- Basic scanning
    - 検出対象：OSパッケージ
    - スキャン実行：on push / マニュアル実行
    - 追加料金なしで利用可能
- Enhanced scanning
    - 検出対象：OSパッケージ、プログラミングライブラリ
    - スキャン実行：on push / 継続的
    - Amazon Inspectorとの統合

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/0db029aa-edf4-485f-8024-7ff4bb197f6b.png)

#### Pull Through Cache　＜プライベートレジストリ＞

- パブリックレジストリのイメージをECR Privateでキャッシュできる
- リモートレジストリと自動同期
    - DockerHubなどの外部レジストリから自動でECRにイメージをコピーしてくれる
    - 24時間以内に同期される
- アップストリーム（イメージの配信元）のパブリックレジストリとして ECR Public と Quay.io をサポートしている
    - DockerHubに加え、ECR PublicとQuay.ioも対象ということ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/ab95ada7-c8cf-42bb-b3d7-63fc83cb2f54.png)

#### Amazon ECR Public Gallery　＜パブリックレジストリ＞

- Amazon ECR publicで公開されているコンテナイメージを検索
- Docker公式イメージも利用可能
- AWS App Runnerサービスを直接起動することも可能
    - App Runner：ソースコードやコンテナイメージから“自動でWebアプリを公開”してくれるサービス。サーバー管理やインフラ構築は一切不要。とにかく「アプリを動かしたい人」向け。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/88cd6ce4-8ee2-4fec-ab68-123147e66610.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/d2655ecd-0c03-477b-8bff-73dc7153ef27.png)

## まとめ

AWSの資格を取ったり知識を入れても実環境を操作できなければ意味がないので、
Flask、Docker、Code Pipline等を交えて実装の経験を積みたいと思います。