amazon-web-services - Terraform:如何告诉 Windows EC2 实例使用整个磁盘?(用户数据中的 PowerShell)
问题描述
我有一个 Windows 和一个 Linux AWS 实例,它们以几乎相同的方式启动:
resource "aws_instance" "test-instance" {
key_name = var.key_name
subnet_id = var.subnet_id
ami = data.aws_ami.image.id
instance_type = var.instance_type
security_groups = var.security_groups
associate_public_ip_address = "true"
disable_api_termination = "false"
monitoring = "false"
tags = {
Name = "test-instance-linux-${local.timestamp}"
}
root_block_device {
volume_size = var.root_volume_size
}
lifecycle {
ignore_changes = [
tags.Name
]
}
}
test-instance-linux-${local.timestamp}
对于 Linux 实例test-instance-windows-${local.timestamp}
对于 Windows 实例var.root_volume_size
等于'200'
(GiB)。
当我使用它时,我在 AWS 控制台中看到 Windows 和 Linux 两个实例都有一个 200 GiB 的卷作为 device /dev/sda1
。伟大的。
然而,虽然 Linux 实例使用了整个 200 GiB,但在 Windows 上我只有 30 GiB 可用,这很可能是Windows_Server-2019-English-Full-Base-...
我开始使用的原始 AMI 的大小(使用 Packer 自定义)。
如何告诉 Windows 实例使用整个磁盘?
已经试过了
我将此添加到resource "aws_instance" "test-instance"
:
user_data = file("userdata.txt")
这是在userdata.txt
:
<powershell>
# Variable specifying the drive you want to extend
$drive_letter = "C"
# Script to get the partition sizes and then resize the volume
$size = (Get-PartitionSupportedSize -DriveLetter $drive_letter)
Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax
</powershell>
(在https://docs.microsoft.com/en-us/windows-server/storage/disk-management/extend-a-basic-volume上找到 PowerShell 代码)
但是,实际可用磁盘空间为 ~7.7 GiB(共 30 个),而不是预期的 ~177.7 GiB。
磁盘信息:
PS C:\Users\foobar> Get-PartitionSupportedSize -DriveLetter "C"
SizeMin SizeMax
------- -------
23978442752 214746267648
PS C:\Users\foobar> Get-Disk
Number Friendly Name Serial Number HealthStatus OperationalStatus Total Size Partition
Style
------ ------------- ------------- ------------ ----------------- ---------- ----------
0 NVMe Amazon Elastic B vol004fab740dda0c847_00000001. Healthy Online 200 GB MBR
PS C:\Users\foobar> Get-Partition
DiskPath: \\?\scsi#disk&ven_nvme&prod_amazon_elastic_b#4&26a12046&0&000000#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
PartitionNumber DriveLetter Offset Size Type
--------------- ----------- ------ ---- ----
1 C 1048576 30 GB IFS
PS C:\Users\foobar> Get-Volume
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size
----------- ------------ -------------- --------- ------------ ----------------- ------------- ----
C NTFS Fixed Healthy OK 7.7 GB 30 GB
看起来好像 Terraform 没有运行 PowerShell 脚本?
当我通过 SSH 手动登录并手动运行 PowerShell 脚本时,它可以工作,所以我知道脚本本身是正确的。
PS C:\Users\ansible> Resize-Partition -DriveLetter 'C' -Size '214746267648'
PS C:\Users\ansible> Get-Partition
DiskPath: \\?\scsi#disk&ven_nvme&prod_amazon_elastic_b#4&26a12046&0&000000#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
PartitionNumber DriveLetter Offset Size Type
--------------- ----------- ------ ---- ----
1 C 1048576 200 GB IFS
PS C:\Users\foobar> Get-Volume
DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining Size
----------- ------------ -------------- --------- ------------ ----------------- ------------- ----
C NTFS Fixed Healthy OK 177.69 GB 200 GB
那么如何确保 Terraform 确实告诉 Windows 实例执行该 PowerShell 脚本呢?
解决方案
与其使用 PowerShell 脚本并在创建/启动后修改大小,不如自定义 AMI 并直接增加启动卷大小会更干净。
AWS 文档中解释了执行此操作的步骤,但归结为启动实例、进行必要的修改、创建快照并将其转换为新的 AMI。
推荐阅读
- sql-server - MS SQL -- 从第三个表添加另一个限制
- vue.js - v-bind:class 不使用数组变量
- sql-server - 如何在将数据添加到表中时动态插入日期?
- github - 什么是 GraphQL 查询以确定组织中是否存在 GitHub 包?
- servicestack - 是否可以在 Visual Studio 2017 或 2019 中使用 ServiceStack 模板?
- python - 改进 tensorflow 训练模型
- python - 从大流中选择一个随机元素有什么大不了的?
- javascript - 将 Json 数据映射到新的键值对 JavaScript 对象
- c++ - 如何使用 string::replace 方法写入文件?
- python - Match all identifiers in a string