You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过cfn-init与PowerShell在Windows实例启动时挂载已有EBS盘

Windows实例启动时自动挂载已有EBS磁盘(cfn-init + PowerShell)

以下是通过CloudFormation的cfn-init工具配合PowerShell脚本,实现Windows实例启动时自动挂载已有EBS磁盘的具体方案:

1. 在CloudFormation模板中集成cfn-init

确保你的EC2实例资源配置包含AWS::CloudFormation::Init元数据,并在UserData中触发cfn-init执行。模板片段示例:

Resources:
  MyWindowsEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0abc1234def567890 # 替换为你的Windows AMI ID
      InstanceType: t2.small
      # 附加已有EBS卷
      BlockDeviceMappings:
        - DeviceName: "/dev/sda1"
          Ebs:
            VolumeSize: 30
        - DeviceName: "/dev/sdf" # 对应Windows中的磁盘编号(通常是Disk 1)
          Ebs:
            VolumeId: vol-0123456789abcdef0 # 替换为你的已有EBS卷ID
      # UserData触发cfn-init
      UserData:
        Fn::Base64: !Sub |
          <script>
            cfn-init.exe -v -s ${AWS::StackName} -r MyWindowsEC2Instance --region ${AWS::Region}
          </script>
      # 定义cfn-init配置
      Metadata:
        AWS::CloudFormation::Init:
          configSets:
            default: [mountEBSVolume]
          mountEBSVolume:
            # 上传PowerShell脚本到实例
            files:
              c:/cfn/scripts/MountEBS.ps1:
                content: |
                  # 以下是PowerShell挂载脚本内容(见下文)
                encoding: utf-8
            # 执行挂载脚本
            commands:
              01_run_mount_script:
                command: powershell.exe -ExecutionPolicy Bypass -File c:/cfn/scripts/MountEBS.ps1
                waitAfterCompletion: 0

2. PowerShell挂载脚本实现

将以下脚本内容填入上述模板的content字段中,脚本会自动识别未初始化的EBS磁盘,完成初始化、分区、格式化并挂载:

# 筛选未初始化的RAW磁盘(排除系统盘,系统盘通常是Disk 0)
$targetDisk = Get-Disk | Where-Object { 
    $_.PartitionStyle -eq 'RAW' -and $_.Number -ne 0 
}

if ($targetDisk) {
    # 初始化磁盘为GPT格式(如需MBR,替换为MBR)
    $partition = Initialize-Disk -Number $targetDisk.Number -PartitionStyle GPT -PassThru |
                 New-Partition -AssignDriveLetter -UseMaximumSize
    
    # 格式化为NTFS,设置卷标
    Format-Volume -InputObject $partition -FileSystem NTFS -NewFileSystemLabel "AttachedEBS" -Confirm:$false -Force

    Write-Host "EBS卷已成功挂载,驱动器号: $($partition.DriveLetter):"
}
else {
    # 检查是否已挂载目标卷
    $existingVolume = Get-Volume | Where-Object { $_.FileSystemLabel -eq "AttachedEBS" }
    if ($existingVolume) {
        Write-Host "EBS卷已存在,当前驱动器号: $($existingVolume.DriveLetter):"
    }
    else {
        Write-Host "未找到目标EBS磁盘,请检查BlockDeviceMappings配置"
    }
}

3. 核心注意事项

  • 设备名映射:Windows中/dev/sdf通常对应Disk 1,如果你的EBS卷设备名不同,需要调整脚本中的磁盘筛选逻辑
  • 权限:cfn-init以系统权限执行脚本,无需额外授权
  • 已有格式化卷:如果EBS卷已格式化,脚本会跳过初始化步骤,直接检查是否已挂载
  • 验证:实例启动后可通过Disk Management或Get-Volume命令确认挂载状态

内容的提问来源于stack exchange,提问作者Rajuram3452

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:55:18