この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回はCLIを利用して高可用性アーキテクトの構築をしていきます。
この記事ではCLIよりEFSの作成を行います。
このブログはCLIによるEFSの作成をする上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。
1.高可用性アーキテクト構築目次
2.EFSとは
Amazon Elastic File System (Amazon EFS) は、シンプルなサーバーレスで、 set-and-forget で使用する Elastic ファイルシステムAWS クラウドサービスとオンプレミスリソース。アプリケーションを停止させることなく、オンデマンドでペタバイト規模までスケールするよう設計されており、ファイルの追加や削除に応じて自動的に拡張/縮小されるため、拡張に対応するための容量のプロビジョニングや管理は不要になります。
参照:Amazon Elastic File System とは
今回は高可用性アーキテクトを構築していくうえで二つのEC2インスタンスの共有ファイルシステムとしてEFS利用します。
類似のストレージサービスとしては「Amazon S3」や「Amazon FSx」等があげられます。
3.構成図と作業フロー
EFS作成からマウントまでのフローは以下になります。
- 共有ファイルシステムであるEFSを作成します。
- マウントターゲットを作成し、ターゲットにはマウントするEC2インスタンスがあるパブリックサブネットを指定します。
- EC2インスタンスにEFSをマウントします。具体的マウント方法は以下のコマンドを参考にしてください。(これらは後にEC2のユーザーデータにまとめ、EC2作成時に自動で設定できるようにしています。)
sudo yum install -y amazon-efs-utils
sudo mount -t efs -o tls fs-xxxxx:/ /var/www/html/
echo 'fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstab
-
1行目
sudo yum install -y amazon-efs-utils
は、
EFSマウントヘルパーのインストールです。-y
は全ての問い合わせに「yes」で応答するオプションです。
-
2行目
sudo mount -t efs -o tls fs-xxxxx:/ /var/www/html/
は、
EFSのマウントコマンドです。fs-xxxxxは自分のefsIDを設定します。-o tls
はtlsを利用して暗号化するコマンドです。
-
3行目
echo 'fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0' | sudo tee -a /etc/fstab
について、
インスタンスの再起動時に、EFSを自動マウントするためのコマンドです。なので、fs-xxxxxを自分のefsIDに書き換える必要があります。- 「/etc/fstab」ファイルは、マウントするファイルシステムの情報を記述するファイルです。なので、
fs-xxxxx:/ /var/www/html efs tls,_netdev 0 0
を書き込む事で起動時に自動マウント設定を行えます。 sudo echo
で直接書き込もうとするとリダイレクト処理が挟まって一般ユーザー権限になり、Permission deniedエラーが発生します。
- 「/etc/fstab」ファイルは、マウントするファイルシステムの情報を記述するファイルです。なので、
4.EFS構築
ではこれからEFSの構築をしていきます。
4-1.EFS作成
EFSの作成をしていきます、EFSの作成には[aws efs create-file-system]コマンドを使用します。
使用するオプション | 設定値 | 説明 |
---|---|---|
--encrypted | オプションの入力で有効化されます | 暗号の有効化 |
--kms-key-id | xxxxx-xxxx-xxxx-xxxxx | 作成した暗号化鍵のIDを入力 |
--tags | Key=Name,Value=umemoto-EFS | 設定したいタグを入力 |
入力
aws efs create-file-system `
--encrypted `
--kms-key-id xxxxx-xxxx-xxxx-xxxx-xxxxx `
--tags Key=Name,Value=umemoto-EFS
出力
{
"OwnerId": "xxxxx",
"CreationToken": "xxxxx-xxxx-xxxx-xxxx-xxxxx",
"FileSystemId": "fs-xxxxx",
"FileSystemArn": "arn:aws:elasticfilesystem:ap-northeast-2:xxxxx:file-system/fs-xxxxx",
"CreationTime": "2022-05-09T16:59:46+09:00",
"LifeCycleState": "creating",
"Name": "umemoto-EFS",
"NumberOfMountTargets": 0,
"SizeInBytes": {
"Value": 0,
"ValueInIA": 0,
"ValueInStandard": 0
},
"PerformanceMode": "generalPurpose",
"Encrypted": true,
"KmsKeyId": "arn:aws:kms:ap-northeast-2:xxxxx:key/xxxxx-xxxx-xxxx-xxxx-xxxxx",
"ThroughputMode": "bursting",
"Tags": [
{
"Key": "Name",
"Value": "umemoto-EFS"
}
]
}
作成できました。
4-2.マウントターゲット
次にマウントターゲットを設定していきます。
4-2-1.マウントターゲットとは
マウントターゲットは、Amazon EFS ファイルシステムをマウントできる NFSv4 エンドポイントの IP アドレスを提供します。Domain Name Service (DNS) 名を使用してファイルシステムをマウントします。そうすると EC2 インスタンスと同じアベイラビリティーゾーンの EFS マウントターゲットの IP アドレスとして解決されます。AWS リージョンのアベイラビリティーゾーンごとに 1 つのマウントターゲットを作成できます。VPC のアベイラビリティーゾーンに複数のサブネットがある場合、サブネットの 1 つにマウントターゲットを作成します。次に、アベイラビリティーゾーンのすべての EC2 インスタンスがそのマウントターゲットを共有します。
参照:Amazon EFS: 仕組み
4-2-2.マウントターゲット作成
マウントターゲットには二つのパブリックサブネットを登録します。
設定には、[aws efs create-mount-target]コマンドを使用します。
オプション | 設定値 | 説明 |
---|---|---|
--file-system-id | fs-xxxxx | 先ほど作成したEFSのIDを入力 |
--subnet-id | subnet-1xxxx,subnet-2xxxx | 前回作成した二つのパブリックサブネットのIDを入力 |
--security-group | sg-xxxxx | 前回作成したEFS用のSGのIDを入力 |
--ip-address | 例:10.0.1.100 | 今回は使用しないオプションですが、例のように設定したいipアドレスを指定することも可能です。(サブネットのCIDR範囲内) |
入力
aws efs create-mount-target `
--file-system-id fs-xxxxx `
--subnet-id subnet-1xxxx `
--security-group sg-xxxxx
aws efs create-mount-target `
--file-system-id fs-xxxxx `
--subnet-id subnet-2xxxx `
--security-group sg-xxxxx
出力
{
"OwnerId": "xxxxx",
"MountTargetId": "fsmt-xxxxx",
"FileSystemId": "fs-xxxxx",
"SubnetId": "subnet-1xxxx,
"LifeCycleState": "creating",
"IpAddress": "10.0.1.157",
"NetworkInterfaceId": "eni-xxxxx",
"AvailabilityZoneId": "apne2-az1",
"AvailabilityZoneName": "ap-northeast-2a",
"VpcId": "vpc-xxxxx"
}
-----
{
"OwnerId": "xxxxx",
"MountTargetId": "fsmt-xxxxx",
"FileSystemId": "fs-xxxxx",
"SubnetId": "subnet-2xxxx",
"LifeCycleState": "creating",
"IpAddress": "10.0.2.110",
"NetworkInterfaceId": "eni-xxxxx",
"AvailabilityZoneId": "apne2-az3",
"AvailabilityZoneName": "ap-northeast-2c",
"VpcId": "vpc-xxxxx"
}
マウントターゲットの設定ができました。
これでEFSの作成を完了しました。
5.EFS検証
作成したEFSが機能してるかの検証をしていきます。
※こちらの検証はEC2構築後に検証しています
プライベートIP10.0.1.10のインスタンスでテストファイルを作成して、プライベートIP10.0.2.20のインスタンで確認できるかのテストをします。
①まず両方のインスタンスがEFSにマウントしたディレクトリに移動したいため、以下のコマンドを利用します。
cd /var/www/html
②プライベートIP10.0.1.10のインスタンスでテストファイルを以下のコマンドで作成します。
sudo touch test.txt
③最後にプライベートIP10.0.2.20のインスタンスで以下のコマンドを利用してファイルを確認します。
ls test.txt
確認できました。
6.感想
特に問題なく構築できました、EFSの検証も見ていただけると光栄です。
7.参照
AWS CLI Command Reference – efs
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/efs/index.html