Dockerユーザー必見！Amazon ECRへのプッシュ手順を徹底解説


ようこそ！この記事では、ローカルで作成した Docker イメージを **Amazon Elastic Container Registry (ECR)** にプッシュする手順を、細かすぎるぐらい詳細に解説します。  
「Docker と ECR の連携って、まるで一見すると複雑なパズルみたいじゃない？」と感じるあなたも、この記事を読めばきっとこう叫ぶでしょう：  
「おお、これは簡単すぎる！なんで最初からやらなかったんだろう！」

---

## 必要な前提条件 ～準備がすべて～

準備なしに行動するのは、冒険に出るのに地図を持たないようなもの。以下の準備を確実に行いましょう。

### 1. AWS CLI のインストールと設定
AWS CLI をインストールしていない？それはパスタを作るのに鍋を持っていないようなものです。[こちらの公式ドキュメント](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)を参考にインストールを完了してください。

### 2. Docker のインストール
Docker はこの作業の基盤となるツールです。もし未インストールなら、[Docker の公式サイト](https://docs.docker.com/get-docker/)へ行きましょう。インストール後、`docker --version` で確認してみてください。「Docker, ready for action!」と聞こえる気がするはず。

### 3. AWS SSO (Single Sign-On) の設定
AWS SSO プロファイルが正しく設定されている必要があります。まだ設定していない場合は、[AWS SSO の公式ガイド](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)をご確認ください。

### 4. Amazon ECR リポジトリ
プッシュ先となるリポジトリが存在していない場合、以下のコマンドで作成します：
```bash
aws ecr create-repository --repository-name <リポジトリ名> --region <リージョン>
```
「リポジトリがない状態でプッシュする」のは「貯金箱がないのにお金を貯めようとする」ぐらい無意味です。

---

## 手順概要 ～スムーズな作業の流れ～

1. AWS SSO を使って AWS にログイン
2. Docker の認証を Amazon ECR に設定
3. ローカルの Docker イメージに適切なタグを付与
4. Amazon ECR に Docker イメージをプッシュ

---

## 手順詳細 ～初心者からプロフェッショナルまで～

### ステップ 1: AWS SSO でログイン

AWS CLI を使用して AWS SSO にログインします。

```bash
aws sso login --profile <プロファイル名>
```

#### 実行例:
```bash
aws sso login --profile sotaheavymetal21
```

**結果**:
ブラウザが自動的に開き、AWS SSO ログインページが表示されます。コードを入力して認証を完了すると以下が表示されます。
```plaintext
Successfully logged into Start URL: https://d-xxxxxxxx.awsapps.com/start#/
```
これで第一ステップが完了！ゲームのスタートボタンを押した気分ですね。

---

### ステップ 2: Docker の認証情報を設定

Docker が Amazon ECR にアクセスできるように認証トークンを設定します。

```bash
aws ecr get-login-password --region <リージョン> --profile <プロファイル名> | docker login --username AWS --password-stdin <アカウント番号>.dkr.ecr.<リージョン>.amazonaws.com
```

#### 実行例:
```bash
aws ecr get-login-password --region ap-northeast-1 --profile sotaheavymetal21 | docker login --username AWS --password-stdin 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com
```

**結果**:
```plaintext
Login Succeeded
```
「ログイン成功」の文字を見た瞬間の安心感…あなたも感じましたか？

---

### ステップ 3: Docker イメージにタグを付与

Amazon ECR リポジトリ向けにローカルイメージにタグを付与します。

```bash
docker tag <ローカルイメージ名>:<タグ> <ECRリポジトリURI>:<タグ>
```

#### 実行例:
- Django:
  ```bash
  docker tag sota-app:latest 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sotaheavymetal21/django:latest
  ```
- Nginx:
  ```bash
  docker tag sota-nginx:latest 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sotaheavymetal21/nginx:latest
  ```

タグ付けの作業は「名前札を付ける」感覚。これがなければ ECR はどのイメージをどこに保存するのか混乱してしまいます。

---

### ステップ 4: Amazon ECR にイメージをプッシュ

タグ付けしたイメージを Amazon ECR にプッシュします。

```bash
docker push <ECRリポジトリURI>:<タグ>
```

#### 実行例:
- Django:
  ```bash
  docker push 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sotaheavymetal21/django:latest
  ```
- Nginx:
  ```bash
  docker push 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sotaheavymetal21/nginx:latest
  ```

**成功時の出力例**:
```plaintext
The push refers to repository [000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/sotaheavymetal21/django]
latest: digest: sha256:<HASH> size: <SIZE>
```

これで完了！あなたのイメージは無事にクラウド上に旅立ちました。

---

## トラブルシューティング

### 1. セッションが切れてしまった場合
**エラー例**:
```plaintext
The security token included in the request is invalid.
```
**解決策**: 再度以下を実行してください。
```bash
aws sso login --profile <プロファイル名>
```

### 2. リポジトリが存在しない場合
**エラー例**:
```plaintext
repository not found
```
**解決策**: リポジトリを作成します。
```bash
aws ecr create-repository --repository-name <リポジトリ名> --region <リージョン>
```

### 3. ネットワークの問題
**エラー例**:
```plaintext
CannotPullContainerError
```
**解決策**:
NAT ゲートウェイや VPC 設定を確認し、外部接続ができることを確保します。

---

## 結論

これで、ローカル Docker イメージを Amazon ECR にプッシュする方法が完璧にマスターできました。  
「AWS は難しい…」と思っていた日々も、今日からおさらばです。次はデプロイ！どんどん学んでいきましょう。

---

## 参考資料

- [Amazon ECR の公式ドキュメント](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)
- [AWS CLI の公式ドキュメント](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html)
- [Docker の公式リファレンス](https://docs.docker.com/)