AWSを使ったコンテナ設計の良著である「AWSコンテナ設計・構築[本格]入門」のハンズオンの中には、Cloud9を利用している部分があります。
ローカルマシンから環境構築を行いたかったため、そのための方法をまとめました。
対象は第4章「コンテナを構築する(基礎編)」の下記の箇所になります。
- ローカルからECRにイメージをプッシュ
- ローカルから踏み台サーバーを用いてDBへアクセス
ローカルからECRにイメージをプッシュする
本書では「4-4 コンテナレジストリの構築」がCloud9経由で行われていた。
- コンテナレジストリの作成
- コンテナレジストリへのネットワーク作成
- アプリケーションのビルド
- コンテナビルド(コンテナイメージの作成)
- コンテナイメージをコンテナレジストリに登録(プッシュ)
- コンテナレジストリからイメージを取得(プル)後にデプロイ
今回紹介する手順では本書p.228「アプリケーションの登録」をスキップし、p.240「コンテナアプリケーションの登録」をCloud9インスタンス上からではなく、ローカルマシン上から行うことになる。
具体的な手順
ECRにコンテナイメージを登録するには、まずローカルでDockerビルドをした後に、ECRへコンテナイメージをプッシュすればいい。ローカルから行うにはAWS CLIを利用したログインが必要
- ローカルでDockerイメージのビルド
- AWS CLIを使用してECRにログイン
- Dockerイメージのタグづけ
- DockerイメージをECRにプッシュ
ローカルでDockerイメージのビルド
通常通り、Dockerファイルの存在するディレクトリ(本書であれば/sbcntr-backend
で下記のコマンドを実行)
docker image build -t sbcntr-backend .
AWS CLIを使用してECRにログイン
AWSのECRにDokcerクライアントを認証(ログイン)するためのコマンドを取得する。ここで、取得する認証トークン(パスワード)とともに、DockerクライアントからAWS ECRにログインする
基本的なコマンド
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として決められた形式で登録する必要がある※本書に記載の通り
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インスタンスを作成しそれを踏み台サーバーとして疎通する。
具体的な手順
下記のステップで実施する
- 踏み台サーバー用のEC2インスタンスの作成
- SSHトンネルの設定
- ローカルマシンからDBへ接続
踏み台サーバー用のEC2インスタンスの作成
- EC2ダッシュボードのインスタンスから[インスタンスの作成]
- 名前:「management」などの名前をつける
- インスタンスタイプ:無料枠のt2.microを選択
- AMI:特にこだわりがなければ「AWS LINUX」を選択
- 既存のキーペア(手元に作成済み秘密鍵があること)があればそれを、なければ新規作成する 。ここでは「sbcntr-ec2.ppm」を作成したとする。
- VPC:sbcntrVpcを選択(本書のハンズオン通り作っていれば)
- サブネット:sbcntr-subnet-public-management-1a(本書のハンズオン通り作っていれば)
- パブリックIPの自動割り当て:有効化
- セキュリティグループ:management(本書のハンズオン通り作っていれば)
- あとは特に変えずに「インスタンスを起動」を実行
SSHトンネルの設定
ローカルマシンから踏み台サーバーを経由してDBに接続するために、SSHトンネルを使用する。
まず、下記コマンドで、pemの権限を変更する
chmod 600 [踏み台サーバーの秘密鍵のパス]
パスが~/.ssh/sbcntr-ec2.pem
であれば
chmod 600 ~/.ssh/sbcntr-ec2.pem
次に、以下のコマンドを使用してSSHトンネルをセットアップする
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の管理画面より取得
であれば
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へ接続できる
mysql -h 127.0.0.1 -P [ローカルポート] -u [RDSのユーザー名] -p
例えば
- ローカルポート:3307
- RDSのユーザー名:adminの場合は
mysql -h 127.0.0.1 -P 3307 -u admin -p
このあとパスワードを求められるため、DBインスタンスを作成した際に取得してあるパスワードを入力するとDBに接続できる。
最後に
これで、第4章のハンズオンはCloud9を使わずに実施できると思います。最後まで見ていただきありがとうございました。
本記事で扱っている本
参考