本連載の第1回~第3回では、「AWS Lambda」と「API Gateway」を使ったサーバレス環境下でSpringアプリケーションを構築する方法を解説しました。今回からは、AWS ECS上でSpringアプリケーションを構築する方法を説明していきます。

なお、解説にあたっては以下の前提知識がある開発者を想定しています。

  
対象読者 前提知識
エンタープライズ開発者 Java言語及びSpringFrameworkを使った開発に従事したことがある経験者。経験がなければ、こちらのチュートリアルを実施することを推奨します。TERASOLUNAはSpringのベストプラクティスをまとめた開発方法論で、このチュートリアルでは、JavaやSpring Frameworkを使った開発に必要な最低限の知識を得ることができます
GitHubなどのバージョン管理ツールやApache Mavenなどのライブラリ管理ツールを使った開発に従事したことがある経験者
AWS開発経験者 AWSアカウントを持ち、コンソール上で各サービスを実行したことがある経験者
コンテナ及びUnix/Linux経験者 Dockerなどのコンテナ技術を使用した経験がある、またはPOSIXコマンドによるUNIX、LINUX系OSを操作したことがある経験者

また、動作環境は以下のバージョンで実施しています。

動作対象 バージョン
Java 1.8
Spring Boot 2.1.2.RELEASE
Docker 18.09.2, build 6247962
CentOS 7.6.1810

AWS ECSの概要とアプリケーション環境構成

「Amazon Elastic Container Service(Amazon ECS)」は、クラスタ単位でDockerコンテナを簡単にスケーラブルかつ高速に実行/停止/管理できるコンテナ管理サービスです。

Linuxサーバ環境でDockerコンテナを単純に運用する場合と比較して、ECSではリージョン内の複数のアベイラビリティゾーンをまたいでコンテナを実行できるため、可用性の高い運用が可能です。2019年1月時点では、1つまたは複数のEC2上にクラスタを構築し、その上に任意のレジストリにあるDockerイメージをデプロイする「EC2起動型」と、実行するクラスタ自体をマネージドとしてAWSが自動で管理し、コンテナだけを意識する「Fargate」に分類できます。

本稿では理解を深めるために、EC2クラスタ型でECSアプリケーションを構築するものとし、以下のようなイメージでECSアプリケーションを構築する形式とします。

ECSアプリケーションの構築イメージ

作業はネットワーク環境の構築からアプリケーションの実装、コンテナイメージの作成、クラスタの実行など広範囲に及ぶので、以下の7つのステップに分けて解説を進めていきます。

  1. VPC(Virtual Private Cloud)環境の構築
  2. アプリケーションロードバランサ(ALB)の作成
  3. Springを使用したコンテナアプリケーションの実装方法
  4. Dockerコンテナの作成・DockerHubへのプッシュ
  5. ECSクラスタの作成
  6. ECSタスクの定義
  7. ECSサービスの実行


このうち、最初のステップでは、ALBやECSクラスタを配置するための、VPCおよびサブネットを構築します。

具体的には、構築するVPC環境において、サブネットはパブリックとプライベートに分割し、可用性を考慮して、複数のアベイラビリティゾーンでECSコンテナが配置されるよう設定します。サブネットをパブリックとプライベートに分割するのは、AWSではよく行われる構成で、次のような用途で構築されます。

  • パブリックサブネットはインターネットからのアクセスを受け付け、プライベートサブネットはVPC内からの接続のみ許可するようアクセス制御するため
  • プライベートサブネットでは、DBへの接続や、オンプレミスとのVPNアクセスするサーバを配置し、セキュリティを向上させるため

ただし、ブラウザからのリクエストがメインのWebアプリケーションやモバイルアプリケーションなど、クライアントが多様化している昨今、ECSでアプリケーションを構成する場合は、次のような用途で、各サブネットに役割を分けてECSコンテナを配置するユースケースが発生します。

  • パブリックサブネットにはBackend For Frontend(以下、BFF)として、Webアプリケーション向けのHTMLを生成するサーバなどを配置する
  • プライベートサブネットのECSコンテナにAPIサーバを配置し、データベース接続などを行う

本連載では、こうしたユースケースを前提とした構成で、ECSアプリケーションを構築していきます。

なお、モバイル向けなど、シングルページアーキテクチャ(SPA)でアプリケーションを構成する場合、パブリックサブネットにはBFFアプリケーションの代わりに、「Amazon API Gateway」や「AWS AppSync」、「Kong」などのAPI Aggregationミドルウェアを設定する場合もあります。2019年1月時点では、第3回で解説した「Amazon API Gateway」のバックエンドにプライベートサブネット用のALBを介してECSコンテナを配置する構成はサポートされていないので、そうした構成をとりたい場合は、BFFサーバかKongなどのミドルウェアで代替しましょう。

1. VPC(Virtual Private Cloud)環境の構築

パブリックサブネットとプライベートサブネットを持つVPCは、AWSコンソールのVPCダッシュボードにある「VPCを作成」ウィザードから作成できます。作業の流れは次の通りです。

  • VPCの作成
  • パブリックサブネットとプライベートサブネットの作成
  • カスタムルートテーブルの作成/メインルートテーブルの設定
  • インターネットゲートウェイの作成/VPCへのアタッチ
  • NATゲートウェイの設定/アタッチ

ただし、パブリック/プライベートサブネットは1つずつしか作成されないので、ウィザードでの作業完了後に別のアベイラビリティゾーンに配置するサブネットを各々作成して設定する必要があります。

なお、ウィザードを実行する前に事前にNATゲートウェイへアタッチするための「Elastic IPアドレス」を取得しておく必要があるので、「VPC」サービスから「ElasticIP」メニューを選択し、「新しいアドレスの割り当て」ボタンから、IPアドレスを払い出しておきましょう。

「新しいアドレスの割り当て」画面

では、VPCを作成しましょう。「VPC」サービスから、「VPCダッシュボード」メニューを選択し、「VPCの作成」ボタンを押下します。「パブリックとプライベートサブネットを持つVPC」を選択して、「選択」ボタンを押下してください。

「VPC設定の選択」画面

後は、以下の表を参考に、VPCとサブネットのネットワーク構成、NATゲートウェイに設定するIPアドレスを入力してください。

入力項目 説明
IPv4 CIDRブロック VPCに設定するネットワークIPアドレス体系を指定します。XXX.XXX.XXX.XXX/YY形式で、YYのCIDRは16~28の範囲で設定します。最大16桁では65531、28桁では16のIPを割り振ることができます
IPv6 CIDRブロック ネットワークアドレスにIPv6を指定する場合にチェックします。ここでは、「なし」を選択してください
VPC名 VPCに設定する任意の名前を設定します
パブリックサブネットのIPv4 CIDRブロック パブリックサブネットに設定するネットワークIPアドレス体系を指定します。形式はVPCと同様ですが、サブネットに割り当てるネットワークアドレス領域はVPCよりも小さく設定する必要があります
アベイラビリティゾーン パブリックサブネットのアベイラビリティゾーンを指定します
パブリックサブネット名 パブリックサブネットに設定する任意の名前を設定します
プライベートサブネットのIPv4 CIDRブロック プライベートサブネットに設定するネットワークIPアドレス体系を指定します。設定はパブリックサブネットと同様ですが、他のサブネットとネットワークアドレスが異なるように設定する必要があります
アベイラビリティゾーン プライベートサブネットのアベイラビリティゾーンを指定します
プライベートサブネット名 プライベートサブネットに設定する任意の名前を設定します
Elastic IP 割り当てID NATゲートウェイに割り当てるElasticIPアドレスIDを指定します。事前にElasitcIPアドレスを取得していれば、カーソルを合わせると自動的にIDが入力候補でサジェストされるので、そのまま入力してください
サービスエンドポイントの追加 サービスエンドポイントはインターネットに経由せず別のサービスにアクセスできる機能です。ここでは特に指定しません
DNSホスト名を有効化 VPC内で実行するEC2インスタンスなどにDNS名を割り当てるか否かの設定です。ここでは、有効化するにチェックを入れておいてください
ハードウェアのテナンシー ハードを共有するDedicatedなどのオプションを選択できます。ここでは、共有型のデフォルトを設定します

「パブリックとプライベートサブネットを持つVPC」画面

入力して「VPCの作成」ボタンを押下すると、「VPC」が作成されます。

続いて、追加で、別のアベイラビリティゾーンに設定するサブネットを作成します。「サブネット」メニューから「サブネットの作成ボタン」を押下し、以下の項目を入力して、パブリック/プライベート各々サブネットを作成して下さい。

  • 名前タグ:サブネットの名前を設定します。
  • VPC:サブネットを作成するVPCを設定します。ここでは上記で作成したVPCを指定してください。
  • アベイラビリティゾーン:上記で作成したサブネットとは異なるサブネットを指定してください。
  • IPv4 CIDRブロック:サブネットのネットワークIP体系を設定します。ほかのサブネットとネットワークアドレスが異なるように設定してください。

「サブネットの作成」画面

作成した2つのサブネットは、(NATゲートウェイのルーティングが有効になっているプライベートサブネット向けの)デフォルトのメインルートテーブルにしか関連付けられていないため、パブリックサブネットを(インターネットゲートウェイのルーティングが設定されている)カスタムルートテーブルに関連付ける必要があります。

パブリックサブネットをカスタムルートテーブルに関連付ける

なお、サブネットは明示的にどれか1つのルートテーブルにも関連付けないと、デフォルトのメインルートテーブルに暗黙的に関連付けられるようになっています。ウィザードで作成したメインルートテーブルは、プライベートサブネット用のNATゲートウェイのルーティングが設定されています。

では、「ルートテーブル」メニューから、作成したVPCのカスタムルートテーブルを選択し、「Subnet Associations」タブにある、「Edit subnet associations」ボタンから新たに作成したパブリックサブネットを関連付けましょう。

「Edit subnet associations」で作成したパブリックサブネットを関連付ける

これで、VPCおよびサブネットが構築できました。次回は、ECSコンテナに負荷分散するアプリケーションロードバランサーを作成します。

著者紹介


川畑 光平(KAWABATA Kohei)

某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professionalなどの資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。

本連載の内容に対するご意見・ご質問は Facebook まで。