我已经为基本服务器映像创建了一个AMI,我希望在必要时部署它。此基本映像具有3个必需的磁盘,这些磁盘将成为任何其他服务器构建的一部分。但是,额外的存储要求将根据创建时的实例而有所不同。我可以毫无问题地创建和附加这个额外的存储,但我不能指定我希望在EC2实例终止时删除这些卷,并且它们当前设置为false。
$NewInstance = New-EC2Image -ImageID ami-image -InstanceType t2.medium ...
$NewInstanceID = $NewInstance.Instances[0].Id;
$NewVolume = New-EC2Volume -Size 200 -AvailabilityZone "my-fave-az" -VolumeType "gp2";
Add-EC2Volume -InstanceId $NewInstanceID -VolumeId $NewVolume.VolumeId -Device "xvdj";
这一切都运作良好,但我无法弄清楚如何在
中设置DeleteOnTerminationa)上面的创建脚本
b)使用Edit-EC2InstanceAttribute
,因为该属性隐藏在deviceMappings.Ebs.DeleteOnTermination中,我无法弄清楚如何使用此命令行开关访问该属性。
答案 0 :(得分:2)
在尝试了几种不同的模式之后,我只需要在-BlockDeviceMapping
的{{1}}参数中添加一个Hashtables数组。
我尝试过几种不同的方法,比如创建一个BlockDeviceMapping对象数组
New-EC2Instance
但这不起作用。
最终工作的是这个
$DeviceMappings = @();
$charmap=100;
foreach($Disk in $Disks)
{
$volume = New-Object Amazon.EC2.Model.EbsBlockDevice;
$volume.VolumeSize = $Disk.Size;
$volume.VolumeType = "gp2";
$volume.DeleteOnTermination = $true;
$DeviceMapping = new-object Amazon.EC2.Model.BlockDeviceMapping;
$DeviceMapping.DeviceName = "xvd$([char]$charmap)";
$DeviceMapping.Ebs = $volume;
$charmap++;
}
答案 1 :(得分:0)
@swascheck答案为该问题提供了很好的线索,但是我想在上面打个蝴蝶结,以防其他人正在寻找打包的答案。
我们用它来创建实例。
$drives = @()
$eDrive = @{
DeviceName = 'xvdf'
Ebs = @{
VolumeSize = 4
DeleteOnTermination = 'true'
VolumeType = 'gp2'
}
}
$fDrive = @{
DeviceName = 'xvdg'
Ebs = @{
VolumeSize = 2
DeleteOnTermination = 'true'
VolumeType = 'gp2'
}
}
$drives += $eDrive
$drives += $fDrive
$instances = New-EC2Instance ... -BlockDeviceMapping $drives
-BlockDeviceMapping参数将导致使用实例创建两个附加的EC2Volumes并将其附加。那时它们还不完整。因此,我们在VM的内部使用它来准备使用它们。
Get-Disk -Number 1 | Initialize-Disk -PassThru | New-Partition -DriveLetter 'E' -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel 'EDrive' -Confirm:$false
Get-Disk -Number 2 | Initialize-Disk -PassThru | New-Partition -DriveLetter 'F' -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel 'FDrive' -Confirm:$false