皆様こんにちは。
AWS CDKを利用してマルチAZ3層アーキテクチャ構築をしていきます。
この記事ではEFSの作成を行います。
2.EFSとは
Amazon Elastic File System (Amazon EFS) は、AWS クラウド上で実行される完全マネージド型のファイルストレージサービスです。
特徴
-
スケーラブル:ストレージ容量が自動的にスケールアップおよびスケールダウンし、アプリケーションのニーズに応じて容量を調整できます。
-
高可用性と耐久性:データは複数のアベイラビリティゾーンにわたってレプリケートされ、耐久性と可用性を確保します。
-
共有アクセス:複数のEC2インスタンスやオンプレミスのサーバーから同時にアクセスでき、ファイルの共有を容易にします。
-
セキュア:AWS Identity and Access Management (IAM) を使用してアクセス制御を管理し、データは転送時と保存時の両方で暗号化されます。
-
パフォーマンス:スループットとI/O操作が求められるワークロードに対して、高いパフォーマンスを提供します。
詳細は公式ドキュメントを参照ください。
2.目的
- EC2を配置する各サブネットにマウントターゲットを作成しEFSを構築する。
- EC2にて障害発生した場合であってもファイルの共有を行えるようにする。
マウントターゲットとは
マウントターゲット(Mount Target)は、Amazon EFS(Elastic File System)の機能で、EFS ファイルシステムを Amazon EC2 インスタンスなどの AWS リソースに接続するためのエンドポイントを提供します。マウントターゲットは、EFS ファイルシステムの各アベイラビリティゾーン(AZ)に関連付けられており、VPC(Virtual Private Cloud)内のサブネットに配置されます。
3.構成図
4.全体構築ソースコード
# EFSファイルシステムの作成
self.file_system = efs.CfnFileSystem(self, "kitaya-efs",
performance_mode="generalPurpose",
encrypted=True
)
Tags.of(self.file_system).add("Name", "kitaya-efs")
# EFSマウントターゲットの作成
self.efs_mount_target_1 = efs.CfnMountTarget(self, "kitaya-efs-mount-target-1",
file_system_id=self.file_system.ref,
subnet_id=self.private_subnet_az1.ref,
security_groups=[self.efs_sg.security_group_id]
)
Tags.of(self.efs_mount_target_1).add("Name", "kitaya-efs-mount-target-1")
self.efs_mount_target_2 = efs.CfnMountTarget(self, "kitaya-efs-mount-target-2",
file_system_id=self.file_system.ref,
subnet_id=self.private_subnet_az2.ref,
security_groups=[self.efs_sg.security_group_id]
)
Tags.of(self.efs_mount_target_2).add("Name", "kitaya-efs-mount-target-2")
5.EFS構築
5-1.EFSファイルシステムの作成
EFSファイルシステムを作成します。
"efs.CfnFileSystem"クラスを使用
リソースを作成する際に必要なコンストラクトの指定と論理ID(テンプレート内で一意)の指定をしたのち、詳細のプロパティを指定しています。
プロパティは下記
使用するプロパティ | 設定値 | 説明 |
---|---|---|
performance_mode | "generalPurpose" | パフォーマンスモードを指定 |
encrypted | True | 暗号化するかどうか |
– "Tags.of()"メソッドを使用してNameタグをつけます(書式は下記)
Tags.of("リソース名").add("キー", "値")
ソースコード
# EFSファイルシステムの作成
self.file_system = efs.CfnFileSystem(self, "kitaya-efs",
performance_mode="generalPurpose",
encrypted=True
)
Tags.of(self.file_system).add("Name", "kitaya-efs")
5-2.EFSマウントターゲットの作成
EC2を配置する各プライベートサブネットに作成します。
これによりEC2とEFSで疎通が可能になります。
"efs.CfnMountTarget"クラスを使用
プロパティは下記
使用するプロパティ | 設定値 | 説明 |
---|---|---|
file_system_id | self.file_system.ref | マウントターゲットを関連付けるEFSファイルシステムのIDを指定 |
subnet_id | ソースコード参照 | EFSマウントターゲットを配置するサブネットのIDを指定 |
security_groups | [self.efs_sg.security_group_id] | マウントターゲットに関連付けるセキュリティグループのリストを指定 |
"Tags.of()"メソッドを使用してNameタグをつけます(書式は下記)
Tags.of("リソース名").add("キー", "値")
# EFSファイルシステムの作成
self.file_system = efs.CfnFileSystem(self, "kitaya-efs",
performance_mode="generalPurpose",
encrypted=True
)
Tags.of(self.file_system).add("Name", "kitaya-efs")
# EFSマウントターゲットの作成
self.efs_mount_target_1 = efs.CfnMountTarget(self, "kitaya-efs-mount-target-1",
file_system_id=self.file_system.ref,
subnet_id=self.private_subnet_az1.ref,
security_groups=[self.efs_sg.security_group_id]
)
Tags.of(self.efs_mount_target_1).add("Name", "kitaya-efs-mount-target-1")
self.efs_mount_target_2 = efs.CfnMountTarget(self, "kitaya-efs-mount-target-2",
file_system_id=self.file_system.ref,
subnet_id=self.private_subnet_az2.ref,
security_groups=[self.efs_sg.security_group_id]
)
Tags.of(self.efs_mount_target_2).add("Name", "kitaya-efs-mount-target-2")
6.検証
EC2構築後に検証しております。
6-1.EC2(1号機)にEFSをマウントする
下記コマンドでEC2(1号機)にEFSをマウントします。
※実際はEC2構築のユーザーデータでマウント済
# EFSファイルシステム用のディレクトリを作成
mkdir -p /mnt/efs
# EFSファイルシステムをマウント
mount -t nfs4 "${EFSのDNS名}:/" /mnt/efs
# EFSのマウントを永続化
grep -q "${EFSのDNS名}:/ /mnt/efs nfs4 defaults,_netdev 0 0" /etc/fstab || echo "${EFS_DNS}:/ /mnt/efs nfs4 defaults,_netdev 0 0" >> /etc/fstab
6-2.テストファイル作成
EC2(1号機)のコンソールでマウントしたディレクトリにでテストファイルを作成します。
touch /mnt/efs/test.txt
6-3.EC2(2号機)にEFSをマウントする
6-1と同様のコマンドでマウントします。
6-4.各EC2でテストファイルの作成を確認
EC2(1号機)で作成したテストファイルがそれぞれのサーバーで確認できればOKです。
7.感想
EFSの構築は初めてでした。
便利な機能で今後利用する機会が増えそうだと感じました。