3

Я не могу найти способ подключения и монтирования томов с использованием cloudformation.Как подключать и монтировать тома в экземпляр EC2 с помощью CloudFormation

Я могу прикрепить громкость с помощью VolumeAttachment; однако, когда я делаю lsblk после того, как мой экземпляр EC2 находится в запущенном состоянии, я вижу, что эти прикрепленные экземпляры были размонтированы.

Есть ли способ установить этот экземпляр из файла 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'. Почему это? И как вы видите, это размонтировано. Как смонтировать это?

ответ

4

Как упомянуто helloV вам нужно будет установить его, когда экземпляр запускается с помощью UserData. Я считаю, что новый формат YAML для шаблонов CloudFormation намного проще, но я также привел пример в 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 
+0

Мне нужно увеличить объем корня. Будет ли это работать на корневой том, а также на создание новой файловой системы? – user1801879

+0

@NHoI хорошо, это помогло мне тонну. так что спасибо. Один вопрос: будет ли какая-либо проблема, если я смонтирую существующую файловую систему? вместо создания/mnt/xvdh, если я монтирую (например,)/usr на этом новом диске. – user1801879

+0

Нет, если существующая файловая система имеет то, что вам нужно в/usr. Имейте в виду, что гора будет скрывать все под вашим монтированием, она все равно будет существовать, поэтому, если вы вернете исходное содержимое папки, она вернется. – NHol

3

Прикрепление тома можно выполнить на уровне гипервизора, поэтому вы можете прикрепить громкость с помощью CF.

Но установка тома на уровне ОС, и CF не имеет возможности узнать/сделать это. Это то же самое, что и запрос How can I create a directory in cloudformation after launching an instance?

Как вы решаете эту проблему? CF имеет свойство EC2Instance, называемое UserData. Вы поставляете команду для монтирования подключенного тома. Вот один example

{ 
    "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" 
     ]]}} 
     } 
    }, 
+0

ок спасибо! Я попробую это. – user1801879