話題の記事

【全世界待望】Fargateから共有ファイルストレージのEFSが使えるようになりました!

今までユースケースとして待望になっていたFargateからのEFS利用が可能になりました。設定もそれほど難しくないので、不要なEC2を削減するチャンスです!
2020.04.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Fargateから共有ファイルストレージを使いたいんです…切実に…」

こういった要望を聞くことは、今まで非常に多くあり、私が直接聞いたお客様でも3件以上、ご要望を頂いておりました。そんななか、ついにFargateでEFSをサポートするというビッグニュースがはいってまいりました!

AWS Fargate launches Platform Version 1.4

Fargateのタスク間やサービス間でファイルストレージを共有するために、今までECS on EC2を使っていた構成では、そのEC2が不要になりECS on Fargateを利用できます。これは、えらいこっちゃですよ…

FargateでEFSきたか…!!ホンマに…!?

  ( ゚д゚) ガタッ
  /   ヾ
__L| / ̄ ̄ ̄/_
  \/   /

アップデートのキモはFargate Platformの新バージョンリリース

今回のアップデートは、Fargate PlatformのVersion1.4がリリースされたことによる、機能拡張です。

Fargateは、ホストインスタンスを意識せずコンテナワークロードを展開できるのが特徴ですが、プラットフォームとしてのバージョンが明示的に存在し、頻度は少ないですが大きな変更が入るときにはそのプラットフォームバージョンが更新されます。

前回のVersion 1.3のリリース(シークレットのサポートなど)が、2018年12月17日と1年半ほど昔(AWS Fargate プラットフォームバージョン 1.3 でシークレットのサポートを追加)なので、今回のアップデートは、それだけ大きなアップデートと思っていただいて間違いないです。

この記事では、目玉となるFargateのEFSサポートについて記載します。

1.4での変更点の全体概要は、別途AWS Blogが公開されています。

AWS Fargate launches platform version 1.4.0 | Containers

FargateがEFSをサポートすることにより嬉しい点

従来の構成からEC2が不要になり、構成の複雑性の減少による運用コストが削減できます!

Fargateにおいて、それぞれのサービスやタスクから共通のファイルストレージを参照されたいというご要望は今まで非常に多くあり、そういう場合2つの選択肢を提示させていただいてました。

  1. S3やDynamoDBやElastiCacheなどの共有ストレージを利用する
  2. ECS on EC2の構成にし、Fargateを諦める

基本的には1を推奨させていただいているのですが、コンテナ上のミドルウェアの制約でS3が使えないであったり、元々ファイルストレージのみを想定したアプリケーションの作りになっている場合などは、2の選択肢となります。

アプリケーション環境は全てFargateに統一したいのに、その制約があるため、特定のサービスのみをECS on EC2にせざるを得ないという悲しい現実がそこにはありました…

このアップデートで、そんな悲しい過去ともおさらばです!ワッショイ!

FargateのEFS対応を実際にやってみよう

というわけで、実際にどんな感じで使うのかをお届けします。基本的な手順はこちら(Amazon Elastic Container Service now supports Amazon EFS file systems | AWS News Blog)で紹介されています。

手順としては大きく2つ。

  1. EFSを事前に作成
  2. ECSのタスク定義を設定し、Fargateで起動

1. EFSを事前に作成

最初にECSからマウントするためのEFSを作成しておきます。基本的にECSタスクを起動するVPCと同じ場所であれば大丈夫です。

マネジメントコンソールのEFSメニューから[Create file system]をクリックします。下のように、利用するVPCとマウントターゲットとなるサブネットを複数AZの中からそれぞれ選択します。ここでセキュリティグループの設定も必要になるので、NFSポート(2049)をVPC内のCIDRから受けるように設定しておけばOKです。

[Configure file system settings]、こちらはデフォルトで次にいきます。

[Configure client access]これもデフォルトで次にいきます。

ここまで完了したら、EFS作成します。作成が終わったら、一度VPC内にEC2を起動して、作成したEFSへのマウントが可能かどうか事前に確認しておくことをおすすめします。

2. ECSのタスク定義を設定し、Fargateで起動

ECSのタスク定義を設定していきます。

利用するコンテナ

今回は、ファイルアップロードを複数コンテナから実行し、それがEFSマウントされた共有ファイルストレージを共有することを確認するために、コンテナ上で動作するファイルコマンダーを利用します。このコンテナを使うと、Webブラウザ上でコンテナ内ファイルシステムに対して、もろもろの操作ができます。

GitHub:coderaiser/cloudcmd: ✨☁️?✨ Cloud Commander file manager for the web with console and editor.

見た目はこんな感じ。

EFSをボリューム指定したECSタスク定義の作成

ECSのタスク定義を作成していきます。最初に起動タイプとしてFargateを選択。その後、以下のタスク定義を設定していきます。

  • Task Definition Name:[fargate-efs-moutn-test]
  • Task Role:[None]
  • Task Execution role:[None](今回のコンテナはDockerHubにパブリック公開されており、さらにCloudWatchLogsも利用しないのであれば、Noneで問題ありません)
  • memory(GB):0.5GB
  • CPU(vCPU):0.25vCPU

[Add volume]をクリック。すると、タスク定義にマウントするためのボリュームを定義する画面が起動するので、任意の名前をつけてVolume typeでEFSを選択すると、先程作成したEFSのFile system IDを指定します。

  • Name:[efs-mount-volume]
  • Volume type:[EFS]
  • File system ID:前段で作成したEFSのファイルシステムID

ボリュームを作成したら、[Add container]ボタンをクリックしてコンテナ定義を作成していきます。

  • Container name:[cloud-commander]
  • image:[coderaiser/cloudcmd:latest](DockerHubに公開されているコンテナを利用します)
  • Port mappings:[8000:tcp](ポート8000を公開します)

[STORAGE AND LOGGING]の部分に[Mount points]を定義するところがあるので、以下を設定します。

  • Source volume:[efs-mount-volume](上で設定したボリューム名)
  • Container path:[/home/](コンテナの/homeフォルダ配下をEFSマウント)

以上で、ECSタスク定義の作成は完了です!

ECSサービスを作成して、動作確認

タスク定義の作成は完了したので、いよいよECSサービスを作成し、実際にコンテナにアクセスし動作を確認します。

詳細は割愛しますが、ECSタスクを複数(2つ以上)起動するようにECSサービスを作成してください。一点だけ注意なのは、Platform versionで1.4を明示的に指定する点です。

後は、ロードバランサー配下においてもパブリックIPを付与してもどちらでも構わないので、アクセスできる場所に複数該当タスクを起動します。一点注意なのは、今回利用しているcloud commanderコンテナは、デフォルトではポート8000を公開しているので、その点設定時に注意しておいてください。

無事、タスクが起動しましたでしょうか?コンテナにアクセスして以下の画面が表示されればOkです。

今回はコンテナの/homeディレクトリ配下をEFSマウントするように設定しているので、その中にファイルをアップロードしてみて(ドラッグアンドドロップであがります)、別コンテナからそのファイルが読み込めるか確認してみてください。

どうすか!Fargateなのに!!複数コンテナでファイル共有できていますでしょうか!??

Fargateでファイル共有できることによるユースケースの広がりに期待

今まで、共有ファイルストレージが使えないということで、Fargateの利用を諦めていた現場も多いと思います。今回、これがGA(一般リリース)されたということで、ECS on Fargate、ますます便利に使える余地が増えたかと思います。

特に、今回のプラットフォームバージョン1.4への更新においては、その他も様々な機能拡張が行われているので、ぜひ皆さんその他の機能も試してみてください。おって、Developers.IOでも記事があがっていく予定です。

それでは、今日はこのへんで。濱田(@hamako9999)でした。

tori先生の珠玉のツイート芸も参考にしよう!!

このリリースの発表をウズウズして待っていたtori先生も張り切って連ツイされているので、是非こちらも参考にしてみてください。EFSエンドポイント対応以外にも、広範囲でFargateは進化しているので、それらが端的にまとまっているツイート群となります。