AWS
docker
Fargate

AWS Fargateを使用してNginxを起動した(ENI使用)

AWS Fargateとは

AWS re:Invent2017でAWSが発表したコンテナホスト(インスタンス)を意識せずにコンテナを管理できるオーケストレーションサービスです。
現時点ではバージニア(us-east-1)リージョンのみでGAとなっています。
ちなみに、re:Inventに参加したので、現地でキーノートを聞いていましたが、同時にEKSも発表され待望のサービスが来た!という感じで私も会場もめちゃくちゃ興奮してました。

やってみる

クラスタの作成

リージョンはバージニアを選択し、Elastic Container Serviceの画面を開きます。
クラスターの作成ボタンを押してクラスタの作成を始めます。
(私の環境は元々別のクラスタが作成してあったので初めての場合表示が違うかもしれません)
console_aws_amazon_com_ecs_home_region_us-east-1.png

クラスタテンプレートの選択

以下の3つのクラスタテンプレートが選択できます。

  • Network only
  • EC2 Linux + Networking
  • EC2 Windows + Networking

Network onlyがFargateのようなので、こちらを選択して次のステップへ進みます。
console_aws_amazon_com_ecs_home_region_us-east-1__1_.png

クラスタの設定

ここではクラスタ名とネットワークの設定をします。
クラスタ名はFargateTestにしてみました。
また、このクラスタ用にVPCも合わせて作ってくれるオプションがあったので選択しました。
値はデフォルトのままで作成
console_aws_amazon_com_ecs_home_region_us-east-1__2_.png

起動ステータスの確認

作成が始まるとCloudFormationスタックが走ります。
しばらくするとイイ感じにクラスタができあがります。
console_aws_amazon_com_ecs_home_region_us-east-1__3_.png

クラスタの状態を確認

当然ですが実行中のタスクもサービスもありません。
console_aws_amazon_com_ecs_home_region_us-east-1__4_.png

タスク定義作成

新しくNginxを起動するタスクを定義します。
(私の環境は元々別のタスクが登録してあったので初めての場合表示が違うかもしれません)
console_aws_amazon_com_ecs_home_region_us-east-1__5_.png

ローンチタイプの選択

FARGATEEC2が選択できるので、当然FARGATEを選んで次のステップに進みます。
console_aws_amazon_com_ecs_home_region_us-east-1__6_.png

タスク定義の設定

適当にタスク定義に名前をつけます。ここではTestNginxとしました。
タスクのサイズ指定でメモリとvCPUを選択できます。
メモリは0.5GBと1GB~30GBまで1GB刻みで調整できるようです。
CPUは0.25、0.5、1、2、4から選択します。
ここではどちらも最小値の0.5GB、0.25vCPUを選択しました。
続いてコンテナの追加を行います。
console_aws_amazon_com_ecs_home_region_us-east-1__7_.png

コンテナの追加

コンテナ名を適当に定義します。ここではTestNginxにしました。
また、使用するコンテナイメージを指定します。DockerHubで公開されているNginxイメージをそのまま指定しました。
Nginxコンテナはポート80でListenするのでポートマッピングの設定は80となります。
その他は特に変更せずに追加し、そのまま作成します。
console_aws_amazon_com_ecs_home_region_us-east-1__8_.png

ローンチステータスの確認

ECSタスクと必要なIAM Roleが定義されたようです。
console_aws_amazon_com_ecs_home_region_us-east-1__9_.png

サービスの作成

クラスタの一覧から今回作成したFargateTestを選択します。
console_aws_amazon_com_ecs_home_region_us-east-1__11_.png

サービスの作成

サービスタブ内から作成します。
console_aws_amazon_com_ecs_home_region_us-east-1__12_.png

サービスの設定

Launch Typeは当然FARGATEを選択します。
また、タスク定義は先程作成したTestNginxを指定します。
サービス名には適当な名前をつけます。ここではTestNginxとしました。
console_aws_amazon_com_ecs_home_region_us-east-1__13_.png

ネットワーク構成の設定

参加するVPCを指定します。たぶん最初に作ったVPC IDが指定されていると思います。
コンテナが起動するサブネットを追加します。AZごとに別れていると思います。
また、セキュリティグループを編集することで既存のセキュリティグループを指定したり新規作成の内容を微調整できるようです。デフォルトのままだとポート80をAnyで公開します。
今回はELBを使用せずに直接コンテナに接続してみたいのでELBタイプはなしを選択しました。
このまま次のステップに進みます。
console_aws_amazon_com_ecs_home_region_us-east-1__14_.png

オートスケールの設定

オートスケールの設定ができますが、今回は実施しないのでそのまま次のステップに進みます。
console_aws_amazon_com_ecs_home_region_us-east-1__15_.png

サービスの確認

内容を確認してサービスの作成をします。
console_aws_amazon_com_ecs_home_region_us-east-1__16_.png

作成ステータスの確認

セキュリティグループの設定やサービスの設定が進みます。
console_aws_amazon_com_ecs_home_region_us-east-1__17_.png

動作確認

タスクのステータス確認

クラスタ内のタスクタブでステータスがRUNNINGになっていることを確認します。少し時間がかかる場合があります。
起動中のタスクIDを選択して詳細を確認します。
console_aws_amazon_com_ecs_home_region_us-east-1__18_.png

タスクの詳細確認

Networkの部分を見ると、ENI idがアタッチされていることが確認できます。
コンテナは外部に対してこのENIで通信します。
ENI IDを選択するとENIの画面に遷移します。
console_aws_amazon_com_ecs_home_region_us-east-1__19_.png

ENIの確認

ENIの画面に遷移したら、IPv4パブリックIPの部分を参照します。
ここに表示されているIPアドレスでコンテナと通信できます。
us-east-1_console_aws_amazon_com_ec2_v2_home_region_us-east-1.png

Nginxにアクセス

ブラウザで先程確認したIPアドレスにアクセスしてみます。
スクリーンショット 2017-12-05 17.28.17.png
無事Nginxが起動していました。

後片付け

作成したクラスタを削除します。
...と言いたいところですが、単純に削除したところ途中でエラーが出ました。
サービスを作成した際にできたセキュリティグループが残ってしまうので、CloudFormationStackが削除できないことが原因でした。
おそらく正しい手順はサービスの削除 -> セキュリティグループの削除 -> クラスタの削除となります。
まさか最後にアンチパターンにぶつかるとは。。。
console_aws_amazon_com_ecs_home_region_us-east-1__20_.png

最後に

インスタンスを意識する必要がないので保守範囲が減り、期待通りかなり魅力あるサービスだと感じました。
運用面では監視に課題が出てきそうなのかなーと思いました。
なんにせよ、Terraformへの組み込みと、東京リージョンでのサービス開始が待ち遠しいです。