Dockerを用いたローカルのアプリをECSにデプロイする(その1)
少し前にDocker, Docker Composeを用いたローカルのアプリをECSにデプロイしたので手順を記述します。手順は3記事に分けて説明をする次第で、この記事では手順7まで記述します。
全体の手順
- VPC作成
- パブリックサブネット・プライベートサブネット作成
- インターネットゲートウェイ作成・追加設定
- ルートテーブル作成・追加設定
- クラスター作成
- RDS用のサブネットグループ作成
- RDSインスタンス作成
- セキュリティグループ作成
- ECRのレポジトリ作成・イメージのプッシュ
- Route53の設定
- ALB作成
- アプリのドメインをALBのドメインと紐付け
- entrypoint.shの作成
- Dockerfileの修正
- database.ymlの修正
- タスク定義
- サービス作成・タスク実行
デプロイ後の構成
前提
- Dockerfile, docker-compose.ymlを用いてローカルでアプリ用のコンテナを起動している
- アプリにはRuby, Railsを使用している
- dotenv-railsをインストールして.envファイルを作成している
1. VPC作成
VPCはAWS上にあるユーザ専用のネットワークです。この記事でこれから作成する、サブネット・タスク・ALB・RDSインスタンスなどのコンポーネントを設置するための大枠となるネットワークをこの手順で作成していきます。
2. タスク用サブネット・RDSインスタンス用サブネット作成
サブネットはVPCなどのネットワークを分割して作った小さなネットワークです。この小さなネットワークに、タスクやRDSインスタンスなどのインスタンスと呼ばれるものを設置していきます。
1つ目のタスク用サブネット
サブネット名:自由な名前(必須でない)
アベイラビリティーゾーン:ap-northeast-1a
2つ目のタスク用サブネット
1つ目のRDSインスタンス用サブネット
2つ目のRDSインスタンス用サブネット
上記4つのサブネットのIPv4 CIDR ブロックは、VPCで設定したIPv4 CIDR ブロックに包含されている必要があります。 例えばVPCのIPv4 CIDR ブロックを50.0.0.0/16としていた場合、サブネットのIPv4 CIDR ブロックは50.0.1.0/24などとするのが例えば適当です。
図にするほどのことでもないかもですが、こんな感じです。
3. インターネットゲートウェイ作成・追加設定
インターネットゲートウェイはNAT機能を持つコンポーネントです。インターネットから来た通信はインターネットゲートウェイを通じて宛先IPがALBのグローバルIPからALBのプライベートIPに変換されます。
名前:自由(必須でない)
【作成後の追加設定】
インターネットゲートウェイ一覧から作成したインターネットゲートウェイ選択→「アクション」から「VPCにアタッチ」を選択→手順1で作成したVPCを選択→「インターネットゲートウェイのアタッチ」を押下
4. ルートテーブル作成・追加設定
ルートテーブルはルーティングの機能を持つコンポーネントです。インターネットゲートウェイは通信の宛先IPをグローバルIPからプライベートIPに変換してくれましたが、そこからALBに通信を送る機能はおそらく持っていません。そこでルートテーブルの設定をすることで、VPCに届いた、宛先IPがALBのプライベートIPである通信はALBへと送られます。反対にVPCからインターネットに通信が出ていく際のルーティングの設定も行います。
【作成後の追加設定】
- ルートテーブルとサブネットの関連付け
ルートテーブル一覧から作成したルートテーブルID押下→「サブネットの関連付け」を押下→「サブネットの関連付けを編集」押下→手順2で作成した4つのサブネットを選択→「save associations」を押下
- インターネットから通信を受け取るためのルーティング追加
ルートテーブル一覧から作成したルートテーブルID押下 →「ルート」を押下 →「ルートを編集」を押下 →「Add route」を押下 →「Destination」の検索窓で「0.0.0.0/0」を選択 →「Target」の検索窓で「Internet Gateway」を選択すると手順3で作成したインターネットゲートウェイが候補に表示されるので、さらに選択 →「変更を保存」を押下
5. クラスター作成
クラスターは(厳密ではないと思いますが)EC2インスタンスの集まりです。クラスターの上でタスクが展開される形になります。
- クラスターテンプレートの選択:ネットワーキングのみ
6. RDS用のサブネットグループ作成
サブネットグループはサブネットをグループとして集めたものです。ここでは手順1で作成したRDSインスタンス用サブネットを2つ集めてサブネットグループにしています。RDSインスタンスを作成する際に必要です。
7. セキュリティグループ作成
セキュリティグループはそのインスタンスに入ってくる通信・出ていく通信の制御を行うためのコンポーネントです。例えばプロトコルがAの通信は入ってくるの許可するけど、プロトコルがBの通信は許可しません、みたいなそういう感じです。
【ECSクラスター用セキュリティグループの作成】
インバウンドルール
1つ目のルール
- タイプ:HTTP
- ソース:0.0.0.0/0
2つ目のルール
- タイプ:カスタムTCP
- ポート範囲:3000
- ソース:0.0.0.0/0
アウトバウンドルール
【RDSインスタンス用セキュリティグループの作成】
インバウンドルール:
- 1つ目のルール
- タイプ:MySQL/Aurora
- ポート範囲:3306
- ソース:0.0.0.0/0
- 1つ目のルール
アウトバウンドルール