首页 > 解决方案 > 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
    ]
  }
}

当我使用它时,我在 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 脚本呢?

标签: amazon-web-servicespowershellterraform

解决方案


与其使用 PowerShell 脚本并在创建/启动后修改大小,不如自定义 AMI 并直接增加启动卷大小会更干净。

AWS 文档中解释了执行此操作的步骤,但归结为启动实例、进行必要的修改、创建快照并将其转换为新的 AMI。


推荐阅读