Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I have a batch file that I'd like to run on startup of an EC2 Windows AMI. The program I'd like to run from that batch file takes the instance-id of the EC2 machine as a parameter. What is the simplest way to get that Instance ID passed as an argument to that program?

From Amazon's Documentation on the subject, I see that you're supposed to issue a WGET to a specified URL and parse the response. So an alternate way of phrasing this question might be "How do I pass the contents of a HTTP request to a program as an argument in a Windows batch file"

In pseudocode, this is what I'd like to do:

set ID = GET http://169.254.169.254/2008-08-08/meta-data/instance-id
myprogram.exe /instanceID=%ID%

Any suggestions on how I might proceed?

share|improve this question
add comment

5 Answers

Alternative: maybe you could do this using PowerShell on Amazon's EC2. Here are some links to start:

share|improve this answer
    
Alternatives are always good. Thanks for that! –  Jason Kester Jun 2 '09 at 13:54
add comment

Powershell would be the easiest way to do this:

$webclient = new-object System.Net.WebClient
$myip = $webclient.DownloadString("http://169.254.169.254/latest/meta-data/local-ipv4")
myprogram.exe /instanceID=$myip

share|improve this answer
add comment

wget doesn't have an option to output the contents of the downloaded file to screen (or at least the version I have here doesn't), so you have to use a temporary file anyway. What you can do then is the following:

wget -O "instance-id" "http://169.254.169.254/2008-08-08/meta-data/instance-id"
set /p ID=< instance-id

set /p usually prompts for something and we just redirect the file's contents here. This assumes that the instance ID is the only thing that's in that file. You can have a little more fun with parsing text when using for /f but for a simple "put the first line of that file into a variable" set /p suffices.

share|improve this answer
    
Does wget -O - http://... not output the file to standard out? –  David North Dec 19 '09 at 10:00
    
Ah, drat. Wasn't written into wget --help but it works, yes. Sorry. –  Joey Jan 5 '10 at 19:00
add comment
$wc = New-Object System.Net.WebClient;
$instanceIdResult = $wc.DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
Write-Host $instanceIdResult
share|improve this answer
1  
How is this any different from the other answer using a WebClient and DownloadString?? –  Chris S Apr 30 '13 at 5:28
add comment

PowerShell 3.0 and Invoke-WebRequest:

PS> $instanceId = Invoke-WebRequest -Uri http://169.254.169.254/latest/meta-data/instance-id

Or if you need to survive in batch, us a win32 binary of curl.

Or based on your use-case, you could use CloudFormation to get the Instance-Id during the API call and pass it to cf-init for a bootstrap action for your application deployment.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.