#はじめに
今回はECSタスクからEFSへアクセスすることに挑戦してみました。
ECS初心者向けの記事を何本か書いていますので、どれか参考になれば幸いです。
#ECSでのEFSの使用
ECSでEFSを使用すると、すべてのECSタスクからファイルシステムデータにアクセスできます。
ECSタスク定義でEFSやコンテナマウントポイントを参照すると、ECSが自動的にファイルシステムをコンテナにマウントします。
#実装
AZをまたいで起動したタスク間で共有できるようなファイルシステムを構築します。
以下が構築の流れとなります。
- EFS用のセキュリティグループの作成
- EFS(マウントターゲット、アクセスポイント)の作成
- IAMロール
ecsTackRole
の作成 - タスク定義の作成
- サービス作成
##EFS用のセキュリティグループの作成
EC2インスタンスとマウントターゲット間のトラフィックを有効にするために、これらのセキュリティグループに次のルールを設定する必要があります。
- マウントターゲットに関連付けるセキュリティグループは、ファイルシステムをマウントするすべてのEC2インスタンスから、NFSポート上のTCPプロトコルへのインバウンドアクセスを許可
- ファイルシステムをマウントする各EC2インスタンスには、NFSポート上のマウントターゲットへのアウトバウンドアクセスを許可
これらのルールを満たすように、以下のようなセキュリティグループを作成します。
セキュリティグループはEC2にアタッチしているものを選択します。
##EFS(マウントターゲット、アクセスポイント)の作成
EFSを新しく作成します。
EC2をファイルシステムに接続するVPCとマウントターゲットを設定します。
今回は、マウントターゲットを2つのAZに置き、作成したセキュリティグループefs-sec-group
を選択します。
ポリシーオプションにチェックをつけて、ファイルシステムを作成します。
作成したファイルシステムを開いて、アクセスポイントを新しく作成します。
##IAMロールecsTaskRole
の作成
IAMロールを新しく作成します。
ポリシーを新しく作成します。
REGION
には該当リージョン、ACCOUNT_ID
にはアカウントID(マイアカウントの12桁の数字)、fs-xxxxxx
にはファイルシステムID、fsap-xxxxxx
にはアクセスポイントIDを記述します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"elasticfilesystem:ClientMount",
"elasticfilesystem:ClientWrite"
],
"Resource": "arn:aws:elasticfilesystem:REGION:ACCOUNT_ID:file-system/fs-xxxxxx",
"Condition": {
"StringEquals": {
"elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:REGION:ACCOUNT_ID:access-point/fsap-xxxxxxxxxxxxx"
}
}
}
]
}
ロールの作成に戻り、作成したポリシーefs-share-demo
をアタッチします。
##タスク定義の作成
EFSの準備が整ったので、タスク定義を作成します。
EFSとコンテナ(タスク)には以下のような関係があり、タスク定義にはボリュームを追加してあげる必要があります。
また、今回はcoderaiser/cloudcmd
という、ファイルマネージャのコンテナイメージを使用します。
EC2からロードバランサーを開くと、リスナーIDHTTP:8888
のデフォルトの転送先が確かにfile-explorer-svc
となっています。
[ロードバランサーのDNS名]:8888
で正常に開ければ成功です。
試しにefs-share
ディレクトリにefs-demo.txt
、ルートディレクトリにAAA
ディレクトリを作成します。
ページをロードするとタスクが切り替わるため、AAA
ディレクトリはなくなりますが、efs-demo.txt
はそのまま残ります。
このように、タスク間でファイルシステムが共有されます。
#参考資料