【AWS】ECSのボリューム設定 | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

引き続き、AWSをテーマに書いていきます。

今回は、ECSでボリュームを利用する際の選択肢や、設定についてまとめています。

 

もくじ

1.(前提知識)Dockerにおけるデータ保存方式

2.ECSでサポートされるボリューム

3.Amazon EFS ボリューム

 ・そもそもAmazon EFSとは

 ・ECSで Amazon EFSを利用するには

4.FSx for Windows File Serverボリューム

 ・そもそもFSx for Windows File Serverとは

 ・ECSでFSx for Windows File Serverを利用するには

5.Dockerボリューム

6.バインドマウント

 ・ECS利用時のバウンドマウントの注意点

 ・ECSでバインドマウントを利用するには

 

1.(前提知識)Dockerにおけるデータ保存方式

ECSの話に入る前に、前提知識として、Dockerにおけるデータ保存の方式を説明する。

(ご存じの方は2.ECSでサポートされるボリュームまでスキップしてください)

 

というのも、ECSは、平たく言うとDockerの機能をラップして

AWSから便利に利用できるようにしたサービスである。

ECSでのボリューム設定はすなわち、

裏で動くDocerで、どのようにデータを保存するかという話にもつながってくる。

 

 

さて、Dockerでは、コンテナを作成し、各コンテナが動作していくわけだが、

その際に利用するデータはどこに保存されるのだろうか。

 

各コンテナ自身にデータを保存するのは好ましくない。
というのも、コンテナを破棄したら、保存したデータも消えてしまうためだ。


確実に不要な一時データを、意図的なコンテナ破棄時にサヨナラするのはまだしも、

意図しない異常発生によりコンテナが消えるとデータもサヨナラしてしまう…。

 

また、あるデータをコンテナAが参照したいとなった時、コンテナAがそのデータを保持していたとしたら、

コンテナ間の結合度が上がり、耐障害性観点から言っても微妙である。

そのためDockerでは、各コンテナ内ではなく、各コンテナから参照できる共通領域に、

データを保存することがベストプラクティスとなっている。

具体的に、Dockerでコンテナにてデータを作成・管理する方式は、以下3つがある。

 

方式 説明
ボリューム Dockerが直接管理するデータ保存領域(=ボリューム)に、データを保存する方法。
ボリュームの実体は、ホストマシン上のDockerストレージディレクトリ内に作成される、専用のフォルダである。
そのため、コンテナを停止した後もデータを保持できる(データ永続化)。
バインドマウント

ホストマシン上のファイルやディレクトリを、

コンテナにマウントして利用する方法。

ファイルやディレクトリは、ホストマシン上の絶対パスとして参照される。

そのため、コンテナを停止した後もデータを保持できる(データ永続化)。

 

ホストマシン上のディレクトリ構造とOSに依存するバインドマウントよりも、

Dockerによる直接管理となるボリュームの使用が推奨される。

tmpfsマウント 一時的なデータをホストメモリ上にのみ保持する方法。
コンテナを停止するとtmpfsマウントは削除され、書き込まれたデータも失われる。
コンテナが、永続保存不要なデータを生成する場合に有用。
ホストマシンのOSがLinuxである場合に使用可能。

 

上表からも分かる通り、Dockerでデータを永続的に保存したい場合、

基本的にはボリュームを使用することになる。

 

2.ECSでサポートされるボリューム

Amazon ECSで、コンテナに向けたデータ保存領域を確保する方法として、

Dockerのボリュームやバインドマウント以外にも、AWS独自の方法がサポートされている。

 

データ保存領域確保のためには、ECSのタスク定義に設定を記述する必要がある。

※データ保存領域確保の設定自体はオプションである。

 

タスク定義で設定すると、確保したデータ領域は、

同じホスト上にある各コンテナから使用できるようになる。

 

種別 説明
Amazon EFSボリューム Amazon EFS(AWSが提供する永続ファイルストレージサービス)を利用する方法。
EFSボリュームでは、EFSのストレージを、
ボリュームとしてECSのコンテナにマウントする。
ホストはFargate、EC2のいずれでも可。
FSx for Windows File Server ボリューム

Amazon FSx for Windows File Server(AWSが提供する、フルマネージドWindowsファイルサーバサービス)を利用する方法。

FSx for Windows File Server ボリュームでは、

FSx for Windows File Serverのストレージを、

ボリュームとしてECSのコンテナにマウントする。

ホストはFargate、EC2のいずれでも可だが、

FargateのWindowsコンテナでは使用不可。

Dockerボリューム Dockerのボリューム(1.Dockerにおけるデータ保存方式で説明したボリューム)を利用する方法。
EC2がホストの場合のみ使用可。
バインドマウント

ホストマシン上のファイルやディレクトリを

コンテナにマウントする方法。

ホストはFargate、EC2のいずれでも可。

 

以降、各手法について詳細を見ていく。

 

3.Amazon EFS ボリューム

◎そもそもAmazon EFSとは

Amazon EFS(Amazon Elastic File System)は、

AWSのVPC内に作成される、ファイルストレージサービスである。

 

マウントターゲット(EFSに接続するためのネットワークIF)のIPアドレスを使って、

EC2インスタンスやコンテナ等から接続して利用する仕組みとなっている。

AWS上のリソースだけでなく、オンプレミスからも接続できる。

 

Amazon EFSの主な特徴は以下の通りである。

*拡張性のあるストレージ容量

Amazon EFSの容量は、ファイルの追加や削除に伴って自動的に拡大/縮小される。

必要な時点で必要なストレージだけを確保できるため、

将来の拡張を想定して、使わない分までをわざわざ確保しておく必要はない。

まさにクラウドのメリットが活かされた強みである。

 

*可用性の高さ

Amazon EFSは、99.999999999 % (イレブンナイン) の耐久性と

最大 99.99 % (フォーナイン) の可用性を実現するように設計されている。

 

具体的には、EFSストレージに格納されたデータが、

自動で複数のAZに複製されるようになっている。

そのため1つのAZで障害が発生しても、別のAZにデータが残っており、

継続してデータにアクセスできる仕組みとなっている。

 

◎ECSで Amazon EFSを利用するには

ECSでは、EFSを、タスクの永続ボリュームとして利用することができる。

Amazon EFS ボリュームを利用するには、

あらかじめ使用するEFSのファイルストレージを作成したうえで、

ECSのタスク定義に、以下①、②のパラメータを設定する必要がある。

 

 ①name(ボリューム名)

 ②efsVolumeConfiguration

 

②について、"efsVolumeConfiguration"はオブジェクト型のパラメータであり、

以下の引数を持つ。

 

パラメータ 説明
fileSystemId 使用する Amazon EFS ファイルシステムの ID。
rootDirectory

ホスト内にルートディレクトリとしてマウントする

Amazon EFSファイルシステム内のディレクトリ。

"/"以外のディレクトリをルートにして

マウントしたい場合に指定する。

transitEncryption ホストとAmazon EFSサーバ間のデータ転送において、
データを暗号化するかどうか。
 暗号化する:"ENABLED"
 暗号化しない:"DISABLED"
transitEncryptionPort

ホストとAmazon EFSサーバ間のデータ転送において、

暗号化されたデータの送信時に使用するポート。

authorizationConfig Amazon EFS ファイルシステムへのアクセス認可情報。
使用するアクセスポイントIDと、
マウント時に使用するIAMロールを指定する。

 

 

4.FSx for Windows File Serverボリューム

◎そもそもFSx for Windows File Serverとは

FSx for Windows File Serverとは、

AWSが提供する、フルマネージドなWindowsのファイルストレージサービスである。

 

既存のWindowsサーバ上で動いているシステム・データを、

スムーズに(環境差異問題を極力少なくして)AWSに移行する時などに、その威力を発揮する。

 

Amazon EFSはLinux向けなのに対し、

FSx for Windows File Serverは極めてWindowsとの親和性が高いファイルストレージとなっている。

 

◎ECSでFSx for Windows File Serverを利用するには

ECSでは、FSx for Windows File Serverを、

タスクの永続ボリュームとして利用することができる。

 

 

ECSでFSx for Windows File Serverを利用するには、

あらかじめ使用するFSx for Windows File Serverのファイルストレージを作成したうえで、

ECSのタスク定義で、以下①、②のパラメータを設定する必要がある。

 

 ①name(ボリューム名)

 ②FSxWindowsFileServerVolumeConfiguration

 

②について、"FSxWindowsFileServerVolumeConfiguration"はオブジェクト型のパラメータであり、

FSx for Windows File Serverを利用するには必須となっている。

"FSxWindowsFileServerVolumeConfiguration"は、以下のパラメータを持つ。

 

パラメータ 説明
fileSystemId 使用するFSx for Windows File ServerファイルシステムのID。
rootDirectory

ホスト内にルートディレクトリとしてマウントする

FSx for Windows File Serverファイルシステム内のディレクトリ。

authorizationConfig FSx for Windows File Serverファイルシステムへのアクセス認可情報。
認証情報とファイスシステムのドメイン名を指定する。

 

 

5.Dockerボリューム

ECSでDockerボリュームを利用するには、ECSのタスク定義で、

以下①、②のパラメータを設定する必要がある。

 

 ①name(ボリューム名を指定)

 ②dockerVolumeConfiguration

 

②について、"dockerVolumeConfiguration"はオブジェクト型のパラメータであり、

ECSでDockerのボリュームを利用するには必須となっている。

"dockerVolumeConfiguration"は、以下のパラメータを持つ。

 

パラメータ 説明
scope Docker ボリュームのライフサイクルを決めるスコープ。
"task"に設定するとタスク停止時に破棄、
"shared"に設定するとタスク停止後も保持される。
autoprovision まだ存在していない場合にボリュームを作成するかどうか。
scopeが"shared"の時のみ有効なパラメータ。
driver 使用するDockerボリュームドライバ。※1
driverOpts 使用するDockerボリュームドライバ固有のオプション設定がある場合、
設定キーと値のペア。
labels Dockerボリュームに追加したいメタデータがある場合、
メタデータのキーと値のペア。

 

※1:Dockerのドライバとは

ストレージシステムの種類や場所に依存せず、データを保存・やりとりするための仕組み。

リモートホスト上やクラウド上といった、ホスト以外の場所にボリュームを配置したい時など、データのやり取りがローカルでは完結しない場合に、特に指定する必要がある。

デフォルトはlocal(ローカルのホスト上のボリューム利用)となっている。

 

 

6.バインドマウント

◎ECS利用時のバインドマウントの注意点

ECSでバインドマウントによるデータ保存をした場合、

デフォルトでは、コンテナのライフサイクルとデータが紐づけられる。

そのため、タスクが停止するなどして、

バインドマウントを使用する全コンテナが停止すると、データが削除されることに注意する必要がある。

 

ただし、EC2をホストとしている場合に限り、設定を変えれば、

ホストが停止しない限りデータを保持する(ホストのライフサイクルにデータを紐づける)こともできる。

 

以上の特性から、データの永続化目的では、

ECSでバインドマウントを利用すべきではない。

あくまでも以下のようなケースにおいて、一時的に利用する手法と考えたほうが良い。

  • コンテナに空のデータボリュームを提供したい。

  • コンテナにホストデータをマウントしたい。

  • コンテナのデータボリュームを、同じタスク内の他のコンテナと共有したい。

  • Dockerfileからコンテナにパスとその内容を公開したい。

  • サイズの大きい一時ストレージを、タスクにマウントしたい。(ホストがFagateの時のみ)

 

◎ECSでバインドマウントを利用するには

ECSでバインドマウントを利用するには、

利用目的に応じて適切なパラメータを設定する必要がある。

本記事ではパラメータを紹介するにとどめるが、細かなユースケースは公式ドキュメントを参照のこと。

 

*コンテナにデータボリュームのマウントポイントを指定したい場合

ECSタスク定義に、mountPointsオブジェクトをパラメータとして含める必要がある。

 

パラメータ 説明
sourceVolume マウントするボリュームの名前。
containerPath ボリュームをマウントするコンテナ上のパス。
readOnly

コンテナのアクセス権限を

読み取り専用とする(true)か、

書き込み可とする(false)か。

 

*バインドマウントを、コンテナではなくホストEC2のライフサイクルに紐づけたい場合

ECSタスク定義に、hostオブジェクトをパラメータとして含める必要がある。

"host"オブジェクトは、以下のパラメータを持つ。

 

パラメータ 説明
sourcePath コンテナに表示されるホストEC2のパス。
データボリュームは、コンテナ停止に関わらず、
手動で削除するまで、指定したパスに保持される。

 

 

*Fargateホストで、タスク用の一時ストレージ容量を増やしたい場合

バインドマウントの仕組みを利用することで、ECS on Fagateにおいて、

タスク内のコンテナに、デフォルト容量を超える一時ストレージ(エフェメラルストレージ)を割り当てることもできる。

一時ストレージの容量は、21~200GBまでの間で設定可能となっている。

 

エフェメラルストレージを割り当てるには、

以下のパラメータをECSタスク定義に含める必要がある。

 

パラメータ 説明
ephemeralStorage 以下の形式で、割り当てたい容量を指定する。
"sizeInGiB": integer

 

 

今回は以上!