Edited at

CLIでEC2をローンチする際にエフェメラルディスクをつけない方法

More than 1 year has passed since last update.

Webコンソール以外でEC2をローンチする際にエフェメラルディスク(インスタンスストア)が付いてしまう仕様があるようです。

少なくともCLIとTerraformではこの現象が起きます。

この現象の解消方法は現在のところBlockDeviceMappingのエフェメラルディスクに片っ端からNoDeviceを指定する他ありません。

以下にCLIとTerraformでの例を記載します。


CLI

BlockDeviceMapping用のjsonファイルを以下のように記述します。


block_device_mappings.json

[

{
"DeviceName": "/dev/sda1",
"Ebs": {
"VolumeSize": 50,
"DeleteOnTermination": true,
"VolumeType": "gp2"
}
},
{"DeviceName": "xvdca", "NoDevice": ""},
{"DeviceName": "xvdcb", "NoDevice": ""},
{"DeviceName": "xvdcc", "NoDevice": ""},
{"DeviceName": "xvdcd", "NoDevice": ""},
{"DeviceName": "xvdce", "NoDevice": ""},
{"DeviceName": "xvdcf", "NoDevice": ""},
{"DeviceName": "xvdcg", "NoDevice": ""},
{"DeviceName": "xvdch", "NoDevice": ""},
{"DeviceName": "xvdci", "NoDevice": ""},
{"DeviceName": "xvdcj", "NoDevice": ""},
{"DeviceName": "xvdck", "NoDevice": ""},
{"DeviceName": "xvdcl", "NoDevice": ""},
{"DeviceName": "xvdcm", "NoDevice": ""},
{"DeviceName": "xvdcn", "NoDevice": ""},
{"DeviceName": "xvdco", "NoDevice": ""},
{"DeviceName": "xvdcp", "NoDevice": ""},
{"DeviceName": "xvdcq", "NoDevice": ""},
{"DeviceName": "xvdcr", "NoDevice": ""},
{"DeviceName": "xvdcs", "NoDevice": ""},
{"DeviceName": "xvdct", "NoDevice": ""},
{"DeviceName": "xvdcu", "NoDevice": ""},
{"DeviceName": "xvdcv", "NoDevice": ""},
{"DeviceName": "xvdcw", "NoDevice": ""},
{"DeviceName": "xvdcx", "NoDevice": ""},
{"DeviceName": "xvdcy", "NoDevice": ""},
{"DeviceName": "xvdcz", "NoDevice": ""}
]

そして、以下のようにCLIを実行します。


ec2_run-instances.sh

aws ec2 run-instances \

--image-id ami-12345678 \
--key-name example \
--instance-type c3.large \
--subnet-id subnet-12345678 \
--iam-instance-profile Arn=arn:aws:iam::123456789123:role/example-role \
--security-group-ids sg-12345678 \
--block-device-mappings file://block_device_mappings.json \
--desable-api-termination


Terraform

TerraformもVer0.8からNoDeviceをサポートしています。

tfファイルには以下のように記述します。


aws_instance.tf

resource "aws_instance" "example-instance" {

ami = "ami-12345678"
instance_type = "c3.large"
key_name = "example"
subnet_id = "${aws_subnet.example.id}"
security_groups = ["${aws_security_group.example.id}"]
disable_api_termination = true
tags {
Name = "example-instance"
}
iam_instance_profile = "example-role"
root_block_device {
volume_type = "gp2"
volume_size = 50
}
ephemeral_block_device { device_name = "xvdca" no_device = "true" }
ephemeral_block_device { device_name = "xvdcb" no_device = "true" }
ephemeral_block_device { device_name = "xvdcc" no_device = "true" }
ephemeral_block_device { device_name = "xvdcd" no_device = "true" }
ephemeral_block_device { device_name = "xvdce" no_device = "true" }
ephemeral_block_device { device_name = "xvdcf" no_device = "true" }
ephemeral_block_device { device_name = "xvdcg" no_device = "true" }
ephemeral_block_device { device_name = "xvdch" no_device = "true" }
ephemeral_block_device { device_name = "xvdci" no_device = "true" }
ephemeral_block_device { device_name = "xvdcj" no_device = "true" }
ephemeral_block_device { device_name = "xvdck" no_device = "true" }
ephemeral_block_device { device_name = "xvdcl" no_device = "true" }
ephemeral_block_device { device_name = "xvdcm" no_device = "true" }
ephemeral_block_device { device_name = "xvdcn" no_device = "true" }
ephemeral_block_device { device_name = "xvdco" no_device = "true" }
ephemeral_block_device { device_name = "xvdcp" no_device = "true" }
ephemeral_block_device { device_name = "xvdcq" no_device = "true" }
ephemeral_block_device { device_name = "xvdcr" no_device = "true" }
ephemeral_block_device { device_name = "xvdcs" no_device = "true" }
ephemeral_block_device { device_name = "xvdct" no_device = "true" }
ephemeral_block_device { device_name = "xvdcu" no_device = "true" }
ephemeral_block_device { device_name = "xvdcv" no_device = "true" }
ephemeral_block_device { device_name = "xvdcw" no_device = "true" }
ephemeral_block_device { device_name = "xvdcx" no_device = "true" }
ephemeral_block_device { device_name = "xvdcy" no_device = "true" }
ephemeral_block_device { device_name = "xvdcz" no_device = "true" }
}


まとめ

書式としてはあまりスマートとは言えませんが、現状はこうするしかないようです。

SDKでは検証していませんが、おそらく同じかと思います。

もっとよい書き方があったら教えてください。