.. include:: ../module.txt .. _section-cloud-native-ecs-1st-label: 【第4回】ECSコンテナAP開発(1)VPC構築 ---------------------------------------------------------------------------------------- |br| クラウド時代が到来し、ますます広がりを見せつつあるコンテナ技術。第2回はAWS ECS上でSpringアプリケーションを構築する方法を説明します。 本稿は以下の前提知識がある開発者を想定しています。 |br| .. list-table:: :widths: 3, 7 * - 対象読者 - 前提知識 * - エンタープライズ開発者 - Java言語及びSpringFrameworkを使った開発に従事したことがある経験者。経験がなければ、|br| `こちらのチュートリアル `_ を実施することを推奨します。TERASOLUNAはSpringのベストプラクティスをまとめた開発方法論で、このチュートリアルでは、JavaやSpring Frameworkを使った開発に必要な最低限の知識を得ることができます。 * - - GitHubなどのバージョン管理ツールやApache Mavenなどのライブラリ管理ツールを使った開発に従事したことがある経験者。 * - AWS開発経験者 - AWSアカウントをもち、コンソール上で各サービスを実行したことがある経験者 * - コンテナ及びUnix・Linux経験者 - Dockerなどのコンテナ技術を使用した経験がある、またはPOSIXコマンドによるUNIX、LINUX系OSを操作したことがある経験者。 |br| また、動作環境は以下のバージョンで実施しています、将来的には、AWSコンソール上の画面イメージや操作、バージョンアップによりJavaのソースコード内で使用するクラスが異なる可能性があります。 |br| .. list-table:: :widths: 5, 5 * - 動作対象 - バージョン * - Java - 1.8 * - Spring Boot - 2.1.2.RELEASE * - Docker - 1.8 * - CentOS - 7.1 |br| .. _section-cloud-native-ecs-overview-label: AWS ECSの概要とアプリケーション環境構成 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |br| Amazon Elastic Container Service (Amazon ECS) は、クラスター単位でDockerコンテナを簡単にスケーラブルかつ高速に実行、停止、管理できるコンテナ管理サービスです。 Linuxサーバ環境でDockerコンテナを単純に運用する場合と比較して、ECSではリージョン内の複数のアベイラビリティーゾーンを跨いでコンテナを実行できるため、可用性の高い運用が可能であり、 2019年1月現在時点では、ひとつまたは複数のEC2上にクラスタを構築し、その上に任意のレジストリにあるDockerイメージをデプロイするEC2起動型と、 実行するクラスタ自体をマネージドとしてAWSが自動で管理し、コンテナだけを意識するFargateに分類できます。本稿では理解を深めるために、EC2クラスタ型でECSアプリケーションを構築するものとし、 以下のようなイメージでECSアプリケーションを構築する形式とします。 .. figure:: img/aws-ecs/ecs-architecture.png ネットワーク環境の構築からアプリケーションの実装、コンテナイメージの作成、クラスタの実行など広範囲に及びますので、第二回は以降、 #. VPC(Virtual Private Cloud)環境の構築 #. アプリケーションロードバランサ(ALB)の作成 #. Springを使用したコンテナアプリケーションの実装方法 #. Dockerコンテナの作成・DockerHubへのプッシュ #. ECSクラスタの作成 #. ECSタスクの定義 #. ECSサービスの実行 という、7つのステップに分け、解説を進めていきます。最初のステップでは、ALBやECSクラスタを配置するための、VPCおよびサブネットを構築します。 構築するVPC環境において、サブネットはパブリックとプライベートに分割し、可用性を考慮して、複数のアベイラビリティゾーンでECSコンテナが配置されるよう設定します。 サブネットをパブリックとプライベートに分割するのは、AWSではよく行われる構成で、 * パブリックサブネットはインターネットからのアクセスを受け付け、プライベートサブネットはVPC内からの接続のみ許可するようアクセス制御。 * プライベートサブネットでは、DBへの接続や、オンプレミスとのVPNアクセスするサーバを配置し、セキュリティを向上。 などの用途により構築されるものですが、ブラウザからのリクエストがメインのWebアプリケーションやモバイルアプリケーション等、クライアントが多様化している昨今、ECSでアプリケーションを構成する場合は、 * パブリックサブネットにはBackend For Frontend(以下BFF)として、Webアプリケーション向けのHTMLを生成するサーバなどを配置する。 * プライベートサブネットのECSコンテナにAPIサーバを配置し、データベース接続などを行う。 といった用途で、各サブネットに役割を分けてECSコンテナを配置するユースケースが発生します。本稿ではこうしたユースケースを前提とした構成で、ECSアプリケーションを構築しましょう。 .. note:: モバイル向けなど、シングルページアーキテクチャ(SPA)でアプリケーション構成する場合、パブリックサブネットにはBFFアプリケーションの代わりに、API GatewayやKongなどのAPI Aggregationミドルウェアを設定する場合もあります。 2019年1月現在では、第一回で解説したAmazon API GatewayのバックエンドにALBを介してECSコンテナを配置する構成はサポートされていないので、こうした構成をとりたい場合は、BFFサーバかKongなどのミドルウェアで代替しましょう。 |br| .. _section-cloud-native-ecs-create-vpc-label: (1)VPC(Virtual Private Cloud)環境の構築 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |br| パブリックサブネットとプライベートサブネットをもつVPCは、AWSコンソールのVPCダッシュボードにある「VPCを作成」ウィザードから作成できます。ウィザードでは * VPCの作成 * パブリックサブネットとプライベートサブネットの作成 * カスタムルートテーブルの作成・メインルートテーブルの設定 * インターネットゲートウェイの作成・VPCへのアタッチ * NATゲートウェイの設定・アタッチ を設定してくれますが、パブリック・プライベートサブネットが1つずつしか作成されないので、ウィザード完了後に別のアベイラビリティゾーンに配置するサブネットを各々作成して設定します。 なお、ウィザードを実行する前に事前にNATゲートウェイへアタッチするためのElastic IPアドレスを取得しておく必要があるので、 「VPC」サービスから「ElasticIP」メニューを選択し、「新しいアドレスの割り当て」ボタンから、IPアドレスを払い出しておきましょう。 |br| .. figure:: img/aws-ecs/management-console-vpc-elastic-ipaddress-1.png |br| 「VPC」サービスから、「VPCダッシュボード」メニューを選択し、「VPCの作成」ボタンを押下します。「パブリックとプライベートサブネットをもつVPC」を選択して、「選択」ボタンを押下してください。 |br| .. figure:: img/aws-ecs/management-console-vpc-create-vpc-1.png |br| 以下の要領に従って、VPC、サブネットのネットワーク構成や、NATゲートウェイに設定するIPアドレスを入力してください。 .. list-table:: パブリックとプライベートサブネットをもつVPCの入力項目 :widths: 3, 7 * - 入力項目 - 説明 * - IPv4 CIDRブロック - VPCに設定するネットワークIPアドレス体系を指定します。XXX.XXX.XXX.XXX/YY形式で、|br| YYのCIDRは16〜28の範囲で設定します。最大16桁では65531、28桁では16のIPを割り振ることができます。 * - IPv6 CIDRブロック - ネットワークアドレスにIPv6を指定する場合にチェックします。ここでは、「なし」を選択してください。 * - VPC名 - VPCに設定する任意の名前を設定します。 * - パブリックサブネットのIPv4 CIDRブロック - パブリックサブネットに設定するネットワークIPアドレス体系を指定します。|br| 形式はVPCと同様ですが、サブネットに割り当てるネットワークアドレス領域はVPCよりも小さく設定する必要があります。 * - アベイラビリティゾーン - パブリックサブネットのアベイラビリティゾーンを指定します。 * - パブリックサブネット名 - パブリックサブネットに設定する任意の名前を設定します。 * - プライベートサブネットのIPv4 CIDRブロック - プライベートサブネットに設定するネットワークIPアドレス体系を指定します。|br| 設定はパブリックサブネットと同様ですが、他のサブネットとネットワークアドレスが異なるように設定する必要があります。 * - アベイラビリティゾーン - プライベートサブネットのアベイラビリティゾーンを指定します。 * - プライベートサブネット名 - プライベートサブネットに設定する任意の名前を設定します。 * - Elastic IP 割り当てID - NATゲートウェイに割り当てるElasticIPアドレスIDを指定します。上述でElasitcIPアドレスを取得していると |br| カーソルを合わせれば自動的にIDが入力候補でサジェストされるので、そのまま入力してください。 * - サービスエンドポイントの追加 - サービスエンドポイントはインターネットに経由せず別のサービスにアクセスできる機能です。 |br| ここでは特に指定しません。 * - DNSホスト名を有効化 - VPC内で実行するEC2インスタンスなどにDNS名を割り当てるかの設定です。 |br| ここでは、有効化するにチェックを入れておいて下さい。 * - ハードウェアのテナンシー - ハードを共有するDedicatedなどのオプションを選択できます。 |br| ここでは、共有型のデフォルトを設定します。 |br| .. figure:: img/aws-ecs/management-console-vpc-create-vpc-2.png |br| 「VPCの作成」ボタンを押下すると、「VPC」が作成されます。続いて、追加で、別のアベイラビリティゾーンに設定するサブネットを作成します。 「サブネット」メニューから「サブネットの作成ボタン」を押下し、以下の項目を入力して、パブリック・プライベート各々サブネットを作成して下さい。 * 名前タグ:サブネットの名前を設定します。 * VPC:サブネットを作成するVPCを設定します。ここでは上記で作成したVPCを指定してください。 * アベイラビリティゾーン:上記で作成したサブネットとは異なるサブネットを指定してください。 * IPv4 CIDRブロック:サブネットのネットワークIP体系を設定します。他のサブネットとネットワークアドレスが異なるように設定してください。 |br| .. figure:: img/aws-ecs/management-console-vpc-create-subnet-1.png |br| 作成した2つのサブネットは、(NATゲートウェイのルーティングが有効になっているプライベートサブネット向けの)デフォルトのメインルートテーブルにしか関連づけられていないため、 パブリックサブネットを(インターネットゲートウェイのルーティングが設定されている)カスタムルートテーブルに関連づける必要があります。 .. figure:: img/aws-ecs/management-console-vpc-edit-routetable-1.png .. note:: 正確にはサブネットは明示的にどれか一つのルートテーブルにも関連づけないと、デフォルトのメインルートテーブルに暗黙的に関連づけられるようになっています。 ウィザードで作成したメインルートテーブルはプライベートサブネット用のNATゲートウェイのルーティングが設定されています。 |br| 「ルートテーブル」メニューから、作成したVPCのカスタムルートテーブルを選択し、「Subnet Associations」タブにある、「Edit subnet associations」ボタンから 新たに作成したパブリックサブネットを関連づけます。 .. figure:: img/aws-ecs/management-console-vpc-edit-routetable-2.png |br| これで、VPCおよびサブネットが構築できました。次回はECSコンテナに負荷分散するアプリケーションロードバランサーを作成します。 |br| 著者紹介 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 川畑 光平(KAWABATA Kohei) .. figure:: img/aws-lambda-and-api-gateway/pic_image01.jpg 某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。 Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。 本連載記事の内容に対するご意見・ご質問は `Facebook `_ まで。