web-dev-qa-db-ja.com

CloudFormationを使用してボリュームをEC2インスタンスにアタッチおよびマウントする方法

Cloudformationを使用してボリュームをアタッチおよびマウントする方法が見つかりません。

VolumeAttachmentを使用してボリュームをアタッチできます。ただし、EC2インスタンスが実行状態になった後でlsblkを実行すると、このアタッチされたインスタンスがアンマウントされているように見えます。

Cloudformationファイルからこのインスタンスをマウントする方法はありますか? Linuxコマンドを使用してこれをマウントできますが、代わりにcloudformationからすべてを処理する方がはるかに優れています。

これが私がこれまでにしたことです:

"MyEc2Instance" : {
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
      "KeyName" : { "Ref" : "KeyName" }
   }
},
    "MyVolume" : {
      "Type" : "AWS::EC2::Volume",
      "Properties" : {
        "Size" : "50",
        "AvailabilityZone" : "xyz"
      }
    },
    "attachment" : {
      "Type" : "AWS::EC2::VolumeAttachment",
      "Properties" : {
        "InstanceId" : { "Ref" : "MyEc2Instance" },
        "VolumeId"  : { "Ref" : "MyVolume" },
        "Device" : "/dev/sdh"
      }
    }

そして、インスタンスでlsblkを実行すると、次の結果が表示されます。

xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdh    202:112  0  50G  0 disk

デバイス名を「sdh」に指定したにもかかわらず、「xvdh」として添付されていることに注意してください。何故ですか?ご覧のとおり、これはマウント解除されています。これをマウントするにはどうすればよいですか?

9
user1801879

HelloVで述べたように、UserDataを使用してインスタンスを起動するときにマウントする必要があります。 CloudFormationテンプレートの新しいYAML形式の方がはるかに簡単だと思いますが、例もJSONに入れました。

JSON:

"UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
    "#!/bin/bash -xe\n",
    "# create mount point directory\n",
    "mkdir /mnt/xvdh\n",
    "# create ext4 filesystem on new volume\n",    
    "mkfs -t ext4 /dev/xvdh\n",
    "# add an entry to fstab to mount volume during boot\n",
    "echo \"/dev/xvdh       /mnt/xvdh   ext4    defaults,nofail 0       2\" >> /etc/fstab\n",
    "# mount the volume on current boot\n",
    "mount -a\n"
]]}}

YAML:

UserData:
    'Fn::Base64': !Sub
      - |
        #!/bin/bash -xe
        # create mount point directory
        mkdir /mnt/xvdh
        # create ext4 filesystem on new volume           
        mkfs -t ext4 /dev/xvdh
        # add an entry to fstab to mount volume during boot
        echo "/dev/xvdh       /mnt/xvdh   ext4    defaults,nofail 0       2" >> /etc/fstab
        # mount the volume on current boot
        mount -a
12
NHol

ボリュームのアタッチはハイパーバイザーレベルで実行できるため、CFを使用してボリュームをアタッチできます。

ただし、ボリュームのマウントはOSレベルで行われ、CFにはそれを認識/実行する方法がありません。 How can I create a directory in cloudformation after launching an instance?に尋ねるのと同じです

この問題をどのように解決しますか? CFには serData というEC2Instanceプロパティがあります。接続されたボリュームをマウントするコマンドを指定します。これが1つです

{
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
        ....
        "InstanceType"   : { "Ref" : "InstanceType" },
        "KeyName"        : { "Ref" : "KeyName" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
             "#!/bin/bash -xe\n",
             "yum install -y aws-cfn-bootstrap\n",

             "# Install the files and packages from the metadata\n",
             "/opt/aws/bin/cfn-init -v ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource WebServerInstance ",
             "         --configsets Install ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n"
        ]]}}
      }
    },
2
helloV