EBSマルチアタッチを試す

EBSマルチアタッチを試す

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テンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/095

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

本ページでは、EBSマルチアタッチについて取り上げます。

EBSに関する基本的な事項については、以下のページをご確認ください。

https://awstut.com/2021/12/04/attach-ebs-to-linux-ec2

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • インスタンス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の詳細につきましては、以下のページをご確認ください。

https://awstut.com/2021/12/01/ssm-session-manager-linux

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