我可以使用 AWS 命令行工具启动一个现货 EC2 实例。
aws ec2 request-spot-instances \
--spot-price 0.01 \
--instance-count 1 \
--launch-specification \
"{ \
\"ImageId\":\"ami-009d6802948d06e52\", \
\"InstanceType\":\"t2.small\", \
\"KeyName\":\"dec15a\", \
\"UserData\":\"`base64 -w 0 userdata.sh`\" \
}"
但是我该如何更改卷大小?我知道需要将以下代码添加到 launch-specification。但我不确定具体在哪里添加它。
"BlockDeviceMappings": [
{
"Ebs": {
"VolumeSize": 107374182400,
"VolumeType": "standard"
}
}
],
更新:
为什么使用这样的“文件”相同的命令不起作用?
# cat specification.json
{
"ImageId":"ami-009d6802948d06e52",
"InstanceType":"t2.small",
"KeyName":"dec15a",
"UserData":"`base64 -w 0 userdata.sh`",
"BlockDeviceMappings": [ {
"DeviceName":"/dev/xvda",
"Ebs": {
"VolumeSize": 100,
"VolumeType": "standard"
}
} ]
}
# aws ec2 request-spot-instances --spot-price "1.050" --instance-count 1 --type "one-time" --launch-specification file://specification.json
An error occurred (InvalidParameterValue) when calling the RequestSpotInstances operation: Invalid BASE64 encoding of user data
答案1
这BlockDeviceMappings
应该是 JSON 结构的一部分--launch-specification
:
aws ec2 request-spot-instances --spot-price 0.01 --instance-count 1 \
--launch-specification "{ \
\"ImageId\":\"ami-009d6802948d06e52\", \
\"InstanceType\":\"t2.small\", \
\"KeyName\":\"dec15a\", \
\"UserData\":\"`base64 -w 0 userdata.sh`\", \
\"BlockDeviceMappings\": [ { \
\"DeviceName\":\"/dev/xvda\", \ << DeviceName must be set
\"Ebs\": { \
\"VolumeSize\": 100, \ << VolumeSize is in GB
\"VolumeType\": \"gp2\" \ << gp2 = SSD -> much faster
} \
} ] \
}"
如果你想调整根卷将 设置DeviceName
为/dev/xvda
,如果您需要额外的磁盘,请将其设置为/dev/xvdf
。
还请注意- 您建议的 107374182400 将是相当大的容量!使用将其VolumeSize
设为100 GB。GB
"VolumeSize": 100
最后,我建议你使用"VolumeType": "gp2"
而不是"standard"
。虽然standard
稍微便宜一点,但它的速度要慢得多,因为它是磁盘,gp2
而 SSD 的速度要快得多。
希望有帮助:)
问题更新答案:如果将 JSON 保存到文件中,则必须包含 的输出base64 -w 0 userdata.sh
。它不会在运行时执行。因此,您需要类似以下内容:
# cat specification.json
{
"ImageId":"ami-009d6802948d06e52",
"InstanceType":"t2.small",
"KeyName":"dec15a",
"UserData":"Iy9iaW4vYmFzaAoKCg...", <<< Here paste the output of base64 -w0 userdata.sh as one long line
"BlockDeviceMappings": [ {
...
} ]
}