1
0

More than 1 year has passed since last update.

RailsアプリをEC2からECS/Fargate構成に移行してホストする【HTTPS/固定ドメイン編】

Last updated at Posted at 2021-12-14

はじめに

当記事は、【ECS準備編】【ECS起動編】からの続編です。

まだ、お読みでない方は先にそちらからご覧ください。

使用技術

  • ECS/Fargate(blue/greenデプロイメント)
  • ELB(ALB)
  • Rails6

作業内容

  1. ドメインの取得
  2. ACMの取得
  3. ロードバランサーの編集
  4. Railsのproduction.rbの編集
  5. Route53の設定
  6. ECSサービスの更新

1. ドメインの取得

現状は、AWS側で自動生成されたDNS名でアクセスできます。

ALB名-ランダムな数字.リージョン名.サービス名.amazonaws.com

提供しているサービスとは関係のない名称なので
自分でドメインを作成していきましょう。

例)
xxxshop.com
foodccc.jp

こういったドメイン名は、レジストラという事業者から購入できます。

お名前.comが有名ですが、AWSのRoute53からも購入できますので
当記事ではRoute53を利用します。

それでは、AWSサービス一覧からRoute53を検索して移動します。

スクリーンショット 2021-12-14 12.23.50.png

ドメイン画面に移動してドメインの登録を押します。

スクリーンショット 2021-12-14 12.25.59.png

まずは、入力フォームに任意のドメイン名を入れます。
その隣にプルダウンメニューで.com.jpなどが選べます。
選択後、チェックを押して他ドメインとの重複がないか調べてもらいます。

ステータスが使用可能となれば購入できますので
アクション下のカートに入れるをクリックします。

すると、右側にショッピングカートが出てきますので、
使用する年数を決めます。

最後に続行ボタンを押します。

スクリーンショット 2021-12-14 12.29.50.png

次のページは、個人情報の入力画面となります。

メールアドレスなどに間違えがないように入力してください。

スクリーンショット 2021-12-14 12.36.00.png

もし、存在しないメールアドレスだと以下のような忠告がAWSから出されます。

スクリーンショット 2021-12-14 12.38.10.png

最終確認画面で、AWS規約にチェックを入れて、注文を完了を押したら購入できます。

スクリーンショット 2021-12-14 12.39.58.png

2. ACMの取得

続いて、AWS版の証明書となるACMを取得します。

接続先への通信をSSLで暗号化するには、
接続先に秘密鍵証明書が必要です。

証明書は、本来は第三者機関の認証局が発行します。
ですが、AWSではACMという機能で無料で作れます。

今回はコンテナへの仲介役としてALBが存在しますので
同ALBに証明書を持たせる形になります。

それでは、まずACMを取得していきましょう。

AWSサービス一覧からacmを選択します。

スクリーンショット 2021-12-14 13.41.07.png

リクエストを押します。

スクリーンショット 2021-12-14 13.41.43.png

パブリック証明書をリクエストで次に進みます。

スクリーンショット 2021-12-14 13.42.12.png

完全修飾ドメイン名は、先ほど取得したドメインを入力します。

検証方法はDNS検証を選択します。

最後にリクエストを押します。

スクリーンショット 2021-12-14 13.47.32.png

ステータスが発行済みになったら完了です。

スクリーンショット 2021-12-14 13.49.50.png

3. ロードバランサーの編集

現在、blue/greenデプロイメントの設計上で、ALBのリスナーには
・ HTTPポート(80)
・ カスタムポート(10080)
の2つが設定されています。

そこにHTTPSポート(443)を追加します。

更に、HTTPポート(80)にはルールを指定して
HTTPSポート(443)にリダイレクトする設定を行います。

では、実装を始めましょう。

まずは、EC2画面から
サイドバーのロードバランサー → 対象ALBをチェック → リスナーのタブ →
リスナーの追加をクリックします。

スクリーンショット 2021-12-14 14.03.01.png

リスナー追加画面に移動したら、
HTTPSプロトコル443ポートとして、
blueターゲットグループを指定します。

SSL証明書は、先ほどACMで作成したものを設定しましょう。

最後にリスナーの追加をクリックします。

これで、HTTPS(443)のリスナーがALBに新しく登録されました。

スクリーンショット 2021-12-14 14.09.53.png

続いて、既存のHTTP(80)のリスナーに個別ルールを指定します。

まず、対象ALBのリスナータブに戻って、
ルールの表示/編集をクリックします。

スクリーンショット 2021-12-14 14.20.42.png

そこで新しく個別ルールの挿入していきましょう。

条件は、パスが/*と一致するなら → HTTPS(443)にリダイレクトする というものです。

*(ワイルドカード)は全てのパスとなるので、必然的にHTTP(80)にアクセスしたユーザーは
無条件でHTTPS(443)にリダイレクトされる意味になります。

スクリーンショット 2021-12-14 14.30.38.png

4. Railsのproduction.rbの編集

続いて、Rails側のコード変更です。

ここでは、config.force_ssl = trueをコメントインしています。
これにより、Railsが強制的にHTTPS通信を求める設定になります。

ただし、このままではALBのヘルスチェックはHTTP(80)としているので、
上手くパスしてくれません。

そのため、追加コードとして、ELB(ALB)のヘルスチェックに限っては
例外的にSSLを強制するコードは適用しない
とする設定を行っています。

これは、下記記事を参考にさせて頂きました。
(私のコードはrubocopで自動修正したものです。)

config/environments/production.rb
require 'active_support/core_ext/integer/time'

Rails.application.configure do

--省略--

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true
  # ELBヘルスチェックは例外として80->443のリダイレクトはしない設定
  config.ssl_options = { redirect: { exclude: ->(request) { request.env['HTTP_USER_AGENT'].include?('ELB-HealthChecker') } } }

--省略--

end

5. Route53の設定

続いて、AWS版のDNSサーバーであるRoute53の設定です。

ここでは、Aレコードのエイリアス機能を使用します。

それによって、ドメイン名でアクセスしてきたユーザーを
ALBに向けることができ、最終的に閲覧してほしいRailsコンテナに行き着きます。

以前インフラの補足:参考まで
私の前インフラ環境では、
EC2は、インスタンス起動時に変動してしまうパブリックアドレスを
ElasticIPで固定化し、Route53に名前解決を担ってもらっていました。

ECSでは、コンテナ生成時にIPアドレスが割り振られますので
固定化はできていませんが、Route53はAレコードのエイリアスを用いて
ALBに向けているので、内部で上手く処理してくれる…と推測しています。

では、実装していきましょう。

まず、Route53画面のホストゾーンを押します。

Route53でドメイン取得していれば、デフォルトでホストゾーンが存在するはずです。
もし他のレジストラでドメインを取得した場合などは、ホストゾーンを自分で作りましょう。

スクリーンショット 2021-12-14 15.29.35.png

取得したドメインをクリックします。

スクリーンショット 2021-12-14 15.31.42.png

レコードを作成をクリックします。

スクリーンショット 2021-12-14 15.36.37.png

各種ルーティングポリシーの中から、シンプルルーティングを選択します。

スクリーンショット 2021-12-14 15.37.14.png

シンプルなレコードを定義をクリックします。

スクリーンショット 2021-12-14 15.38.28.png

レコード名は、無記入でも良いです。
必要であれば、ホスト名を追加してください。

レコードタイプは、Aレコードを選択します。

ルーティング先は、ALB(エイリアス)を選択して
リージョンは東京とした上で
自分のALBを選択してください。

最後にシンプルなレコードを定義を押します。

スクリーンショット 2021-12-14 15.40.38.png

元の画面に戻りますので、レコードを作成をクリックして
レコードを完成させましょう。

スクリーンショット 2021-12-14 15.44.48.png

6. ECSサービスの更新

これで、最後の作業です。

現在、ECSと連携しているALBは
・プロダクションリスナー: HTTP(80)
・テストリスナー: カスタムTCP(10080)
としています。

そこを
・プロダクションリスナー: HTTPS(443)
・テストリスナー:カスタムTCP(10080)
に変更します。

しかし、ECSと連携しているALBのリスナー設定は
サービスの更新では対応できないようなので
新しく別のサービスを起動して対応します。

新しいサービスが正常に起動できたことを確認後、
古い方のサービスを削除します。

注意すべき点は、新しいサービスを起動する前に
ALBのプロダクションリスナーとテストリスナーのデフォルト設定を
blueとgreenに正しく分けておく工夫が必要です。

では、実装していきましょう。

まず、EC2の画面から
サイドバーのロードバランサー → 対象ALBのチェック → リスナーのタブ から
現況を確認します。

ルールの列にある転送先に注目すると、
HTTPS:443HTTP:10080のターゲットグループがgreenで同じになっていますので
このケースでは正しくありません。

blue/greenデプロイメントで何度かサービスの更新をしていると
デフォルトの転送先が意図しないものに切り替わってしまっている可能性がありますので
もし同じ現象になっている方は手動で変更します。

今回のケースでは、HTTPS:443がblueではなくgreenとなってしまっているので
ここをblueに変更していきます。
(HTTP:10080がblueとなっていても同じやり方でgreenに直せます。)

それでは、対象リスナーをチェックして、編集をクリックします。

スクリーンショット 2021-12-14 18.28.25.png

リスナー編集画面に移動したら、現在設定されている転送先を
ゴミ箱のアイコンを押して削除します。

スクリーンショット 2021-12-15 7.46.41.png

その後、アクションの追加を押して
転送先を選択します。

スクリーンショット 2021-12-14 18.34.49.png

続いて、blueターゲットグループをプルダウンで選択して
更新を押します。

これで、リスナーを
・HTTPS:443 は blueターゲットグループ
・HTTP:10080 は greenターゲットグループ
と整備ができました。

スクリーンショット 2021-12-14 18.35.39.png

ここからECSサービスを新規作成します。
更新ではなく、作成を押します。

スクリーンショット 2021-12-14 18.40.40.png

設定内容は、ECS起動編で入力したものと同じです。

スクリーンショット 2021-12-14 18.43.59.png

ここも設定内容は、ECS起動編で入力したものと同じです。

スクリーンショット 2021-12-14 18.51.15.png

ここだけ違いますので、注意します。

プロダクションリスナーはHTTPS:443とします。
(前回はHTTP:80としていました。)

テストリスナーはHTTP:10080です。

ターゲットグループは、blue-tg, green-tgの順に登録します。

スクリーンショット 2021-12-14 18.55.30.png

ここも設定内容は、ECS起動編で入力したものと同じです。

スクリーンショット 2021-12-14 19.01.19.png

ここも設定内容は、ECS起動編で入力したものと同じです。

スクリーンショット 2021-12-14 19.03.38.png

サービスの作成を押して、タスクの起動を待ちましょう。

スクリーンショット 2021-12-14 19.04.07.png

前回と同様に、ECSサービスのイベントタブより
has reached a steady state.
が確認できれば、成功しています。

スクリーンショット 2021-12-14 19.32.17.png

これで新しいサービスからタスクを生成できました。

現状は古いサービスも残っているかと思いますので、
無駄に料金コストがかからないように削除しましょう。

スクリーンショット 2021-12-15 7.52.41.png

続編

終わりに

ふと、疑問に思ったけどterraformって、GUIで作成したもの全てを
コードから構築できるんだろうか?

細かい部分だけ、部分的にGUIでしないといけなかったら
整理するの大変に感じそう…

今回も長い記事になってしまいましたが、最後までお読みいただき、
ありがとうございました!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0