【ポートフォリオをECSで!】Rails×NginxアプリをFargateにデプロイするまでを丁寧に説明してみた(VPC作成〜CircleCIによる自動デプロイまで) 後編


概要

↓前編

後編では、独自ドメインの取得〜CircleCIの自動デプロイの設定まで行いたいと思います。

【前編】

  • 1.VPCの設定
  • 2.RDSの設定
  • 3.ECRの設定
  • 4.ECSの設定

【後編】

  • 5.独自ドメインの設定(お名前ドットコム)
  • 6.ACMの設定
  • 7.ALBの設定
  • 8.CircleCIの設定

5.独自ドメインの取得(お名前ドットコム)

前編でパブリックIPでFargateにデプロイしたアプリにアクセスできましたが、ここから独自ドメインを使ってアクセスできるように設定していきます。
以下のお名前ドットコムにアクセスして独自ドメインの設定をしていきましょう。

5.1 独自ドメインの設定

お名前ドットコムにアクセスしたら検索バーに取得したいドメインを入力し検索ボタンを押します。
筆者はmodern-tech.workを選択しました。

次に希望のドメインにチェックを入れてください。2のサーバーは利用しないを選択してください。

お申し込む内容確認画面に飛ぶので、ログインして購入画面に進みます。Whoisメールとドメインプロテクションは好みに合わせてチェックしてください。はじめの利用する場合は初めてご利用する方を選択して、登録を行ってください。

支払い方法を登録して申し込むをクリックすることで申し込みが完了します。
※ ドメインを取得して一定時間後、ドメインの取得認証のメールアドレスが登録したメールアドレス宛に送信されます。
こちらの認証がメールが届いてから2週間以内に行われない場合、ドメインが使用不可になってしまいますので注意してください。
(筆者はこちらが原因でサーバーが止まり原因特定にかなりの時間を要しました汗)

この後、以下のお名前ドットコム.naviにアクセスして操作をしていきますのでリンクを他のタブで開いておいてください。

5.2 Route53のホストゾーンの設定

Route53のホストゾーンの設定を行います。
AWSに戻り、サービスからRoute53を選び、Route53→ホストゾーン→ホストゾーンの作成で選択します。
そして以下のように設定をし、ホストゾーンの作成をクリックします。

タグ
ドメイン名 お名前ドットコムで取得したドメイン名
説明 適当
タイプ パブリックホストゾーン

5.3 ネームサーバーの設定

5.2で作成したホストゾーンを選択して詳細画面に飛んでください。
タイプがNSのルーティング先4つを最後の.を省いてコピーしてください。
例えば、xxx-00.org.であればxxx-00.orgという感じです。

コピーが終わったら他のタブで開いておいたお名前ドットコム.naviに移動します。
ドメイン→利用ドメイン一覧→取得したドメイン→ネームサーバー情報→ネームサーバーの変更で選択し、その他→その他ネームサーバーを使うより先程Route53でコピーした4つのネームサーバーを入力します。入力が完了したら確認をクリックしてください。

ネームサーバーの登録完了したら以下のコマンドをローカルターミナルで叩きRoute53のネームサーバーがドメイン名と紐付いているか確認してください。こちらは . が最後に入っています

terminal
dig 取得したドメイン名 NS +short

6.ACMの設定

AWS Certificate Manager(ACM)はSSL証明書発行サービスです。AWS内のサービスにSSLを適用させなければいけない制約はあるもののACM自体は無料で利用することができます。

6.1 ACMのリクエスト

サービスからACMを検索し、ACM→証明書のリクエストを選択します。
パブリック証明書を選択して証明書のリクエストをクリックします。
ドメインの追加画面になったら以下のように設定を行います。
*.取得したドメイン名をドメイン名に追加することで、www.modern-tech.workのようなサブドメインを設定することが可能になります。これにより、サブドメインを設定することで無限にドメインを追加する事ができるようになります。

ドメイン名
取得したドメイン名
*.取得したドメイン名

検証の選択はDNSの検証を選択し次へをクリックします。
タグの追加で以下のようにタグを設定し確認をクリックします。

タグ
タグ名 sample-acm

確認画面に行くので、確定とリクエストをクリックしてSSL証明書の発行を行います。
検証保留中の画面になるので続行を押して検証が完了するまで待ちます。
6.2のRoute53のレコードの追加に使いますのでDNS設定をファイルにエクスポートを押してCNAMEレコードの設定ファイルをダウンロードしてください。
そして、取得したDNS設定ファイルのレコード名・レコードタイプ・レコードバリューの3つをコピーしてください。(取得したドメイン名と*.取得したドメイン名で同じになってるはずです)

6.2 ACMにCNAMEレコードを追加

Route53→ホストゾーン→取得したドメイン名を選択し、レコードを作成をクリックします。

タグ
レコード名 コピーしたレコード名のドメイン名より前の部分
レコードタイプ CNAME
コピーしたレコードバリュー(最後の.も含めます)

7.ALBの設定

ECSのクラスターを形成する際にロードバランサーが必要になります。
ロードバランサーとはサーバーに掛かる負荷を分散することで、1つあたりのサーバーに掛かる負荷を抑えるものです。
これにより、サーバー一つにかかる負荷が小さくなりサーバーダウンが防げます。

7.1 ALBのセキュリティグループの作成

VPC→セキュリティグループ→セキュリティグループの作成を選択します。

タグ
名前 sample-alb-security
説明 適当
VPC sample_vpc

インバウンドルールは以下のようにhttp通信とhttps通信ができるように2つ設定します。

タグ
タイプ HTTP
リソースタイプ 任意の場所
タグ
タイプ HTTPS
リソースタイプ 任意の場所

アウトバウンドルールは以下のようにECSのセキュリティグループへのみ通信を制御するようにデフォルトの設定を削除して以下の設定を追加します。
設定が完了したらセキュリティグループを作成をクリックします。

タグ
タイプ HTTP
送信先タイプ カスタム
送信先 sample_ecs_security

7.2 ALBの作成

※この作業はSSL証明書の発行が完了しないとできないためACMからリクエストした証明書が発行されていることを確認してから実行してください。

EC2→ロードバランサー→ロードバランサーの作成を選択します。

最終的に独自のドメインを取得し、HTTPS通信することを目標とするのでApplication Load Balancer(ALB)を選択します。

ロードバランサーの設定は以下のようにします。
アドオンサービスの設定はチェックせずに次の手順へ進みます。

タグ
名前 sample-alb
リスナー HTTP, HTTPS(ポートは勝手に選択されます)
VPC sample_vpc
アベイラビリティゾーン ap-northeast-1a(sample_public_subnet1), ap-northeast-1c(sample_public_subnet2)
ログ設定 ON

セキュリティ設定の構成は以下のように設定します。
セキュリティポリシーはAWSで推奨されているデフォルトのELBSecurityPolicy-2016-08で次の手順に進みます。

タグ
証明書タイプ ACMから証明書を選択します
証明書の名前 発行した証明書

セキュリティグループの設定は7.1で作成したsample-alb-securityを選択して次の手順に進みます。

ルーティングの設定は以下のようにします。ヘルスチェックはルートパスで行われるように設定しています。設定が完了したら次の手順へ進みます。

タグ
ターゲットグループ 新しいターゲットグループ
名前 sample-target
ターゲットの種類 IP
プロトコル HTTP
ポート 80
プロトコルバージョン HTTP1

ターゲットは登録せずに確認をして作成を行ってください。

7.3 ALBを含めたECSのサービスの作成

ECS→クラスター→sample-clusterを選択してくだい。
そして、前編の4章で作成したsample-serviceを削除して新しいサービスを作成します。sample-serviceを削除した後、サービス→作成を選択します。

サービス設定は以下のように行い次のステップに進みます。

タグ
起動タイプ FARGATE
タスク定義 ファミリー sample
タスク定義 リビジョン latest
クラスター sample-cluster
サービス名 sample-alb-service
タスクの数 1

ネットワーク構成は以下のように行います。

タグ
クラスターVPC sample_vpc
サブネット sample_public_subnet1
セキュリティグループ sample_ecs_security
パブリック IP の自動割り当て ENABLED

今回はロードバランサーの設定も加えます。

タグ
ロードバランシング Application Load Balancer
ロードバランサー名 sample-alb

ロードバランス用コンテナにnginxが選択されていると思うのでロードバランサーに追加をクリックします。
その後、ターゲットグループ名をsample-targetとして次のステップに行きます。

Auto Scalingの設定は今回はしないでサービスを作成します。
サービスが起動するまで待ちましょう。

7.4 ドメインとロードバランサーの結びつけ

最後に独自ドメインからサービスにアクセスできるようにロードバランサーと結びつけをします。
Route53→ホストゾーン→取得したドメイン名→レコードの作成を選択します。
以下のように設定します。

タグ
レコード名
レコードタイプ A
トラフィックのルーティング先 エイリアスON→Application Loadbalancer→ap-northeast-1→sample-alb

また、サブドメインからもアクセスできることを確認するため以下のレコードもついでに追加します。

タグ
レコード名 www
レコードタイプ A
トラフィックのルーティング先 エイリアスON→Application Loadbalancer→ap-northeast-1→sample-alb

ここまでの設定が完了したらhttp(s)://ドメイン名で検索してみてください。以下のようにアプリが開ければ成功です。
また、http(s)://www.ドメイン名でも同様にアプリが開けることを確認してください。

※もし開けない場合、route53の設定が誤っていないか確認してみてください。また、ドメインがお名前ドットコムから発行されてからインターネットで使用できるようになるためタイムラグ(最大1日)が発生するのでしばらく待ってからアクセスを試みてください。

ルーティングの整備

httpsでの通信が確認できたらhttp通信があると暗号化されない通信に間違ってアクセスしてしまう可能性があるので、http通信を遮断します。
ALBのセキュリティグループのsample-alb-securityにアクセスしインバウンドルールの編集を選択します。

インバウンドルールが編集語に以下のようになっているのを確認してください。

再び、https://ドメイン名にアクセスしてアプリが表示されることを確認してください。また、http://ドメイン名にアクセスしてアクセスできなくなっていることを確認してください。

8.CircleCIの設定

最後にCircleCIの設定です。
こちらを設定することによりECSの自動てプロイが可能になります。

8.1 CircleCIのファイルを作成する

以下のようにCircleCIのファイルを作成してください。
今回はcircleciの自動デプロイをmasterブランチに限定しました。

.circleci/config.yml
version: 2.1

orbs:
  aws-ecr: circleci/[email protected]
  aws-ecs: circleci/[email protected]
workflows:
  # Nginxのデプロイ
  nginx-deploy:
    jobs:
      - aws-ecr/build-and-push-image:
          #AWS_ECR_ACCOUNT_URL => ${アカウントID}.dkr.ecr.${リージョン}.amazonaws.com
          account-url: AWS_ECR_ACCOUNT_URL
          # リージョン
          region: AWS_REGION
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          # ECRにリポジトリがなかったら創るか?
          create-repo: true
          # Dockerfleのパス(デフォルトはカレントディレクトリのパス)
          dockerfile: ./nginx/Dockerfile
          # ECRのリポジトリ
          repo: nginx-sample
          tag: "${CIRCLE_SHA1}"
          filters:
            branches:
              only: master
      - aws-ecs/deploy-service-update:
          requires:
            - aws-ecr/build-and-push-image
          # ECSのタスク定義名
          family: 'sample'
          # ECSのクラスター名かARNのフルパス
          cluster-name: 'sample-cluster'
          # サービス名
          service-name: 'sample-alb-service'
          # containerはタスク定義で設定したコンテナ名にする
          container-image-name-updates: "container=nginx,tag=${CIRCLE_SHA1}"

  # Railsのデプロイ
  rails-deploy:
    jobs:
      - aws-ecr/build-and-push-image:
          account-url: AWS_ECR_ACCOUNT_URL
          region: AWS_REGION
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          # ECRにリポジトリがなかったら創るか?
          create-repo: true
          dockerfile: ./Dockerfile.prod
          # ECRのリポジトリ
          repo: rails-sample
          tag: "${CIRCLE_SHA1}"
          filters:
            branches:
              only: master
      - aws-ecs/deploy-service-update:
          requires:
            - aws-ecr/build-and-push-image
          # ECSのタスク定義名
          family: 'sample'
          # ECSのクラスター名かARNのフルパス
          cluster-name: 'sample-cluster'
          # サービス名
          service-name: 'sample-alb-service'
          # containerはタスク定義で設定したコンテナ名にする
          container-image-name-updates: "container=rails,tag=${CIRCLE_SHA1}"

8.2 CircleCIの環境変数を設定

まずは以下のURLからCircleCIのプロジェクトにいき、Set Up Projectをクリックして対象のリポジトリをCircleCIが適用できるように設定します。

そして、環境変数に以下を設定します。

環境変数
AWS_ACCESS_KEY_ID IAMのアクセスキーID
AWS_SECRET_ACCESS_KEY IAMのシークレットアクセスキー
AWS_REGION ECR・ECSを作成したリージョン(ap-northeast-1)
AWS_DEFAULT_REGION ECR・ECSを作成したリージョン(ap-northeast-1)
AWS_ECR_ACCOUNT_URL {IAMのアカウントID(数字だけのやつ)}.dkr.ecr.{IAMのリージョン}.amazonaws.com

8.3 CircleCIの自動デプロイテスト

試しにヘッダーの色を黄色に変更してgithubにプッシュしてみます。
みなさんも自分のアプリの一部を変更して自動デプロイができるか確かめてみましょう。
変更が済んだら以下のようにコマンドを叩きgithubへプッシュします。

terminal
git checkout master
git add .
git commit -m "ciecleci sample test"
git push origin master

CircleCIのダッシュボードに行き自動てプロイがsuccessになっているのを確認してください。
以下のようになっていれば成功です。

CircleCIの自動てプロイが完了しているのを確認したらhttp://ドメイン名にアクセスして変更が適用されているか確認しましょう。
これで全ての工程は終了です。お疲れさまでした。
もし、使わなくなった場合は結構お金を持っていかれるので作成した構成を削除してください。

おわり

ここまで長かったですがECSの自動デプロイまで説明してきました。
AWSの構成の仕方で途中でエラーが出たり、不具合があった場合はコメントを残してくださると幸いです。
よかったらLGTMをお願いします!!