Automount EBS volume in Amazon EC2 Windows Instance

前端 未结 2 1381
逝去的感伤
逝去的感伤 2021-02-03 14:24

Does anyone know how to auto-mount an Elastic Block Storage (EBS) volume when starting a Windows 2003 instance in Amazon\'s Elastic Compute Cloud (EC2)?

相关标签:
2条回答
  • 2021-02-03 14:32

    Setup:

    • Make sure the EBS volume is formatted and labeled (in the example I used the label PDRIVE).
    • Setup a drive mapping using Ec2ConfigServiceSettings.exe
    • Install Java on the instance
    • Install the EC2 API command line tools
    • Install a copy of your cert and private key
    • Install a copy of curl.exe (open source tool)

    You can use the group policy editor to set this script as your startup script. See http://technet.microsoft.com/en-us/library/cc739591(WS.10).aspx for more information.

    REM @echo off
    REM setlocal ENABLEDELAYEDEXPANSION
    
    C:\WINDOWS\system32\eventcreate /l SYSTEM /t information /id 100 /so AttachEbsBoot /d "Starting attach-ebs-boot.cmd"
    
    REM local variables
    REM Make sure you include the directory with curl.exe and the EC2 command line tools in the path
    set path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\Utils;C:\ebin\ec2\bin
    set JAVA_HOME=c:\java
    set EC2_HOME=c:\ebin\ec2
    set EC2_CERT=<your_cert>
    set EC2_PRIVATE_KEY=<your_private_key>
    
    REM Please note: you should use the Ec2 Config Serive Settings application to ensure
    REM that your EBS volume is mapped to a particular drive letter.
    REM
    REM edit as needed
    set EBS_DRIVE=P:
    set EBS_DEVICE=xvdp
    
    REM Test to see if the drive is already attached. If it is then we're done.
    if exist %EBS_DRIVE%\nul (goto done)
    
    REM get the EBS volume ID from the user data and the instance ID from the meta-data
    for /f "delims=" %%a in ('curl http://169.254.169.254/latest/user-data') do (set EBS_VOLUME=%%a)
    for /f "delims=" %%b in ('curl http://169.254.169.254/latest/meta-data/instance-id') do (set INSTANCE_ID=%%b)
    
    C:\WINDOWS\system32\eventcreate /l SYSTEM /t information /id 102 /so AttachEbsBoot /d "Volume == %EBS_VOLUME%"
    C:\WINDOWS\system32\eventcreate /l SYSTEM /t information /id 103 /so AttachEbsBoot /d "Instance == %INSTANCE_ID%"
    
    REM attach the volume
    REM 
    REM Use a series of set command to build the command line
    SET COMMAND_LINE=%EBS_VOLUME%
    SET COMMAND_LINE=%COMMAND_LINE% -i
    SET COMMAND_LINE=%COMMAND_LINE% %INSTANCE_ID%
    SET COMMAND_LINE=%COMMAND_LINE% -d
    SET COMMAND_LINE=%COMMAND_LINE% %EBS_DEVICE%
    
    C:\WINDOWS\system32\eventcreate /l SYSTEM /t information /id 104 /so AttachEbsBoot /d "calling ec2attvole %COMMAND_LINE%"
    
    call ec2attvol.cmd %COMMAND_LINE%
    
    :DONE
    C:\WINDOWS\system32\eventcreate /l SYSTEM /t information /id 101 /so AttachEbsBoot /d "Exiting attach-ebs-boot.cmd"
    
    REM Events logged in the System event log
    REM source === AttachEbsBoot
    REM 
    REM Event 100 - Script start
    REM Event 101 - Script end
    REM Event 102 - Volume ID
    REM Event 103 - Instance ID
    REM Event 104 - Command line for ec2attvol
    
    0 讨论(0)
  • 2021-02-03 14:48

    I found the following Ruby code at http://www.ioncannon.net/system-administration/199/automounting-amazon-ebs-volumes-on-ec2-instances/ courtesy of Carson McDonald. It's for Linux/Unix but maybe you can re-swizzle this for Ruby on Windows 2003 or have it serve as a model for doing it in some other scripting language.

    Note that you could pass things into your image as user data such as the ECS EBS volume ID and the device name (e.g., /dev/sdh in the following example or whatever it would be in Windows for your case). You can access the user data from the instance itself as meta-data as is roughly done below to get the instance-id. More specifically, you'd access http://169.254.169.254/1.0/user-data to get to the user-data.

    #!/usr/bin/ruby
    
    require 'rubygems'
    require 'right_aws'
    require 'net/http'
    
    url = 'http://169.254.169.254/2008-02-01/meta-data/instance-id'
    instance_id = Net::HTTP.get_response(URI.parse(url)).body
    
    AMAZON_PUBLIC_KEY='your public key'
    AMAZON_PRIVATE_KEY='your private key'
    EC2_LOG_VOL='the volume id'
    
    ec2 = RightAws::Ec2.new(AMAZON_PUBLIC_KEY, AMAZON_PRIVATE_KEY)
    
    vol = ec2.attach_volume(EC2_LOG_VOL, instance_id, '/dev/sdh')
    puts vol
    
    # It can take a few seconds for the volume to become ready.
    # This is just to make sure it is ready before mounting it.
    sleep 20
    
    system('mount /dev/sdh /mymountpoint')
    
    0 讨论(0)
提交回复
热议问题