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?
PowerShell 3.0 and Invoke-WebRequest:
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.
Alternative: maybe you could do this using PowerShell on Amazon's EC2. Here are some links to start:
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
So I found another way of doing this:
It seems a lot cleaner and result contains just what you expect "Instance ID"
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: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 usingfor /f
but for a simple "put the first line of that file into a variable"set /p
suffices.