Dockerを用いたローカルのアプリをECSにデプロイする(その1)

少し前にDocker, Docker Composeを用いたローカルのアプリをECSにデプロイしたので手順を記述します。手順は3記事に分けて説明をする次第で、この記事では手順7まで記述します。

全体の手順

  • VPC作成
  • パブリックサブネット・プライベートサブネット作成
  • インターネットゲートウェイ作成・追加設定
  • ルートテーブル作成・追加設定
  • クラスター作成
  • RDS用のサブネットグループ作成
  • RDSインスタンス作成
  • セキュリティグループ作成
  • ECRのレポジトリ作成・イメージのプッシュ
  • Route53の設定
  • ALB作成
  • アプリのドメインをALBのドメインと紐付け
  • entrypoint.shの作成
  • Dockerfileの修正
  • database.ymlの修正
  • タスク定義
  • サービス作成・タスク実行

デプロイ後の構成

f:id:rinda_1994:20210613220304p:plain

前提

  • Dockerfile, docker-compose.ymlを用いてローカルでアプリ用のコンテナを起動している
  • アプリにはRuby, Railsを使用している
  • dotenv-railsをインストールして.envファイルを作成している

1. VPC作成

VPCAWS上にあるユーザ専用のネットワークです。この記事でこれから作成する、サブネット・タスク・ALB・RDSインスタンスなどのコンポーネントを設置するための大枠となるネットワークをこの手順で作成していきます。

  • 名前タグ:自由な名前(必須でない)

  • IPv4 CIDR ブロック:自分で設定(必須。自分はサブネットマスクを16にしました)

  • IPv6 CIDR ブロック:なし

f:id:rinda_1994:20210612105130p:plain

2. タスク用サブネット・RDSインスタンス用サブネット作成

サブネットはVPCなどのネットワークを分割して作った小さなネットワークです。この小さなネットワークに、タスクやRDSインスタンスなどのインスタンスと呼ばれるものを設置していきます。

VPC ID:手順1で作成したVPCを選択

f:id:rinda_1994:20210612163926p:plain

1つ目のタスク用サブネット

  • サブネット名:自由な名前(必須でない)

  • アベイラビリティーゾーン:ap-northeast-1a

  • IPv4 CIDR ブロック:自分で設定(必須。自分はサブネットマスクを24にし、他3つのサブネットも同様にしました)

f:id:rinda_1994:20210612163943p:plain

2つ目のタスク用サブネット

  • サブネット名:自由な名前(必須でない)

  • アベイラビリティーゾーン:ap-northeast-1c

  • IPv4 CIDR ブロック:自分で設定(必須)

f:id:rinda_1994:20210612163957p:plain

1つ目のRDSインスタンス用サブネット

  • サブネット名:自由な名前(必須でない)

  • アベイラビリティーゾーン:ap-northeast-1a

  • IPv4 CIDR ブロック:自分で設定(必須)

f:id:rinda_1994:20210612164014p:plain

2つ目のRDSインスタンス用サブネット

  • サブネット名:自由な名前(必須でない)

  • アベイラビリティーゾーン:ap-northeast-1c

  • IPv4 CIDR ブロック:自分で設定(必須)

f:id:rinda_1994:20210612164028p:plain

上記4つのサブネットのIPv4 CIDR ブロックは、VPCで設定したIPv4 CIDR ブロックに包含されている必要があります。 例えばVPCIPv4 CIDR ブロックを50.0.0.0/16としていた場合、サブネットのIPv4 CIDR ブロックは50.0.1.0/24などとするのが例えば適当です。

図にするほどのことでもないかもですが、こんな感じです。

f:id:rinda_1994:20210612164807p:plain

3. インターネットゲートウェイ作成・追加設定

インターネットゲートウェイはNAT機能を持つコンポーネントです。インターネットから来た通信はインターネットゲートウェイを通じて宛先IPがALBのグローバルIPからALBのプライベートIPに変換されます。

名前:自由(必須でない)

f:id:rinda_1994:20210612214233p:plain

【作成後の追加設定】

インターネットゲートウェイ一覧から作成したインターネットゲートウェイ選択→「アクション」から「VPCにアタッチ」を選択→手順1で作成したVPCを選択→「インターネットゲートウェイのアタッチ」を押下

4. ルートテーブル作成・追加設定

ルートテーブルはルーティングの機能を持つコンポーネントです。インターネットゲートウェイは通信の宛先IPをグローバルIPからプライベートIPに変換してくれましたが、そこからALBに通信を送る機能はおそらく持っていません。そこでルートテーブルの設定をすることで、VPCに届いた、宛先IPがALBのプライベートIPである通信はALBへと送られます。反対にVPCからインターネットに通信が出ていく際のルーティングの設定も行います。

  • 名前:自由(必須でない)

  • VPC:手順1で作成したVPCを選択

f:id:rinda_1994:20210612213431p:plain

【作成後の追加設定】

  • ルートテーブルとサブネットの関連付け

ルートテーブル一覧から作成したルートテーブルID押下→「サブネットの関連付け」を押下→「サブネットの関連付けを編集」押下→手順2で作成した4つのサブネットを選択→「save associations」を押下

f:id:rinda_1994:20210612213506p:plain

  • インターネットから通信を受け取るためのルーティング追加

ルートテーブル一覧から作成したルートテーブルID押下 →「ルート」を押下 →「ルートを編集」を押下 →「Add route」を押下 →「Destination」の検索窓で「0.0.0.0/0」を選択 →「Target」の検索窓で「Internet Gateway」を選択すると手順3で作成したインターネットゲートウェイが候補に表示されるので、さらに選択 →「変更を保存」を押下

f:id:rinda_1994:20210612215256p:plain

5. クラスター作成

クラスターは(厳密ではないと思いますが)EC2インスタンスの集まりです。クラスターの上でタスクが展開される形になります。

  • クラスターテンプレートの選択:ネットワーキングのみ

f:id:rinda_1994:20210613092607p:plain

f:id:rinda_1994:20210613092833p:plain

6. RDS用のサブネットグループ作成

サブネットグループはサブネットをグループとして集めたものです。ここでは手順1で作成したRDSインスタンス用サブネットを2つ集めてサブネットグループにしています。RDSインスタンスを作成する際に必要です。

  • 名前:自由な名前(必須)

  • VPC:手順1で作成したVPCを選択

f:id:rinda_1994:20210613093847p:plain

f:id:rinda_1994:20210613093900p:plain

7. セキュリティグループ作成

セキュリティグループはそのインスタンスに入ってくる通信・出ていく通信の制御を行うためのコンポーネントです。例えばプロトコルがAの通信は入ってくるの許可するけど、プロトコルがBの通信は許可しません、みたいなそういう感じです。

【ECSクラスター用セキュリティグループの作成】

  • セキュリティグループ名:自由な名前(必須)

  • 説明:適当に記載(必須)

  • VPC:手順1で作成したVPCを選択

f:id:rinda_1994:20210613222355p:plain

  • インバウンドルール

    • 1つ目のルール

      • タイプ:HTTP
      • ソース:0.0.0.0/0
    • 2つ目のルール

      • タイプ:カスタムTCP
      • ポート範囲:3000
      • ソース:0.0.0.0/0
  • アウトバウンドルール

f:id:rinda_1994:20210613214738p:plain

f:id:rinda_1994:20210613135924p:plain

【RDSインスタンス用セキュリティグループの作成】

  • セキュリティグループ名:自由な名前(必須)

  • 説明:適当に記載(必須)

  • VPC:手順1で作成したVPCを選択

f:id:rinda_1994:20210613222355p:plain

  • インバウンドルール:

    • 1つ目のルール
      • タイプ:MySQL/Aurora
      • ポート範囲:3306
      • ソース:0.0.0.0/0
  • アウトバウンドルール

f:id:rinda_1994:20210613222830p:plain