AWSは最近、サーバやクラスタを管理せずにコンテナを実行するサービス、[AWS Fargate](https://aws.amazon.com/fargate/)を発表しました。あなたが過去数年間冬眠していたわけでないのなら、[Docker](http://docker.com/)が開発者の作業方法や一部の運用サーバの動作方法を変更したことにお気付きでしょう。

しかし、実際には状況は非常に複雑であり、コンテナのみを実行しても、基本インフラストラクチャを管理する必要があります。そして、あなたは既に、これが些細なタスクではないことを知っているはずです!

AWS Fargateは最高の結果をもたらす領域を見つけ、初期のクラウド導入時代のEC2のインスタンス内容をDockerワールドまで向上させることを目指します。必要なのはDockerイメージだけで、メモリ、CPUを構成し、ネットワークとIAMポリシーを定義し、Fargateがコンテナを実行します。これらはすべて、リソースベースの価格設定と秒単位の請求で提供されます。しかし、「言うは易し行うは難し」です。!

###前提条件

私はコンテナを実行することに焦点を合わせるつもりですが、Fargateは、[Amazon Virtual Private Cloud](https://aws.amazon.com/vpc/)および[Access Management(IAM)](https://aws.amazon.com/iam/)とネイティブに統合されていて、既存のVPCがない場合や、デフォルトのVPCを実行したくない場合は、独自のVPCを設定する必要があります。また、AWS APIの呼び出しを行うための権限を提供する適切なIAMロールでコンテナを実行する必要があります。

###HelloWorldテスト:単一のNuxeoコンテナの実行

たとえば、デモ用に高速Nuxeoインスタンスを起動する必要がある場合は、次の手順に従ってください。

AWSコンソールで、ECSページにナビゲートします。

####1.新しいFargateクラスタを作成する
(皮肉なことに、この最初のステップは、独自のFargateのモットーである「サーバやクラスタを管理することなくコンテナを実行する」とは少し矛盾しています。)

  • クラスタテンプレートを選択し、powered by Fargateを選択します。
  • クラスタ名を定義し、VPCがない場合は、このクラスタの新しいVPCを作成します

![新しいFargateクラスタ1の作成](/assets/imgs/blog/nuxeo-aws-fargate-1 ?make_link=true)

####2.新しいタスク定義を作成する

  • 起動タイプとしてFargateを選択します。
  • 適切な実行ロールを選択します。私は基本的なもの: [ecsTaskExecutionRole]を使用します。(http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)
  • ネットワークモードに「awsvpc」を選択します。この定義から作成されたすべてのタスクで、弾力性のあるネットワークインタフェース、プライマリプライベートIPアドレス、および内部DNSホスト名を取得します
  • タスクサイズの設定:タスクメモリ(GB)とタスクCPU(これは秒単位の支払いになります)

![新しいFargateクラスタ2の作成](/assets/imgs/blog/nuxeo-aws-fargate-2 ?make_link=true)

  • 新しいコンテナ定義を作成する

![新しいFargateクラスタ3の作成](/assets/imgs/blog/nuxeo-aws-fargate-3 ?make_link=true)

これは最小限の設定です。より高度な設定を行うには、[Advanced Task Definition Parameters(詳細タスク定義パラメータ)]をチェックします(https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html)。

コンテナのデータ量を定義するには、Add volume(ボリュームの追加)を選択します。すでにEBSボリュームを作成しましたが、一例として、このボリュームを使用するためにバイナリストアを外部化します。

![新しいFargateクラスタ4の作成](/assets/imgs/blog/nuxeo-aws-fargate-4 ?make_link=true)

これで、コンテナの定義に戻り、このボリュームを使用するためにNuxeoを設定する必要があります。

  • コンテナ定義を編集し、詳細コンテナ設定セクションでNUXEOの_BINARY_STORE環境変数を追加します。

![新しいFargateクラスタ5の作成](/assets/imgs/blog/nuxeo-aws-fargate-5 ?make_link=true)

  • Storage and Loggingで、以前定義したボリュームのマウントポイントを設定します。

![新しいFargateクラスタ6の作成](/assets/imgs/blog/nuxeo-aws-fargate-6 ?make_link=true)

  • Create(作成)をクリックすると、タスク定義ページにタスク定義が表示されます。

![新しいFargateクラスタ7の作成](/assets/imgs/blog/nuxeo-aws-fargate-7 ?make_link=true)

####3.新しいタスクを実行して、タスク定義からコンテナをインスタンス化するか、サービスを作成する

スタンドアロンの単一のコンテナを実行する最も簡単な方法は、HelloWorld task(ハローワールドタスク)を選択することです。アクションメニューからRunTask(タスクの実行)を選択します。

手順1で作成したクラスタを選択し、VPCとセキュリティグループを構成してください。また、インスタンスに素早くアクセスするには、「Auto-assign public IP(パブリックIPの自動割り当て)」を必ず選択してください。

![新しいFargateクラスタ8の作成](/assets/imgs/blog/nuxeo-aws-fargate-8 ?make_link=true)

RunTask(タスクの実行)をクリックすると、cluster/tasks(クラスタ/タスク)タブに戻り、provisioning, pending(プロビジョニング、保留中)、最後にrunning(実行中)ステータスで、タスクを確認できます。リスト内のタスクIDをクリックすると、実行中のタスクの詳細が表示され、ログにアクセスできます。

タスク定義から作成された実行中のタスクを必要な数だけ開始して維持するサービスを作成するオプションもあります。これにより、負荷分散と自動スケーリングを構成したり、タスク定義が変更されたときにローリングアップグレードを実行することができます。

![新しいFargateクラスタ9の作成](/assets/imgs/blog/nuxeo-aws-fargate-9 ?make_link=true)

###Nuxeoインスタンスにアクセスするにはどうしたらいいですか?

タスク定義で設定された「awsvpc」ネットワークモードは、ECSタスクにAmazon EC2インスタンスと同じネットワーキングプロパティを与えます。タスクを実行する際にAuto Assign Public IP:ENABLED(パブリックIPの自動割り当て:有効化)を選択した場合、EINにパブリックIPがすでに添付されています。タスクに表示されないので、ちょっと難しいですが、タスクの説明ページからEINにナビゲートする必要があります。

![新しいFargateクラスタ10の作成](/assets/imgs/blog/nuxeo-aws-fargate-10 ?make_link=true)

パブリックIPを使用しているので、実行中のNuxeoインスタンスにアクセスできるはずですが、次のようになります。

curl http://54.175.225.0:8080/nuxeo/runningstatus

returns:

curl:(7) Failed to connect to 54.175.225.0 port 8080:Operation timed out.

問題は、EINに接続されているセキュリティグループにデフォルトでポート8080のルールが含まれていないことです。手動で追加する必要があります:

![新しいFargateクラスタ11の作成](/assets/imgs/blog/nuxeo-aws-fargate-11 ?make_link=true)

その後、基本的なヘルスチェックは次のようになります。
curl http://54.175.225.0:8080/nuxeo/runningstatus
{"runtimeStatus":"ok","elasticSearchStatus":"ok","ldapDirectories":"ok","repositoryStatus":"ok"}

Nuxeoのインスタンスにアクセスできます。

![新しいFargateクラスタ12の作成](/assets/imgs/blog/nuxeo-aws-fargate-12 ?make_link=true)

###新しいマーケットプレイスパッケージをインストールする場合、どうすればインスタンスを更新できますか?

この時点で、裸のNuxeoインスタンスを実行しています。便利な[Nuxeo WebUI](https://connect.nuxeo.com/nuxeo/site/marketplace/package/nuxeo-web-ui)も展開すればいいでしょう。

新しいマーケットプレースパッケージを追加するには、タスク定義の新しいリビジョンを作成し、既存のリビジョンを置き換える新しいタスクを実行する必要があります。

  • タスク定義へ移動、HelloWorldタスクを選択し、新しいタスクリビジョンを作成します。
  • コンテナ定義を更新し、NUXEO_PACKAGES環境変数を渡します

![新しいFargateクラスタ13の作成](/assets/imgs/blog/nuxeo-aws-fargate-13 ?make_link=true)

スタンドアロンタスクを実行する場合は、唯一の選択肢として、実行中のタスクを停止し、更新済みリビジョンから新しいタスクを起動します。

[service(サービス)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html)内からタスクを実行している場合、サービスを更新して、[サービスが設定された]方法(https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service.html)に応じてローリングアップグレードを実行します。

新しいタスクを停止して開始した後、Nuxeoが起動して再び実行します:

![新しいFargateクラスタ14の作成](/assets/imgs/blog/nuxeo-aws-fargate-14 ?make_link=true)

###まとめ

この時点で、Fargateはクラスタの管理に苦労しますが、ECS構成の複雑さは依然として伴いますので、手間がかかります。