AWSコンテナ設計・構築[本格]入門でColud9を使わずにローカルでハンズオンをする 

AWSを使ったコンテナ設計の良著である「AWSコンテナ設計・構築[本格]入門」のハンズオンの中には、Cloud9を利用している部分があります。

<img width="400" alt="aws-container-setting" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2040900/8d34da1b-05dd-5ba4-1670-45fe9be56431.png">

ローカルマシンから環境構築を行いたかったため、そのための方法をまとめました。

対象は第4章「**コンテナを構築する（基礎編）**」の下記の箇所になります。

1. ローカルからECRにイメージをプッシュ
1. ローカルから踏み台サーバーを用いてDBへアクセス

## ローカルからECRにイメージをプッシュする
本書では「4-4 コンテナレジストリの構築」がCloud9経由で行われていた。

1. コンテナレジストリの作成
1. コンテナレジストリへのネットワーク作成
1. アプリケーションのビルド
1. コンテナビルド（コンテナイメージの作成）
1. コンテナイメージをコンテナレジストリに登録（プッシュ）
1. コンテナレジストリからイメージを取得（プル）後にデプロイ

今回紹介する手順では本書p.228「アプリケーションの登録」をスキップし、p.240「コンテナアプリケーションの登録」を**Cloud9インスタンス上からではなく、ローカルマシン上から行う**ことになる。

### 具体的な手順

ECRにコンテナイメージを登録するには、まずローカルでDockerビルドをした後に、ECRへコンテナイメージをプッシュすればいい。ローカルから行うにはAWS CLIを利用したログインが必要

1. ローカルでDockerイメージのビルド
1. AWS CLIを使用してECRにログイン
1. Dockerイメージのタグづけ
1. DockerイメージをECRにプッシュ

### ローカルでDockerイメージのビルド
通常通り、Dockerファイルの存在するディレクトリ（本書であれば`/sbcntr-backend`で下記のコマンドを実行）
```bash
docker image build -t sbcntr-backend .
```

### AWS CLIを使用してECRにログイン
AWSのECRにDokcerクライアントを認証（ログイン）するためのコマンドを取得する。ここで、取得する認証トークン（パスワード）とともに、DockerクライアントからAWS ECRにログインする

基本的なコマンド
```bash
aws ecr get-login-password --region [your-region] | docker login --username AWS --password-stdin [your-account-id].dkr.ecr.[your-region].amazonaws.com
```

[your-region]と[your-account-id]はAWSアカウントを確認すればよく、AWSの画面の右上に表Messageとされるリージョン（us-east-1など）とアカウントID（xxxx-xxxx-xxxxのハイフンを抜いた数字12桁）を使う

### Dockerイメージのタグ付け
ECRに登録するには、一工夫必要でIMAGE IDとして決められた形式で登録する必要がある※本書に記載の通り

```bash
docker tag sbcntr-backend:v1 [your-account-id].dkr.ecr.ap-northeast-1.amazonaws.com/sbcntr-backend:v1
```

### ECRへコンテナイメージを登録
最後、ECRへビルドしたイメージを登録。
ターミナル上から下記のコマンドを実行。

```
docker image push sbcntr-backend:v1 [your-account-id].dkr.ecr.ap-northeast-1.amazonaws.com/sbcntr-backend:v1
```

ここまでで、Cloud9を用いずにローカル環境からECRへコンテナイメージを登録することができた。

## EC2で踏み台サーバーを作り、パブリックサブネット内からプライベートサブネット内にあるDBに接続する

次に、データベース作成後のデータベース接続をCloud9を用いずにローカルから実施する。

Auroraはプライベートサブネット内に存在しているため、直接ローカルからアクセスできないため、新たにEC2インスタンスを作成しそれを踏み台サーバーとして疎通する。

### 具体的な手順

下記のステップで実施する
1. 踏み台サーバー用のEC2インスタンスの作成
1. SSHトンネルの設定
1. ローカルマシンからDBへ接続

### 踏み台サーバー用のEC2インスタンスの作成
1. EC2ダッシュボードのインスタンスから[インスタンスの作成]
1. 名前：「management」などの名前をつける
1. インスタンスタイプ：無料枠のt2.microを選択
1. AMI：特にこだわりがなければ「AWS LINUX」を選択
1. 既存のキーペア(手元に作成済み秘密鍵があること)があればそれを、なければ新規作成する　。ここでは「sbcntr-ec2.ppm」を作成したとする。
1. VPC：sbcntrVpcを選択（本書のハンズオン通り作っていれば）
1. サブネット：sbcntr-subnet-public-management-1a（本書のハンズオン通り作っていれば）
1. パブリックIPの自動割り当て：有効化
1. セキュリティグループ：management（本書のハンズオン通り作っていれば）
1. あとは特に変えずに「インスタンスを起動」を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2040900/3592920a-9f40-244d-c76a-545a88d5c1fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2040900/de35847e-1391-1f56-77c5-045fe42e73ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2040900/b80957dd-6c3e-cd51-fff5-057e35e0282f.png)

### SSHトンネルの設定
ローカルマシンから踏み台サーバーを経由してDBに接続するために、SSHトンネルを使用する。

まず、下記コマンドで、pemの権限を変更する
```bash
chmod 600 [踏み台サーバーの秘密鍵のパス]
```

パスが`~/.ssh/sbcntr-ec2.pem`であれば

```bash
chmod 600 ~/.ssh/sbcntr-ec2.pem
```

次に、以下のコマンドを使用してSSHトンネルをセットアップする
```bash
ssh -i [踏み台サーバーの秘密鍵のパス] -L [ローカルポート]:[RDSのエンドポイント]:3306 [踏み台サーバーのユーザー]@[踏み台サーバーのIPまたはDNS名]
```
例えば
- 踏み台サーバーの秘密鍵のパス：~/.ssh/sbcntr-ec2.pem
- ローカルポート：3307
- RDSのエンドポイント：sbcntr-db-instance-1-us-east-1a.abcdefghijk.us-east-1.rds.amazonaws.com。エンドポイントはRDSの管理画面より取得
- 踏み台サーバーのユーザー：ec2-user
- 踏み台サーバーのIP：18.123.456.789。踏み台サーバーのIPは対象のEC2の管理画面より取得
であれば

```bash
ssh -i ~/.ssh/sbcntr-ec2.pem -L 3307:sbcntr-db-instance-1-us-east-1a.abcdefghijk.us-east-1.rds.amazonaws.com:3306 ec2-user@18.123.456.789
```

上記コマンドを打つと踏み台サーバーに接続され、SSHトンネルが設定される。これはバックグラウンドで実行せずにフォアグラウンドで開いたままにしておく。そうしないと、SSHトンネルが切断される。

### ローカルマシンからDBへ接続
SSHトンネルをセットアップしたターミナルのタブを開いたままの状態で、タブをもう一つ開く。

そこで下記のコマンドを打つことで、ローカルマシンからDBへ接続できる

```bash
mysql -h 127.0.0.1 -P [ローカルポート] -u [RDSのユーザー名] -p
```
例えば
- ローカルポート：3307
- RDSのユーザー名：adminの場合は

```bash
mysql -h 127.0.0.1 -P 3307 -u admin -p
```

このあとパスワードを求められるため、DBインスタンスを作成した際に取得してあるパスワードを入力するとDBに接続できる。

## 最後に
これで、第4章のハンズオンはCloud9を使わずに実施できると思います。最後まで見ていただきありがとうございました。

本記事で扱っている本

https://www.amazon.co.jp/AWS%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E8%A8%AD%E8%A8%88%E3%83%BB%E6%A7%8B%E7%AF%89-%E6%9C%AC%E6%A0%BC-%E5%85%A5%E9%96%80-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E9%87%8E%E6%9D%91%E7%B7%8F%E5%90%88%E7%A0%94%E7%A9%B6%E6%89%80/dp/4815607656

<img width="400" alt="aws-container-setting" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2040900/8d34da1b-05dd-5ba4-1670-45fe9be56431.png">

## 参考
https://blog.hrfmmr.com/2022/12/30/get_started_with_ecs/

https://zenn.dev/devcamp/articles/3c08827387cfb9

https://qiita.com/zaki-lknr/items/4586cc2f992908068bd2