EBSマルチアタッチを試す
特定の条件を満たす場合、1つのEBSを複数のEC2インスタンスにアタッチすることができます。
今回はEBSマルチアタッチを検証します。
なお最初に申し上げますと、本検証は有意義な結果を得ることはできませんでした。
あらかじめご了承ください。
構築する環境
2つのEC2インスタンスを作成します。
インスタンスは最新のAmazon Linux 2とします。
EBSを作成します。
EBSマルチアタッチを有効化します。
2つの目的のために、SSM用エンドポイントを作成します。
1つ目の目的は、SSMドキュメントを実行して、インスタンスの初期化処理を行うためです。具体的には、EBSのアタッチ等です。
2つ目の目的は、SSM Session Managerでインスタンスにアクセスするためです。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/095
テンプレートファイルのポイント解説
本ページでは、EBSマルチアタッチについて取り上げます。
EBSに関する基本的な事項については、以下のページをご確認ください。
EBS
Resources:
EBS:
Type: AWS::EC2::Volume
Properties:
AvailabilityZone: !Sub "${AWS::Region}${AvailabilityZone}"
Iops: !Ref EBSIops
MultiAttachEnabled: true
Size: !Ref EBSVolumeSize
VolumeType: !Ref EBSVolumeType
EBSAttachment1:
Type: AWS::EC2::VolumeAttachment
Properties:
Device: !Sub "/dev/sd${DeviceNameSuffix}"
InstanceId: !Ref Instance1
VolumeId: !Ref EBS
EBSAttachment2:
Type: AWS::EC2::VolumeAttachment
Properties:
Device: !Sub "/dev/sd${DeviceNameSuffix}"
InstanceId: !Ref Instance2
VolumeId: !Ref EBS
Code language: YAML (yaml)
EBSマルチアタッチを有効化するためには、いくつかの制約があります。
以下に特に重要なものを取り上げます。
- EBSとインスタンスが同AZに配置されていること。
- EBSはプロビジョンド IOPS SSD (io1 および io2) ボリュームであること。
他にも多くの制約がありますので、AWS公式ページをご確認ください。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volumes-multi.html
MultiAttachEnabledプロパティで、EBSマルチアタッチを有効化を指定します。
今回は有効化しますから、本プロパティに「true」を設定します。
他のパラメータを以下にまとめます。
- ボリュームタイプ:io2
- IOPS:100
- ボリュームサイズ:4GB
(参考)SSM関連付け
Resources:
RunShellScriptAssociation:
Type: AWS::SSM::Association
Properties:
AssociationName: !Sub "${Prefix}-run-shellscript-association"
Name: AWS-RunShellScript
OutputLocation:
S3Location:
OutputS3BucketName: !Ref LogBucket
OutputS3KeyPrefix: !Sub "${Prefix}/run-powershellscript-association"
Parameters:
commands:
- !Sub |
mount_point="${MountPoint}"
file_system="${FileSystem}"
for d in $(lsblk -n -r -p | grep disk | awk '{ print $1 }' )
do
if [ "$(sudo file -s -b $d)" == data ]; then
sudo mkfs -t $file_system $d
fi
if [[ "$(sudo file -s -b $d | tr '[:upper:]' '[:lower:]')" =~ $file_system ]]; then
sudo mkdir $mount_point
sudo mount $d $mount_point
uuid=$(sudo blkid $d -o export | grep ^UUID)
echo -e "$uuid\t/data\t$file_system\tdefaults,nofail\t0\t2" >> /etc/fstab
fi
done
Targets:
- Key: InstanceIds
Values:
- !Ref Instance1
- !Ref Instance2
WaitForSuccessTimeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
Code language: YAML (yaml)
SSMドキュメントAWS-RunShellScriptを実行して、インスタンスの初期化処理を行います。
実行する内容は以下の通りです。
- EBSにファイルシステムが未作成の場合は、ファイルシステム(xfs)を作成する。
- xfsタイプのファイルシステムのデバイスがあれば、マウントポイントを作成し、これをマウントする。
- 自動マウントのために、/etc/fstabに追記する。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- インスタンス1:i-075f601c26550180b
- インスタンス2:i-08369c7e5eaac4834
- EBS:vol-008299ff8f19b3a89
作成されたリソースをAWS Management Consoleから確認します。
EBSを確認します。
EBSが正常に作成されました。
Multi-Attach enabledの項目を見ると「Yes」とあります。
Attached Instancesを見ると、「2 attached」とあります。マルチアタッチが有効になっているため、同時に2つのインスタンスにアタッチされているということです。
SSMドキュメントの実行履歴を確認します。
SSMドキュメントAWS-RunShellScriptが両インスタンスに対して実行されました。
これでEBSに対するファイルシステムの作成や、マウントが実行されました。
動作確認
インスタンス1
準備が整いましたので、インスタンス1にアクセスします。
インスタンスへのアクセスは、SSM Session Managerを使用します。
% aws ssm start-session --target i-075f601c26550180b
sh-4.2$
Code language: Bash (bash)
SSM Session Managerの詳細につきましては、以下のページをご確認ください。
EBSのマウント状況を確認します。
sh-4.2$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 10M 0 part /boot/efi
nvme1n1 259:3 0 4G 0 disk /data
Code language: Bash (bash)
確かに/dataにマウントされていることがわかります。
EBSにファイルを書き込みます。
sh-4.2$ sudo touch /data/test.txt
sh-4.2$ ls /data
test.txt
Code language: Bash (bash)
確かにファイルが作成されました。
インスタンス2
続いてインスタンス2にアクセスします。
% aws ssm start-session --target i-08369c7e5eaac4834
sh-4.2$
Code language: Bash (bash)
EBSのマウント状況を確認します。
sh-4.2$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
└─nvme0n1p128 259:2 0 10M 0 part /boot/efi
nvme1n1 259:3 0 4G 0 disk /data
Code language: Bash (bash)
EBSがマウントされています。
やはり1つのEBSが2つのインスタンスにマルチアタッチされています。
EBS領域を確認します。
sh-4.2$ ls /data
sh-4.2$
Code language: Bash (bash)
先ほどインスタンス1で作成したファイルが表示されません。
どうやら一度アンマウントしなければ、インスタンス2に反映されないようです。
sh-4.2$ sudo umount /data
sh-4.2$ sudo mount /dev/nvme1n1 /data
Code language: Bash (bash)
改めてEBS領域を確認します。
sh-4.2$ ls /data
test.txt
Code language: Bash (bash)
ファイルが確認できました。
このようにEBSマルチアタッチは、EFSと同様の挙動は期待できないということです。
まとめ
EBSマルチアタッチの挙動を確認しました。