在 Amazon EC2 Windows 实例中自动挂载 EBS 卷

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/328965/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 11:40:45  来源:igfitidea点击:

Automount EBS volume in Amazon EC2 Windows Instance

windowsamazon-ec2cloudamazon-ebs

提问by defeated

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)?

有谁知道在 Amazon 的Elastic Compute Cloud(EC2) 中启动 Windows 2003 实例时如何自动挂载Elastic Block Storage(EBS) 卷?

采纳答案by jsw

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)
  • 确保 EBS 卷已格式化并标记(在示例中我使用了标签 PDRIVE)。
  • 使用 Ec2ConfigServiceSettings.exe 设置驱动器映射
  • 在实例上安装 Java
  • 安装 EC2 API 命令行工具
  • 安装您的证书和私钥的副本
  • 安装 curl.exe 的副本(开源工具)

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).aspxfor more information.

您可以使用组策略编辑器将此脚本设置为您的启动脚本。有关详细信息,请参阅http://technet.microsoft.com/en-us/library/cc739591(WS.10).aspx

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

回答by Chris Markle

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.

我在http://www.ioncannon.net/system-administration/199/automounting-amazon-ebs-volumes-on-ec2-instances/ 上找到了以下 Ruby 代码,由 Carson McDonald 提供。它适用于 Linux/Unix,但也许您可以在 Windows 2003 上为 Ruby 重新调整它,或者将其作为使用其他脚本语言执行此操作的模型。

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-datato get to the user-data.

请注意,您可以将内容作为用户数据传递到您的映像中,例如 ECS EBS 卷 ID 和设备名称(例如,以下示例中的 /dev/sdh 或 Windows 中适用于您的情况的任何内容)。您可以从实例本身访问用户数据作为元数据,如下面粗略地完成以获取实例 ID。更具体地说,您将访问http://169.254.169.254/1.0/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')