3

Ich kann keine Methode zum Anhängen und Bereitstellen von Volumes mithilfe von Cloudforming finden.Anfügen und Bereitstellen von Volumes an eine EC2-Instanz mit CloudFormation

Ich kann ein Volume mit VolumeAttachment anhängen; Wenn ich jedoch lsblk mache, nachdem sich meine EC2-Instanz im aktiven Zustand befindet, sehe ich diese angehängten Instanzen als abgehängt.

Gibt es eine Möglichkeit, diese Instanz aus der Cloudformationsdatei bereitzustellen? Ich kann dies unter Verwendung von Linux-Befehlen mounten, aber es wäre viel besser, alles von der Cloud-Entwicklung zu handhaben. Hier

ist, was habe ich bisher:

"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" 
     } 
    } 

Und wenn ich lsblk auf der Instanz zu tun, das ist das Ergebnis sehe ich:

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

Hinweis obwohl ich Gerätenamen angegeben um 'sdh' zu sein, wird es als 'xvdh' angehängt. Warum das? Und wie Sie sehen können, ist das abgehängt. Wie montiere ich das?

Antwort

4

Wie helloV erwähnt müssen Sie es montieren, wenn die Instanz mit Userdata startet. Ich finde das neue YAML-Format für CloudFormation-Vorlagen viel einfacher, aber ich habe das Beispiel auch in JSON eingefügt.

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

Ich muss das Root-Volume erhöhen. Funktioniert das für das Root-Volume und erzeugt dies ein neues Dateisystem? – user1801879

+0

@NHoI ok, das hat mir eine Tonne geholfen. so danke. Eine Frage: Wird es ein Problem geben, wenn ich ein vorhandenes Dateisystem mounte? anstelle von/mnt/xvdh was ist, wenn ich (nur zum Beispiel)/usr auf dieser neuen Festplatte mount. – user1801879

+0

Nein, solange das vorhandene Dateisystem unter/usr benötigt wird. Sei dir darüber im Klaren, dass das mount alles unter deinem mount verstecken wird, es wird immer noch existieren, wenn du den Inhalt des ursprünglichen Ordners ummountest, wirst du zurückkehren. – NHol

3

Das Anhängen eines Volumes kann auf Hypervisor-Ebene erfolgen, daher können Sie ein Volume mit CF anhängen.

Die Installation eines Volumes erfolgt jedoch auf Betriebssystemebene, und CF hat keine Möglichkeit, dies zu tun. Es ist das gleiche wie fragen How can I create a directory in cloudformation after launching an instance?

Wie lösen Sie dieses Problem? CF hat die EC2Instance-Eigenschaft UserData. Sie liefern den Befehl zum Mounten des angehängten Volumes. Hier ist ein 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

ok danke! Ich werde es versuchen. – user1801879

Verwandte Themen