プロジェクト

全般

プロフィール

第2回【VPC初級編その1】

最も基本的なサービスの一つであるEC2でサーバを2台立てて、SpringBootで作成した超シンプルなRestAPIのアプリケーションを起動し、ELB(ロードバランサー)を通してHTTPで公開してみます。

構成図

今回はデフォルトで作成されているVPCとサブネット上にEC2インスタンスを構築します。
EC2は2つのAZに配置した冗長化構成として、ELB(ALB:アプリケーションロードバランサ)でリクエストをロードバランシングします。

VPCとサブネット

アカウント作成後にdefaultのVPCと各AZのサブネットを持っている。
デフォルトのサブネットはすべてパブリックサブネット。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/default-vpc.html

  • ①パブリックなサブネット:ルートテーブルでigwがアタッチされているやつ→グローバルIPを持ちインターネットから参照可能、インターネットを参照可能
  • ②プライベートなサブネット:↑ではないやつ。インターネットから参照負荷。インターネットを参照不可。
  • ③プロテクテッドなサブネット:プライベートだけど、NATゲートウェイあるいはNATインスタンスを通じてインターネットを参照可能、インターネットからは参照不可(一方向)

※ 実際の現場ではAPサーバを③に配置、DBを②に配置、踏み台サーバーを①に配置(APサーバやDBがインターネットに直接公開されていない)という構成が一般的かと思います。
ローカル開発環境からRDSにアクセスしたい場合、Teratermのポート転送機能などを使って踏み台(bastion)サーバー経由でアクセスします。

VPCピアリング:異なるVPC(異なるリージョンやAWSアカウント間でも)間で、相互に通信する方法(CIDRブロックの重複を避ける必要がある)
https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/what-is-vpc-peering.html
※ ↑ 私は使ったことはないがアソシエイトの認定試験にはたぶん出る

ネットワークACL、セキュリティグループ

  • ネットワークACL:サブネット単位のアクセス制御。
  • セキュリティグループ:各インスタンスにアタッチするアクセス許可設定。

ネットワークACLはあまり使っている事例を見たことがない。セキュリティグループで制御するのがおそらく一般的。
なぜネットワークACLでなくセキュリティグループで細かいトラフィック制御を行なうのか

セキュリティグループはデフォルトでインバンドを全拒否、アウトバウンドを全許可になっています。
publicなサブネットにあるEC2インスタンスであってもインバンドの設定で明示的に許可しないと、SSHなどでログインすることはできません。
APサーバとDB間の通信も同様です。

参考:VPC のセキュリティグループ
参考:AWSセキュリティベストプラクティスを実践するに当たって適度に抜粋しながら解説・補足した内容を共有します
参考:セキュリティグループのルールのリファレンス

ハンズオン手順概要

  • EC2インスタンスの作成
  • EC2のセキュリティグループの設定
  • TeratermからSSHでログインしてみる
  • EC2のサーバにサンプルJavaアプリケーションをデプロイして起動
  • ELB用のセキュリティグループの作成
  • EC2用のセキュリティグループにELBからのリクエストの許可設定を追加
  • ELB(ALB)の作成
  • ブラウザからアクセスしてみる

Amazon Linux 2 における Amazon Corretto 11 のインストール手順
サンプルJavaアプリケーション
Spring BootアプリケーションをLinuxのサービスとして登録する方法

セッションについて

セッションを各APサーバのアプリケーションのヒープメモリ内に持つ(※)場合、ALBにStickySessionの設定を行います。
これにより任意のCookie("JSESSIONID"など)の値が同じHTTPリクエストを、同じサーバに振り分けるように設定できます。

しかしこれだと耐障害性や負荷分散の観点でイマイチなので、より改善されたアーキテクチャとしてセッションをAPサーバのメモリに持たずにElasticach(のRedis or memcache)に持たせるやり方もあります。
SpringFrameworkを使う場合はSpringSessionという機能(ライブラリ)を使うと割と簡単に実現できます。

お掃除タイム

EC2の料金
EBSの料金
ELBの料金
RDSの料金
EIP(ElasticIPAddresses)の料金
無料枠

※ EIPは"稼働している"EC2インスタンスに対してアタッチしている限り1つ無料。つまりEC2インスタンスを落とすと課金対象になる、というわかりにくい落とし穴がある。
無料枠で使っているはずなのになぜか微妙に課金が発生しているんだが???という人でおそらくもっとも多いと思われるケース