WEB系プログラミングに関する雑記ブログ

このブログは、主にWEB系の話(プログラミング、IT系のニュースなど)をします。

Ec2にALB+ACMを導入してみた

今回は、

AWSのec2インスタンス常時SSL化で通信を行うために、

ACMをインストールしたALBを導入してみました。

私が今回、ALBを導入するにあたっての前提としては、 以下のような状態でした。

・ec2インスタンスを使用

・Route53を使用

ACMを取得済み

そもそもALBとは?

ALBってそもそも何?っていうところなのですが、

ALBは

  • Application

  • Load

  • Balancer

の略で、AWSが提供しているロードバランサの一つです。

ロードバランサというのは、 複数あるサーバーにアクセスの負荷分散をさせたり、 メンテナンスや障害時に切り離しを行うためのものです。

ただ、今回は、自分の作成したアプリにhttps通信できるようにしたかったので、

ACMとALBを使うことで実現したいと思い、導入をしてみました。

導入方法

まず、AWSコンソールにログインし、「サービスを検索する」のところで、 ec2を検索し、ec2ダッシュボードへ移ります。

f:id:katsu-puchi:20190720104547p:plain

まず、ALBを作成する前に、 ターゲットグループを作成します。

ターゲットグループというのは、

通信のリクエストをどこに割り振るのか、

ALBが対象にしているサーバを登録しているグループのことです。

ターゲットグループを選択。

f:id:katsu-puchi:20190720104758p:plain

「ターゲットグループを作成」をクリック。

すると、こんな画面が出てきます。 f:id:katsu-puchi:20190720110020p:plain

ターゲットグループ名は何でもいいです。

他の設定に関しては、特に何もいじらずに、デフォルトのままで作成をクリック。 ターゲットグループが作成されます。

次に、ロードバランサーをクリック。

ロードバランサーの作成をクリックすると、

以下のような画面が出るので、

一番左のApplication Load Balancerをクリック。

f:id:katsu-puchi:20190720110412p:plain

「基本的な設定」の部分で名前の入力がありますが、 名前は何でも構いません。

スキームやIPアドレスタイプはそのままで。

f:id:katsu-puchi:20190720112309p:plain

ロードバランサープロトコルには、 HTTPSを追加します。(ロードバランサーのポートは自動的に443が入ります。)

アベイラビリティーゾーンの設定では、 選択肢の中から、少なくとも2つ以上のアベイラビリティーゾーンを選択します。

なおこの際、ec2インスタンスが属しているアベイラビリティーゾーンを含む必要があります。 f:id:katsu-puchi:20190720112318p:plain

そして、次の手順: セキュリティ設定の構成をクリック。

ACMから証明書を選択するを選び、

証明書の名前のところで、デプロイしたいACMを選択します。

セキュリティポリシーの選択は、

特にデフォルトのままで進めます。

次の手順をクリック。

セキュリティグループの設定が出ますので、 新しいセキュリティグループの設定をクリックし

下記のように、httpとhttps通信を許可する設定をします。

f:id:katsu-puchi:20190720112325p:plain

次の手順をクリック。

ターゲットグループで、 既存のターゲットグループを選択。

そして、先ほど作成したターゲットグループを選択します。

次の手順をクリックし、

ターゲットの登録に問題がなければ、確認をクリックします。

これで、ロードバランサーは作成されました!

次に、route 53から、 ALBに接続できるよう設定を行います。

「サービス」からroute53を検索し、ダッシュボードを表示します。

ホストゾーンをクリックし、 ec2インスタンスと紐づいたドメインを選択。

するとレコードセットの画面が表示されるので、

Aタイプのレコードを選択し、レコードの編集のところで、 エイリアス「はい」を選択します。

f:id:katsu-puchi:20190720114058p:plain

そして、エイリアス先として、 先ほど作成したALBを選択します。

これで、ALBを通じた通信が可能になりました!

ただ、このままだと、

「httpでもhttpsでも接続できる」

という状態なので、常時SSL化をするには、 http通信できたリクエストを、httpsにリダイレクトするという設定を行います。

今回は、webサーバ(nginx)に設定を記述しました。


[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf

そして、以下の記述を追加します。

server {
~省略~

  if ($http_x_forwarded_proto != https) {
    return 301 https://$host$request_uri;
  }

~省略~

この記述の意味は、

httpでアクセスが来たものに関しては、 httpsにリダイレクトします。

という意味です。

これを記述すると、httpでリクエストが来ても、httpsにリダイレクトされるので、 常時SSL化することができます!