クラウド時代が到来し、ますます広がりを見せつつあるコンテナ技術。第2回はAWS ECS上でSpringアプリケーションを構築する方法を説明します。 本稿は以下の前提知識がある開発者を想定しています。
対象読者 | 前提知識 |
エンタープライズ開発者 | Java言語及びSpringFrameworkを使った開発に従事したことがある経験者。経験がなければ、 こちらのチュートリアル を実施することを推奨します。TERASOLUNAはSpringのベストプラクティスをまとめた開発方法論で、このチュートリアルでは、JavaやSpring Frameworkを使った開発に必要な最低限の知識を得ることができます。 |
GitHubなどのバージョン管理ツールやApache Mavenなどのライブラリ管理ツールを使った開発に従事したことがある経験者。 | |
AWS開発経験者 | AWSアカウントをもち、コンソール上で各サービスを実行したことがある経験者 |
コンテナ及びUnix・Linux経験者 | Dockerなどのコンテナ技術を使用した経験がある、またはPOSIXコマンドによるUNIX、LINUX系OSを操作したことがある経験者。 |
また、動作環境は以下のバージョンで実施しています、将来的には、AWSコンソール上の画面イメージや操作、バージョンアップによりJavaのソースコード内で使用するクラスが異なる可能性があります。
動作対象 | バージョン |
Java | 1.8 |
Spring Boot | 2.1.2.RELEASE |
Docker | 1.8 |
CentOS | 7.1 |
Amazon Elastic Container Service (Amazon ECS) は、クラスター単位でDockerコンテナを簡単にスケーラブルかつ高速に実行、停止、管理できるコンテナ管理サービスです。 Linuxサーバ環境でDockerコンテナを単純に運用する場合と比較して、ECSではリージョン内の複数のアベイラビリティーゾーンを跨いでコンテナを実行できるため、可用性の高い運用が可能であり、 2019年1月現在時点では、ひとつまたは複数のEC2上にクラスタを構築し、その上に任意のレジストリにあるDockerイメージをデプロイするEC2起動型と、 実行するクラスタ自体をマネージドとしてAWSが自動で管理し、コンテナだけを意識するFargateに分類できます。本稿では理解を深めるために、EC2クラスタ型でECSアプリケーションを構築するものとし、 以下のようなイメージでECSアプリケーションを構築する形式とします。
ネットワーク環境の構築からアプリケーションの実装、コンテナイメージの作成、クラスタの実行など広範囲に及びますので、第二回は以降、
という、7つのステップに分け、解説を進めていきます。最初のステップでは、ALBやECSクラスタを配置するための、VPCおよびサブネットを構築します。
構築するVPC環境において、サブネットはパブリックとプライベートに分割し、可用性を考慮して、複数のアベイラビリティゾーンでECSコンテナが配置されるよう設定します。 サブネットをパブリックとプライベートに分割するのは、AWSではよく行われる構成で、
などの用途により構築されるものですが、ブラウザからのリクエストがメインのWebアプリケーションやモバイルアプリケーション等、クライアントが多様化している昨今、ECSでアプリケーションを構成する場合は、
といった用途で、各サブネットに役割を分けてECSコンテナを配置するユースケースが発生します。本稿ではこうしたユースケースを前提とした構成で、ECSアプリケーションを構築しましょう。
注釈
モバイル向けなど、シングルページアーキテクチャ(SPA)でアプリケーション構成する場合、パブリックサブネットにはBFFアプリケーションの代わりに、API GatewayやKongなどのAPI Aggregationミドルウェアを設定する場合もあります。 2019年1月現在では、第一回で解説したAmazon API GatewayのバックエンドにALBを介してECSコンテナを配置する構成はサポートされていないので、こうした構成をとりたい場合は、BFFサーバかKongなどのミドルウェアで代替しましょう。
パブリックサブネットとプライベートサブネットをもつVPCは、AWSコンソールのVPCダッシュボードにある「VPCを作成」ウィザードから作成できます。ウィザードでは
を設定してくれますが、パブリック・プライベートサブネットが1つずつしか作成されないので、ウィザード完了後に別のアベイラビリティゾーンに配置するサブネットを各々作成して設定します。 なお、ウィザードを実行する前に事前にNATゲートウェイへアタッチするためのElastic IPアドレスを取得しておく必要があるので、 「VPC」サービスから「ElasticIP」メニューを選択し、「新しいアドレスの割り当て」ボタンから、IPアドレスを払い出しておきましょう。
「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」が作成されます。続いて、追加で、別のアベイラビリティゾーンに設定するサブネットを作成します。 「サブネット」メニューから「サブネットの作成ボタン」を押下し、以下の項目を入力して、パブリック・プライベート各々サブネットを作成して下さい。
作成した2つのサブネットは、(NATゲートウェイのルーティングが有効になっているプライベートサブネット向けの)デフォルトのメインルートテーブルにしか関連づけられていないため、 パブリックサブネットを(インターネットゲートウェイのルーティングが設定されている)カスタムルートテーブルに関連づける必要があります。
注釈
正確にはサブネットは明示的にどれか一つのルートテーブルにも関連づけないと、デフォルトのメインルートテーブルに暗黙的に関連づけられるようになっています。 ウィザードで作成したメインルートテーブルはプライベートサブネット用のNATゲートウェイのルーティングが設定されています。
「ルートテーブル」メニューから、作成したVPCのカスタムルートテーブルを選択し、「Subnet Associations」タブにある、「Edit subnet associations」ボタンから 新たに作成したパブリックサブネットを関連づけます。
これで、VPCおよびサブネットが構築できました。次回はECSコンテナに負荷分散するアプリケーションロードバランサーを作成します。