65
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS FargateにRailsアプリケーションをデプロイする手順

Last updated at Posted at 2021-06-22

AWS Fargateについて無知だったので、RailsアプリケーションをFargateで動かすことを目指して、色々触っていました。

とりあえず、RailsアプリをGithubActionsで自動デプロイしてSidekiqも裏で動く、みたいなところまでできるようになりましたので、その手順を半年後の自分でもわかるように残しておきます。

※本番環境で使われるベストプラクティスを示しているとかではありません。ご了承ください :pray:

AWSコンソールでの設定

東京リージョンを選択しておきます。
AWS_Management_Console.png

IAMポリシー・IAMロールの作成

ECSを動かす際に必要なIAMポリシー作成とIAMロールの編集を行います。

まずは、以下から、IAMポリシーの作成を行います。
IAM_Management_Console.png

ポシリーの作成画面に遷移後、JSONのタブを開きます。
スクリーンショット 2023-03-15 21.39.33.png

こちらのJSONを入力ください。自分のアカウントIDを入力する欄もあります。アカウントIDの確認は次に示します。

{
    "Statement": [
        {
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": ""
        },
        {
            "Action": [
                "ssmmessages:OpenDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:CreateControlChannel",
                "ssm:GetParameters",
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": ""
        },
        {
            "Action": "iam:PassRole",
            "Effect": "Allow",
            "Resource": "arn:aws:iam::###:role/ecsTaskExecutionRole", //自分のアカウントIDを###に入力します
            "Sid": ""
        },
        {
            "Action": "ecs:ExecuteCommand",
            "Effect": "Allow",
            "Resource": "arn:aws:iam::###:role/ecsTaskExecutionRole", //自分のアカウントIDを###に入力します
            "Sid": ""
        }
    ],
    "Version": "2012-10-17"
}

アカウントIDの確認方法

AWS管理コンソールの右上をクリックします。
すると、アカウントIDが載っています。こちらは1234-56798-9123のようにハイフン込みで記載がありますが、上記のIAMポリシーのJSONにはハイフンなしで記載してください。
AWS_Management_Console.png

例)ハイフンなしの例

"Resource": "arn:aws:iam::123456789123:role/ecsTaskExecutionRole",

IAMポリシーのJSONの入力が完了したら次へ進み、IAMポリシーの作成まで進んでください。
名前は「ecs-task-execution-policy」としています。

IAM_Management_Console.png

IAMポリシーの作成が完了したら、次は、IAMロールの作成を行います。

IAMロールの編集

IAMロールから「ecsTaskExecutionRole」と検索して、次へ進みます。

IAM_Management_Console.png

続いて、「許可を追加」から「ポリシーをアタッチ」へ進みます。

IAM_Management_Console.png

先ほど作ったポリシー「ecs-task-execution-policy」で検索して、チェック後、許可を追加します。
IAM_Management_Console.png

これでIAMの編集は以上です。

ECRの作成

DockerHubのようなもので、コンテナイメージを保存してしておくことができます。
あとの章で、Railsを動かすためのDockerfileの作成を行います。

以下からリポジトリを作成を行います。

Amazon_ECR.png

作成画面へ行ったら以下のように入力していきます。

フォーム
可視設定 プライベート
リポジトリ名 fargate-test
プッシュ時のスキャン チェックを入れる

Amazon_ECR.png
Amazon_ECR.png

上記の設定でリポジトリを作成します。
ここで表示されているリポジトリ名をECS Taskの作成の章で利用します。

ECS Taskの作成

※左上の「新しいECSエクスペリエンス」をオフにしていただくと、以下のスクショと似た画面になると思います。

docker-compose.ymlのようなもので、どのコンテナを動かすかなどの設定を記載していきます。
こちらから「新しいタスク定義の作成」を行います。
Amazon_ECS.png

起動タイプは「Fargate」を選択
Amazon_ECS.png

タスク定義を入力していきます。

フォーム
起動タイプ Fargate
タスク定義名 fargate-test
タスクロール ecsTaskExecutionRole
タスク実行ロール ecsTaskExecutionRole
タスクメモリ(GB) 0.5
タスクCPU 0.25 vCPU

イメージ
Amazon_ECS.png
Amazon_ECS.png

以下のボタンからコンテナの追加も行います。

Amazon_ECS.png

入力内容は以下です。

フォーム
コンテナ名 fargate-test
イメージ #####.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:latest(ECRを作成していたときのリポジトリ名が入ります)
ポートマッピング 80
環境のコマンド欄 /app/entrypoint.sh

イメージ

Amazon_ECS.png
Amazon_ECS.png

こちらの入力ができたら、「作成」ボタンを押してタスクの作成を行います。
次にクラスターの作成を行います

クラスターの作成

クラスターを作成します。このタイミングで同時にVPC,Subnetなども作成していきます。

  1. クラスターテンプレートは、今回Fargateを利用するので「ネットワーキングのみ」を選択します。
    Amazon_ECS.png

  2. クラスターの設定に進みます

フォーム
クラスター名 fargate-test
VPCの作成 チェックする
CIDRブロック 10.0.0.0/16
サブネット1 10.0.0.0/24
サブネット2 10.0.1.0/24
CloudWatch Container Insights チェックする

Amazon_ECS-2.png
Amazon_ECS-3.png

上記の設定を入力したら、作成ボタンを押して作成を行います。

作成が完了したら以下のような画面になります。

Amazon_ECS-4.png

※ それぞれのVPC, サブネット,  インターネットゲートウェイ, ルートテーブルに「fargate-test」のような名前をつけておくのがおすすめです。

例えばインターネットゲートウェイの名前が空ならば、タグ管理から
キー:Name
値:fargate-test
のようにして保存をします。

VPC_Management_Console.png

すると、以下のようにNameタグが追加されます。

VPC_Management_Console.png

ロードバランサーの作成

EC2の画面からロードバランサーの作成が可能です。

EC2_Management_Console.png

入力内容は以下になります。

フォーム
ロードバランサーの種類 Application Load Balancer
名前 fargate-test
スキーマ インターネット向け
ロードバランサーのプロトコル HTTP
ロードバランサーのポート 80
VPC クラスタ作成時に一緒に作成したVPC
アベイラビリティーゾーン ap-northeast-1a, ap-northeast-1c両方にチェック

イメージ
ロードバランサーの作成___EC2_Management_Console.png
ロードバランサーの作成___EC2_Management_Console.png

※SSL証明書を取得後に、HTTPSプロトコルの追加は行います。

ロードバランサーのセキュリティグループ

続いて、セキュリティグループの設定を行います。

フォーム
セキュリティグループの割り当て 新しいセキュリティグループを作成する
セキュリティグループ名 fargate-test
タイプ HTTP
ソース 0.0.0.0/0, ::/0

ロードバランサーの作成___EC2_Management_Console.png

ロードバランサーのルーティング設定

続いて、ルーティングの設定を行います。

フォーム
ターゲットグループ 新しいターゲットグループ
名前 fargate-test
ターゲットの種類 IP
プロトコル HTTP
ポート 80
プロトコルバージョン HTTP1
ヘルスチェックプロトコル HTTP
ヘルスチェックパス /api/health_check

ロードバランサーの作成___EC2_Management_Console.png

続いて、ターゲットの登録へ進みます。

フォーム
ネットワーク クラスタ作成時に一緒に作成したVPC
ポート 80
IP ここでは空で大丈夫です

ロードバランサーの作成___EC2_Management_Console.png

こちらの設定を入力したら、確認後、作成を行います。

サービスの作成

ECSクラスターの画面からサービスの作成が可能です。

Amazon_ECS.png

入力内容は以下になります。

フォーム
起動タイプ Fargate
クラスタ fargate-test
サービス名 fargate-test
タスク定義 fargate-test
タスクの数 1
デプロイメントタイプ Blue/Greenデプロイメント
デプロイメント設定 CodeDeployDefault.ECSAllAtOnce
CodeDeploy のサービスロール AWSCodeDeployRole

イメージ
Amazon_ECS.png

次のステップに進みます。

フォーム
VPC クラスタ作成時に一緒に作成したVPCを選択
サブネット クラスタ作成時に一緒に作成した2つのサブネットを選択
セキュリティグループ fargate-test(ロードバランサー作成時に作成したセキュリティグループ
ロードバランサーの種類 Application Load Balancer
ヘルスチェックの猶予期間 300
ロードバランサー名 fargate-test(上で作成したロードバランサーを選択)
プロダクションリスナーポート 80:HTTP
テストリスナー チェックなし
ターゲットグループ 1 の名前 fargate-test(ロードバランサー作成時に作成したものを選択)
ターゲットグループ 2 の名前 新規作成(ターゲットグループ1と異なる必要があるため)
ターゲットグループ 2 のプロトコル HTTP
ターゲットグループ 2 のヘルスチェックパス /api/health_check
サービスの検出の統合の有効化 チェックなし

イメージ
Amazon_ECS.png
Amazon_ECS.png

Amazon_ECS.png

Amazon_ECS.png

Amazon_ECS.png

ここまで入力したら次のステップへ進みます。

フォーム
Service Auto Scaling サービスの必要数を直接調整しない

Amazon_ECS.png

次のステップへ進みます。
おそらくこれで確認画面が表示されます。問題なければ、サービスの作成を行います。

うまくいくと、以下のような作成完了画面になります。
Amazon_ECS.png

これでサービス作成は完了です。

RDSの作成

MySQLの例で作成していきます。

が、まずはRDSの作成に必要なPrivateサブネットを2つ、それらをまとめたサブネットグループの作成を行います。

Private Subnetの作成

VPCの管理画面からサブネットの作成が可能です。
サブネット___VPC_Management_Console.png

以下の内容で2つのSubnetを作成します。

VPC ID サブネット名 アベイラビリティーゾーン IPv4 CIDR ブロック
1 fargate-test ffargate-test/Private-1a ap-northeast-1a 10.0.2.0/24
2 fargate-test ffargate-test/Private-1c ap-northeast-1c 10.0.3.0/24

イメージ
VPC_Management_Console.png

完成すると↓
サブネット___VPC_Management_Console.png

Subnet Groupの作成

RDS用に上で手順で作成した2つのPrivate SubnetをまとめるSubnet Groupを作成します。
ここから作成が可能です。

RDS_·_AWS_Console.png

入力する値は以下になります。

フォーム
名前 fargate-test
VPC fargate-test
説明 fargate-test subnet group
アベイラビリティーゾーン ap-northeast-1a, ap-northeast-1c
サブネット 10.0.2.0/24, 10.0.3.0/24

イメージ

RDS_·_AWS_Console.png

RDS_·_AWS_Console.png

こちらの設定を入力したら、作成を実行します。

RDSの作成

さてRDS作成の準備が以上で整いましたので、RDSの作成を行っていきます。
なお本記事ではMySQLを例にしています。

以下のボタンから「データベースの作成」を行います。
RDS_·_AWS_Console.png

作成画面に遷移したら、以下の内容を入力します。
今回はテンプレート「無料利用枠」で行います。

フォーム
エンジンのタイプ MySQL
DBインスタンス識別子 fargate-test
マスターユーザー名 admin
パスワード ご自身で適当に
Virtual Private Cloud (VPC) fargate-test(作成したVPC)
サブネットグループ fargate-test(先程作成したSubnetGroup)
パブリックアクセス可能 なし
VPC セキュリティグループ 新規作成
新しい VPC セキュリティグループ名 fargate-test-rds
アベイラビリティーゾーン 指定なし
データベース認証 パスワード認証

Notification_Center.png

RDS_·_AWS_Console.png

さらに以下の「追加設定」のボタンからデータベース名の入力も行います。

RDS_·_AWS_Console.png

上記の設定が完了したら、「データベースの作成」を行います。
データベース作成後は、 パスワードの確認ができなくなります ので、メモしておいてください。

RDS用セキュリティグループの編集

先程RDSを作成したタイミングで一緒に作成されたセキュリティグループを編集していきます。
このセキュリティグループの編集によって、PrivateSubnetにあるRDSへの接続が可能になります。

先程作成されたセキュリティグループの「インバウンドルールを編集」から編集を行っていきます。

EC2_Management_Console.png

以下のようにルールの追加を行います。

フォーム
タイプ MYSQL/Aurorra
ソース fargate-test

EC2_Management_Console.png

こちらの入力が完了したら、ルールを保存し完了です。

System Managerでパラメータストアの作成

DBのパスワードなどの秘匿情報はコード上に残したくないので、ここに登録しておきます。

このページへ遷移して、、、
AWS_Systems_Manager.png

「パラメータの作成」を押します。
AWS_Systems_Manager_-_Parameter_Store.png

フォームが表示されます。

AWS_Systems_Manager_-_Parameter_Store.png

4つのパラメータを入力します。
それぞれフォームには以下のように入力していきます。

名前 タイプ KMS キーソース KMS キー ID
/fargate-test/rails-master-key 安全な文字列 現在のアカウント alias/aws/ssm Railsの config/master.key にある値を入力
/fargate-test/db-username 安全な文字列 現在のアカウント alias/aws/ssm admin(RDS作成時に設定したユーザー名)
/fargate-test/db-password 安全な文字列 現在のアカウント alias/aws/ssm RDS作成時に設定したパスワード
/fargate-test/db-host 安全な文字列 現在のアカウント alias/aws/ssm 先程作成したRDSのエンドポイントを入力

RDSのエンドポイントは、ここを確認します。
RDS_·_AWS_Console.png

パラメータストアの入力イメージ
AWS_Systems_Manager_-_Parameter_Store.png
AWS_Systems_Manager_-_Parameter_Store.png

4つの登録したらパラメータストアの入力は完了です。

タスク定義で新しいリビジョンを作成

次に、先程作成したタスク定義で、今作ったパラメータストアの値を参照できるようにします。

タスク定義のページから「新しいリビジョンの作成」を行います
Amazon_ECS.png

以下のコンテナを押してコンテナの編集を行います。

Amazon_ECS.png

環境変数の欄に、上で作ったパラメータストア4つを参照できるように入力していきます。

さらに、Railsを起動するのに必要な環境変数も追加しておきます。こちらは秘匿情報ではないので、パラメータストアは利用していません。

全部で環境変数は以下の7つになります。

キー Value
RAILS_ENV Value production
RAILS_SERVE_STATIC_FILES Value true
RAILS_LOG_TO_STDOUT Value true
DB_PASSWORD ValueFrom /fargate-test/db-password (パラメータストアの名前が入る)
DB_HOST ValueFrom /fargate-test/db-host
DB_USERNAME ValueFrom /fargate-test/db-username
RAILS_MASTER_KEY ValueFrom /fargate-test/rails-master-key

イメージ
Amazon_ECS.png

この入力が完了したら更新します。

Rails側の設定

今まで行った設定をもとにRailsファイルの編集とDockerfileの作成を行います。

Database.ymlの編集

AWS RDSにつなぐために、database.ymlのProduction環境の設定を書き換えます。

production:
  <<: *default
  database: fargate_test
  # 環境変数を読み込むように設定
  password: <%= ENV['DB_PASSWORD'] %>
  username: <%= ENV['DB_USERNAME'] %>
  host: <%= ENV['DB_HOST'] %>

HealthCheck用のAPIを作成

config/routes.rbにhealth_check用のpathを追加

  namespace :api do
    resources :health_check, only: :index
  end

app/controllers/api/health_check_controller.rbファイル作成

class Api::HealthCheckController < ApplicationController
  def index
    logger.info "============================================================"
    logger.info "ReuqestUrl: #{request.url}"
    render json: {status: 200}, status: 200
  end
end

Dockerfile作成

# docker/productionフォルダを作成
mkdir -p docker/production/
# docker/productionフォルダにDockerfileを作成
touch docker/production/Dockerfile

docker/production/Dockerfileの作成

FROM ruby:2.7.2 AS base

WORKDIR /app
ENV RAILS_ENV production
ENV NODE_MAJOR_VERSION 14
ENV BUNDLE_DEPLOYMENT true
ENV BUNDLE_PATH vendor/bundle
ENV BUNDLE_WITHOUT development:test
RUN gem update --system && gem install bundler:2.1.4

# builder
FROM base AS builder

RUN curl -sL https://deb.nodesource.com/setup_$NODE_MAJOR_VERSION.x | bash - && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list && \
    apt-get update -qq && \
    apt-get install -y --no-install-recommends \
    vim locales build-essential curl libpq-dev libmariadb-dev nodejs yarn nginx sudo

# bundle
FROM builder AS bundle

COPY Gemfile Gemfile.lock .
RUN bundle install --jobs=4 --retry=3 && rm -rf $BUNDLE_PATH/ruby/$RUBY_VERSION/cache/*

# yarn
FROM builder AS yarn

COPY package.json yarn.lock .
RUN yarn install --production --frozen-lockfile && yarn cache clean

# main
FROM builder AS main

COPY . .

COPY --from=bundle /app/vendor/bundle /app/vendor/bundle
COPY --from=yarn /app/node_modules /app/node_modules

# nginx
RUN groupadd nginx
RUN useradd -g nginx nginx
ADD docker/production/nginx.conf /etc/nginx/nginx.conf
ADD docker/production/entrypoint.sh /app/entrypoint.sh

EXPOSE 80

RUN chmod +x /app/entrypoint.sh

docker/production/entrypoint.shの作成

docker/productionフォルダにentrypoint.shファイル作成します。
コンテナ起動時に動かしたいコマンドを記述していきます

#!/bin/bash

sudo service nginx start
cd /app
RAILS_ENV=production bin/rails db:migrate
RAILS_ENV=production bin/rails assets:precompile
bundle exec pumactl start

.dockerignoreの作成

Dockerのイメージに含めたくないファイルやフォルダを記載します

.dockerignore
node_modules/
public/packs/
vendor/
log/
tmp/
!/tmp/pids/.keep
!/tmp/sockets/.keep
.git
.env
config/master.key
.github/
deploy/
spec/
storage/

nginx.confの作成

docker/production/フォルダにnginx.confファイルを作成します。

ここにはNginxの設定を記載します

user nginx;
worker_processes auto;
error_log /dev/stderr info;
pid /var/log/nginx.pid;

events {
  worker_connections 1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format json escape=json '{"time": "$time_iso8601",'
        '"remote_addr": "$remote_addr",'
        '"host": "$host",'
        '"http_host": "$http_host",'
        '"proxy_add_x_forwarded_for": "$proxy_add_x_forwarded_for",'
        '"scheme": "$scheme",'
        '"remote_user": "$remote_user",'
        '"status": "$status",'
        '"server_protocol": "$server_protocol",'
        '"request_method": "$request_method",'
        '"request_uri": "$request_uri",'
        '"request": "$request",'
        '"body_bytes_sent": "$body_bytes_sent",'
        '"bytes_sent": "$bytes_sent",'
        '"request_time": "$request_time",'
        '"upstream_response_time": "$upstream_response_time",'
        '"upstream_connect_time": "$upstream_connect_time",'
        '"upstream_addr": "$upstream_addr",'
        '"http_user_agent": "$http_user_agent",'
        '"http_referer": "$http_referer"}';

  access_log  /dev/stdout  json;

  sendfile        on;
  keepalive_timeout  65;
  include /etc/nginx/conf.d/*.conf;

  upstream app {
    server unix:///app/tmp/sockets/puma.sock;
  }

  server {
    listen 80 default_server;
    # 作成したロードバランサーのDNS名を記載します
    server_name fargate-test-421980051.ap-northeast-1.elb.amazonaws.com;
    root /app/public;

    location / {
      proxy_pass http://app;
    }

    client_max_body_size 100m;
    keepalive_timeout 5;
  }
}

config/puma.rbの編集

一番下の行に以下を追記します

app_root = File.expand_path('..', __dir__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

これで、ひとまずFargateでRailsを動かす設定は完了です。
DockerfileをBuildして、ECRにPushしていきましょう。

PushのコマンドはAWS管理画面のECRから確認することが可能です。
Amazon_ECR.png

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin #####
docker build -f docker/production/Dockerfile -t fargate-test .
docker tag fargate-test:latest #####.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:latest
docker push #####.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:latest

こんな感じのコマンドになります。
Pushが完了すると、ECRに以下のようにLatestタグで追加されます。
Amazon_ECR.png

動きを確認

ここまでうまくできたら動きます。
作ったロードバランサーのDNS名にアクセスします。動いていたら成功です。

EC2_Management_Console.png

ドメインを設定

現在はロードバランサーのDNS名がURLになっています。
これを自分で設定したドメインでアクセスできるようにしていきます。

今回は、お名前.com で購入したドメイン (hatsu38.com)にサブドメイン(fargate-test.)をつける設定を行っていきます。

Route53でホストゾーンの作成

Route53の画面の以下のボタンからホストゾーンのページへ遷移します。

Route_53_Console.png

ホストゾーンの作成では、以下の内容で作成を行います。

フォーム
ドメイン名 fargate-test.hatsu38.com
説明 fargate-test.hatsu38.com
タイプ パブリックホストゾーン

Route_53_Console_Hosted_Zones.png

入力が完了したら、ホストゾーンの作成を実行します。

Route_53_Console_Hosted_Zones.png

作成を行うと、NSレコードの値が4つ、SOAレコードの値が1つが確認できるかと思います。

このホストゾーンにAレコードの追加を行います。

Route_53_Console_Hosted_Zones.png

上記から進むと、ルーティングポリシーの選択画面になります。
ここではシンプルルーティングを選択します。
Route_53_Console_Hosted_Zones.png

さらに進みレコードタイプの選択を行います。

フォーム
レコード名
レコードタイプ Aレコード
Application LoadBarancer,ap-northeast-1,fargate-testのALB

Route_53_Console_Hosted_Zones.png

上記のように入力が済んだら、レコードの作成に進めます。

ここまで完了したらRoute53での作業は終了です。

続いてRoute53で確認したNSレコードの値をお名前.comに入力していきます。

お名前.comでの設定

お名前.comにログインしたら、以下のボタンからDNSの設定ページへ遷移します。

ドメインNavi.png

該当のドメインを選択して、次へ進みます

ドメインNavi.png

続いて「DNSレコード設定を利用する」を押します。

ドメインNavi.png

するとホスト名などを入力する画面が表示されますので、Route53で確認した値を入力していきます。

ホスト名 TYPE VALUE
fargate-test NS Route53で表示されていた ns-で始まる値
fargate-test NS Route53で表示されていた ns-で始まる値
fargate-test NS Route53で表示されていた ns-で始まる値
fargate-test NS Route53で表示されていた ns-で始まる値

ドメインNavi.png

上記のように入力が済んだら、一番下の「DNSレコード設定用ネームサーバー変更確認」のチェックだけ外して確認画面へ進み、設定を行います。

ドメインNavi.png

Nginxに対象のドメインドメイン追加

docker/production/nginx.conf というファイルに以下のような記述があったかと思います。

  server {
    listen 80 default_server;
    # 作成したロードバランサーのDNS名を記載します
    server_name fargate-test-421980051.ap-northeast-1.elb.amazonaws.com;
    root /app/public;

    location / {
      proxy_pass http://app;
    }

    client_max_body_size 100m;
    keepalive_timeout 5;
  }

この server_name に対象のドメインの追加を行います。

  server {
    listen 80 default_server;
    # 対象のドメインを指定
    server_name fargate-test.hatsu38.com fargate-test-421980051.ap-northeast-1.elb.amazonaws.com;
    root /app/public;

    location / {
      proxy_pass http://app;
    }

    client_max_body_size 100m;
    keepalive_timeout 5;
  }

ファイルの変更を行ったら再度 Dockerbuild~ECRへのPushの流れを行います。

再デプロイ

デプロイ時間の修正

現在のBlue/Greenデプロイの設定では、Blue(古いバージョン)からGreen(新しいバージョン)に切り替わるまで結構時間がかかります。デフォルトで1時間になっているので、まずはこちらの編集をしておきます。

まずは指定のアプリケーションの詳細を表示します。

CodeDeploy_-_AWS_Developer_Tools.png

続いてデプロイメントグループの編集です。

CodeDeploy_-_AWS_Developer_Tools.png

下の方にある「元のリビジョンの終了」の欄を、今回はテストなので「0時間0分」にしておきます。

CodeDeploy_-_AWS_Developer_Tools.png

この変更を完了したら、「変更の保存」を行います。

ECRへのPush

まずは以下の流れでECRへのPushを行います。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin #####
docker build -f docker/production/Dockerfile -t fargate-test .
docker tag fargate-test:latest #####.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:latest
docker push #####.dkr.ecr.ap-northeast-1.amazonaws.com/fargate-test:latest

Pushを実行すると ECRの管理画面で Imageタグの行が2つに増えていると思います。

Amazon_ECR.png

ECRのPushをしたら、そのDockerイメージをECS ServiceやTaskが利用できるようしていきます。

ECS Serviceの更新

該当のECS Serviceにチェックを入れて更新をします

Amazon_ECS.png

更新に進むと、リビジョンの選択ができると思います。
こちらのリビジョンを Latest にする、 新しいデプロイのの強制にチェックを入れます。
ほかはそのままで問題ありません。

Amazon_ECS.png

全部進めたら「サービスの更新」を行ってください。

これでドメイン設定の作業は完了です。数時間待つとドメインが反映されるかと思います。

FargateTest.png

HTTPSでアクセスできるようにSSL化

現在はhttp:// であり、 https:// ではアクセスできません。

ここではHTTPSでアクセスできるようにしてきます。

HTTPSにするために必要な証明書は、AWS Certificate Managerというサービスで作成が可能です。
この作業を行っていきます。

SSL証明書の作成

Certificate Managerから「証明書のリクエスト」を行います。

AWS_Certificate_Manager.png

パブリック証明書のリクエストを選択して「証明書のリクエスト」を行います。

AWS_Certificate_Manager.png

続けてドメイン名を入力します。

AWS_Certificate_Manager.png

続けて DNSの検証 を選択します。

AWS_Certificate_Manager.png

タグ名は、からのまま次に進めます。
確認画面までいったら、「確定とリクエスト」を実行して完了です。

AWS_Certificate_Manager.png

作ってすぐは「検証保留中」のステータスになっています。

AWS_Certificate_Manager.png

ここで「Route53でのレコードの作成」を実行します。

また、ドメインの詳細にある、名前、種類、値を参考にお名前.comに設定を追加します。

お名前.comでの設定

ホスト名に名前、TYPEはCNAME、値に値を入れます。

ドメインNavi.png

入力したら設定を完了します。

ロードバランサーの編集

作ったロードバランサー「fargate-test」のリスナーに「HTTPS」を追加していきます。

以下から「リスナーの追加」を行います。
EC2_Management_Console.png

リスナー追加画面では、以下の内容を入力します。

フォーム
プロトコル:ポート HTTPS:443
アクションの追加 転送先
ターゲットグループ : 重み (0~999) fargate-test
セキュリティポリシー ELBSecurityPolicy-FS-1-2-2019-08
デフォルトの SSL 証明書 ACMから:fargate-testを選択(Certificate Managerで作った証明書を選択)

リスナー___EC2_Management_Console.png

上記のように入力が完了したら、リスナーを追加します。

セキュリティグループの編集

現在はセキュリティグループでHTTPSを受け付けていません。
HTTPSでもアクセスできるように編集していきます。

セキュリティグループの画面へ行き、「fargate-test」を選択し、インバウンドルールを編集します。

EC2_Management_Console.png

インバウンドルール編集画面では、タイプに「HTTPS」を選択してCIDRブロックには「0.0.0.0/0,::/0」の2つを選択します。

EC2_Management_Console.png

上記の入力が完了したら「ルールを保存」を実行します。

これで設定が完了です。 https:// のURLで表示できるようになると思います。

HTTPでアクセスできないようにする

ロードバランサーのHTTPリスナーを編集

HTTPリスナーのルールを編集します。
以下のボタンから編集が可能です。
ロードバランサー___EC2_Management_Console.png

この画面に来たらルールの挿入を行います。
ルール___EC2_Management_Console.png

パスを /*にして、 アクションは「リダイレクト先」を選択します。
HTTPSプロトコルを選択し、ポートは443を入力します。

ルール___EC2_Management_Console.png

入力が完了したら保存して終了です。

アプリケーションの編集

こちらはアプリケーションとNginxの方で対応します。

Railsをforce_sslにする

まずは config/environments/production.rb に以下のようなコメントアウトされたコードがあると思いますので、

# config.force_ssl = true

以下のようにコメントを外します。

config.force_ssl = true

NginxをSSLにする

docker/production/nginx.confを編集します

  server {
    listen 80 default_server;
    # ↓443を追加
    listen 443 default_server;
    server_name fargate-test.hatsu38.com fargate-test-421980051.ap-northeast-1.elb.amazonaws.com;

    # ここから
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    # ここまで追加

    root /app/public;

    location / {
      proxy_pass http://app;
    }

    client_max_body_size 100m;
    keepalive_timeout 5;
  }
}

ここまでできたら、再度デプロイを行ってください。

デプロイが完了すると、http://で始まるURLでアクセスしてもhttps://のURLに変わっているかと思います。

終わりに

長かったっですが、以上でRailsをFargateで動かす手順が完了です。
次は、このデプロイをGithubActionsで自動デプロイできるようにしていきます。

こちらの記事↓

Sidekiqの導入はこちら↓

Terraformで構築するバージョンはこちら↓

65
57
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
65
57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?