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」として添付されていることに注意してください。何故ですか?ご覧のとおり、これはマウント解除されています。これをマウントするにはどうすればよいですか?
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
ボリュームのアタッチはハイパーバイザーレベルで実行できるため、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"
]]}}
}
},