AWS

EBSマルチアタッチを試す

スポンサーリンク
EBSマルチアタッチを試す AWS
スポンサーリンク
スポンサーリンク

EBSマルチアタッチを試す

特定の条件を満たす場合、1つのEBSを複数のEC2インスタンスにアタッチすることができます。

今回はEBSマルチアタッチを検証します。

なお最初に申し上げますと、本検証は有意義な結果を得ることはできませんでした。
あらかじめご了承ください。

構築する環境

Diagram of tring EBS Multi-Attach

2つのEC2インスタンスを作成します。
インスタンスは最新のAmazon Linux 2とします。

EBSを作成します。
EBSマルチアタッチを有効化します。

2つの目的のために、SSM用エンドポイントを作成します。
1つ目の目的は、SSMドキュメントを実行して、インスタンスの初期化処理を行うためです。具体的には、EBSのアタッチ等です。
2つ目の目的は、SSM Session Managerでインスタンスにアクセスするためです。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

awstut-fa/095 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

テンプレートファイルのポイント解説

本ページでは、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公式ページをご確認ください。

Amazon EBS マルチアタッチを使用した複数のインスタンスへのボリュームのアタッチ - Amazon Elastic Compute Cloud
マルチアタッチが有効な Amazon EBS ボリュームを複数のインスタンスにアタッチします。

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を確認します。

Detail of EBS 1.
Detail of EBS 2.

EBSが正常に作成されました。
Multi-Attach enabledの項目を見ると「Yes」とあります。
Attached Instancesを見ると、「2 attached」とあります。マルチアタッチが有効になっているため、同時に2つのインスタンスにアタッチされているということです。

SSMドキュメントの実行履歴を確認します。

Detail of SSM Run Command 1.

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マルチアタッチの挙動を確認しました。

タイトルとURLをコピーしました