website/index.html in amazon-ec2-0.2.4 vs website/index.html in amazon-ec2-0.2.5

- old
+ new

@@ -30,12 +30,12 @@ <body> <div id="main"> <h1>Amazon Web Services EC2 Ruby Gem</h1> <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/amazon-ec2"; return false'> - Get Version - <a href="http://rubyforge.org/projects/amazon-ec2" class="numbers">0.2.4</a> + <p>Get Version</p> + <a href="http://rubyforge.org/projects/amazon-ec2" class="numbers">0.2.5</a> </div> <h2>&#x2192; &#8216;amazon-ec2&#8217;</h2> <h2>About</h2> @@ -172,14 +172,14 @@ <h3>Installing the gem</h3> - <p>Linux / <span class="caps">OS X</span> : <pre syntax="ruby">sudo gem install amazon-ec2 --include-dependencies</pre></p> + <p>Linux / <span class="caps">OS X</span> : <pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">amazon</span><span class="punct">-</span><span class="ident">ec2</span> <span class="punct">--</span><span class="ident">include</span><span class="punct">-</span><span class="ident">dependencies</span></pre></p> - <p>Microsoft Windows : <pre syntax="ruby">gem install amazon-ec2 --include-dependencies</pre></p> + <p>Microsoft Windows : <pre class='syntax'><span class="ident">gem</span> <span class="ident">install</span> <span class="ident">amazon</span><span class="punct">-</span><span class="ident">ec2</span> <span class="punct">--</span><span class="ident">include</span><span class="punct">-</span><span class="ident">dependencies</span></pre></p> <h2>Using the library</h2> @@ -198,41 +198,43 @@ <p>Edit the file ~/.bash_login and add the following to the existing contents:</p> -<pre syntax="ruby"> + <p><pre class='syntax'> -export RUBYOPT="rubygems" +<span class="ident">export</span> <span class="constant">RUBYOPT</span><span class="punct">=&quot;</span><span class="string">rubygems</span><span class="punct">&quot;</span> -# For amazon-ec2 and amazon s3 ruby gems -export AMAZON_ACCESS_KEY_ID="YOUR_ACCESS_KEY_ID" -export AMAZON_SECRET_ACCESS_KEY="YOUR_SECRET_ACCESS_KEY_ID" +<span class="comment"># For amazon-ec2 and amazon s3 ruby gems</span> +<span class="ident">export</span> <span class="constant">AMAZON_ACCESS_KEY_ID</span><span class="punct">=&quot;</span><span class="string">YOUR_ACCESS_KEY_ID</span><span class="punct">&quot;</span> +<span class="ident">export</span> <span class="constant">AMAZON_SECRET_ACCESS_KEY</span><span class="punct">=&quot;</span><span class="string">YOUR_SECRET_ACCESS_KEY_ID</span><span class="punct">&quot;</span> -</pre> +</pre></p> + <p>Once you save the file you should close and re-open your command terminal so the new variables are made available. You&#8217;ll need to do this close/re-open step for each terminal window you have open (or issue the &#8216;source ~/.bash_login&#8217; command in each). Make sure that this file is only readable by your user so you don&#8217;t inadvertantly expose your credentials to other users on your system.</p> <p>You can verify that this setup is complete by running the &#8216;set&#8217; in a command window and seeing that your credentials are in the list of shell variables.</p> <h3>The basics&#8230;</h3> - <p>The library exposes one main interface module <pre syntax="ruby">EC2::Base</pre></p> + <p>The library exposes one main interface module <pre class='syntax'><span class="constant">EC2</span><span class="punct">::</span><span class="constant">Base</span></pre></p> <p>This method requires arguments which include your <span class="caps">AWS</span> credentials and it will return an object that you can use to make method calls directly against <span class="caps">EC2</span>. All the operations for using the <span class="caps">EC2</span> service, including query string header signing, are handled automatically for you. The connection string will look something like this:</p> -<pre syntax="ruby"> -@ec2 = EC2::Base.new(:access_key_id =&gt; ACCESS_KEY_ID, :secret_access_key =&gt; SECRET_ACCESS_KEY) -</pre> + <p><pre class='syntax'> +<span class="attribute">@ec2</span> <span class="punct">=</span> <span class="constant">EC2</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="symbol">:access_key_id</span> <span class="punct">=&gt;</span> <span class="constant">ACCESS_KEY_ID</span><span class="punct">,</span> <span class="symbol">:secret_access_key</span> <span class="punct">=&gt;</span> <span class="constant">SECRET_ACCESS_KEY</span><span class="punct">)</span> +</pre></p> + <p>We have tried to keep the public methods on &#8216;amazon-ec2&#8217; as close as possible to the <span class="caps">AWS EC2</span> Query <span class="caps">API</span>. This similarity allows you to reference the Query <span class="caps">API</span> Reference in the <a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=84"><span class="caps">EC2</span> Developer Guide</a> and be able to get started right away. In most cases the methods names only differ in how they are presented. e.g. &#8216;DescribeImages&#8217; becomes &#8217;#describe_images() in Ruby. Feel free to browse the full <a href="http://amazon-ec2.rubyforge.org/rdoc/">RDoc documentation</a> for all classes and methods of &#8216;amazon-ec2&#8217; if you want more details.</p> @@ -247,12 +249,13 @@ <p>An example Ruby script which exercises the library a bit more is installed for you to check out when you install this gem. You can run this script to verify that everything is setup and working correctly in your environment. Consult the file which is installed at :</p> -<pre syntax="ruby">[your amazon-ec2 gem dir]/examples/ec2-example.rb</pre> + <p><pre class='syntax'><span class="punct">[</span><span class="ident">your</span> <span class="ident">amazon</span><span class="punct">-</span><span class="ident">ec2</span> <span class="ident">gem</span> <span class="ident">dir</span><span class="punct">]/</span><span class="ident">examples</span><span class="punct">/</span><span class="ident">ec2</span><span class="punct">-</span><span class="ident">example</span><span class="punct">.</span><span class="ident">rb</span></pre></p> + <p>Since we also package this sample file in the gem&#8217;s bin/ dir you should also be able to run it from anywhere on your shell path (once you have set your environment variables as described above).</p> <h4>Using the &#8216;ec2sh&#8217; command shell</h4> @@ -261,154 +264,159 @@ <p>If your not in front of a terminal shell now (perhaps you&#8217;re browsing this site on your iPhone) this is what you would see:</p> -<pre syntax="ruby"> + <p><pre class='syntax'> -hostname:/tmp/rails/amazon_test glenn$ ec2sh - - 'ec2sh' usage : - This is an interactive 'irb' command shell that allows you to use all - commands available to the amazon-ec2 gem. You'll find this to be a +<span class="ident">hostname</span><span class="punct">:/</span><span class="regex">tmp</span><span class="punct">/</span><span class="ident">rails</span><span class="punct">/</span><span class="ident">amazon_test</span> <span class="ident">glenn</span><span class="global">$ </span><span class="ident">ec2sh</span> + + <span class="punct">'</span><span class="string">ec2sh</span><span class="punct">'</span> <span class="ident">usage</span> <span class="punct">:</span> + <span class="constant">This</span> <span class="ident">is</span> <span class="ident">an</span> <span class="ident">interactive</span> <span class="punct">'</span><span class="string">irb</span><span class="punct">'</span> <span class="ident">command</span> <span class="ident">shell</span> <span class="ident">that</span> <span class="ident">allows</span> <span class="ident">you</span> <span class="ident">to</span> <span class="ident">use</span> <span class="ident">all</span> + <span class="ident">commands</span> <span class="ident">available</span> <span class="ident">to</span> <span class="ident">the</span> <span class="ident">amazon</span><span class="punct">-</span><span class="ident">ec2</span> <span class="ident">gem</span><span class="punct">.</span> <span class="ident">You</span><span class="punct">'</span><span class="string">ll find this to be a great tool to help you debug issues and practice running commands against the live EC2 servers prior to putting them in your code. - - The EC2 connection is wired to the class instance '@ec2'. Make method calls + + The EC2 connection is wired to the class instance </span><span class="punct">'</span><span class="attribute">@ec2</span><span class="punct">'</span><span class="string">. Make method calls on this to execute commands on EC2. Adding a #to_s at the end of any command should give you a full String representation of the response. The #xml data is available for each response which allows you to view the full and complete XML response returned by EC2 without any parsing applied. This is useful for viewing the hierarchy of an entire response in a friendly way (if XML is friendly to you!). Understanding the hierarchy of the XML response is critical to making effective use of this library. - + Examples to try: - + returns : all ec2 public methods &gt;&gt; @ec2.methods.sort - + returns : a string representation of ALL images &gt;&gt; @ec2.describe_images.to_s - + returns : an Array of EC2::Response objects, each an EC2 image and its data &gt;&gt; @ec2.describe_images.imagesSet.item &gt;&gt; @ec2.describe_images.imagesSet.item[0] (an OpenStruct of a single item in that array) &gt;&gt; @ec2.describe_images.imagesSet.item[0].to_s (a String representation of that OpenStruct item) - + returns : an XML representation of all images &gt;&gt; puts @ec2.describe_images.xml - + returns : an XML representation of all images owned by Amazon - &gt;&gt; puts @ec2.describe_images(:owner_id =&gt; 'amazon').xml - + &gt;&gt; puts @ec2.describe_images(:owner_id =&gt; </span><span class="punct">'</span><span class="ident">amazon</span><span class="punct">'</span><span class="string">).xml + &gt;&gt; @ec2.describe_images.imagesSet.item[0].to_s -=&gt; "#&lt;EC2::Response:0x100A465B4 imageId=\"ami-018e6b68\" imageLocation=\"rbuilder-online/phonehome-1.5.6-x86_10132.img.manifest.xml\" imageOwnerId=\"099034111737\" imageState=\"available\" isPublic=\"true\" parent=#&lt;EC2::Response:0x100A469A6 ...&gt;&gt;" +=&gt; &quot;#&lt;EC2::Response:0x100A465B4 imageId=\&quot;ami-018e6b68\&quot; imageLocation=\&quot;rbuilder-online/phonehome-1.5.6-x86_10132.img.manifest.xml\&quot; imageOwnerId=\&quot;099034111737\&quot; imageState=\&quot;available\&quot; isPublic=\&quot;true\&quot; parent=#&lt;EC2::Response:0x100A469A6 ...&gt;&gt;&quot; +<span class="normal"> +</span></span></pre></p> -</pre> <h4>Using &#8216;amazon-ec2&#8217; in Ruby scripts</h4> <p>Try out the following bit of code. This should walk through each image returned by a call to #describe_images and print out its key data. Note in the example below that you cannot walk through the results of the #describe_images call with the &#8217;.each&#8217; iterator (You&#8217;ll get errors if you try). You need to instead walk through the Array of items which are in the &#8216;imagesSet&#8217; embedded in the response. This reflects exactly the <span class="caps">XML</span> hierarchy of data returned from <span class="caps">EC2</span> which we parse to Ruby OpenStruct objects (EC2::Response).</p> -<pre syntax="ruby"> -#!/usr/bin/env ruby + <p><pre class='syntax'> +<span class="comment">#!/usr/bin/env ruby</span> -require 'rubygems' -require 'ec2' +<span class="ident">require</span> <span class="punct">'</span><span class="string">rubygems</span><span class="punct">'</span> +<span class="ident">require</span> <span class="punct">'</span><span class="string">ec2</span><span class="punct">'</span> -ACCESS_KEY_ID = '--YOUR AWS ACCESS KEY ID--' -SECRET_ACCESS_KEY = '--YOUR AWS SECRET ACCESS KEY--' +<span class="constant">ACCESS_KEY_ID</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">--YOUR AWS ACCESS KEY ID--</span><span class="punct">'</span> +<span class="constant">SECRET_ACCESS_KEY</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">--YOUR AWS SECRET ACCESS KEY--</span><span class="punct">'</span> + +<span class="ident">ec2</span> <span class="punct">=</span> <span class="constant">EC2</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="symbol">:access_key_id</span> <span class="punct">=&gt;</span> <span class="constant">ACCESS_KEY_ID</span><span class="punct">,</span> <span class="symbol">:secret_access_key</span> <span class="punct">=&gt;</span> <span class="constant">SECRET_ACCESS_KEY</span><span class="punct">)</span> + +<span class="ident">puts</span> <span class="punct">&quot;</span><span class="string">----- listing images owned by 'amazon' -----</span><span class="punct">&quot;</span> +<span class="ident">ec2</span><span class="punct">.</span><span class="ident">describe_images</span><span class="punct">(</span><span class="symbol">:owner_id</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">amazon</span><span class="punct">&quot;).</span><span class="ident">imagesSet</span><span class="punct">.</span><span class="ident">item</span><span class="punct">.</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">image</span><span class="punct">|</span> + <span class="comment"># OpenStruct objects have members!</span> + <span class="ident">image</span><span class="punct">.</span><span class="ident">members</span><span class="punct">.</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">member</span><span class="punct">|</span> + <span class="ident">puts</span> <span class="punct">&quot;</span><span class="string"><span class="expr">#{member}</span> =&gt; <span class="expr">#{image[member]}</span></span><span class="punct">&quot;</span> + <span class="keyword">end</span> +<span class="keyword">end</span> +</pre></p> -ec2 = EC2::Base.new(:access_key_id =&gt; ACCESS_KEY_ID, :secret_access_key =&gt; SECRET_ACCESS_KEY) -puts "----- listing images owned by 'amazon' -----" -ec2.describe_images(:owner_id =&gt; "amazon").imagesSet.item.each do |image| - # OpenStruct objects have members! - image.members.each do |member| - puts "#{member} =&gt; #{image[member]}" - end -end -</pre> - <h4>Using &#8216;amazon-ec2&#8217; in Ruby on Rails applications</h4> <p>in config/environment.rb:</p> -<pre syntax="ruby"> -# Require the amazon-ec2 gem and make its methods available in your Rails app -# Put this at the bottom of your environment.rb -require 'EC2' -</pre> + <p><pre class='syntax'> +<span class="comment"># Require the amazon-ec2 gem and make its methods available in your Rails app</span> +<span class="comment"># Put this at the bottom of your environment.rb</span> +<span class="ident">require</span> <span class="punct">'</span><span class="string">EC2</span><span class="punct">'</span> +</pre></p> -in app/controllers/your_controller.rb: -<pre syntax="ruby"> -[some controller code ...] + <p>in app/controllers/your_controller.rb: +<pre class='syntax'> -ec2 = EC2::Base.new(:access_key_id =&gt; "YOUR_AWS_ACCESS_KEY_ID", :secret_access_key =&gt; "YOUR_AWS_SECRET_ACCESS_KEY") +<span class="punct">[</span><span class="ident">some</span> <span class="ident">controller</span> <span class="ident">code</span> <span class="punct">...]</span> -# get ALL public images -@ec2_images = ec2.describe_images().imagesSet.item +<span class="ident">ec2</span> <span class="punct">=</span> <span class="constant">EC2</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">new</span><span class="punct">(</span><span class="symbol">:access_key_id</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">YOUR_AWS_ACCESS_KEY_ID</span><span class="punct">&quot;,</span> <span class="symbol">:secret_access_key</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">YOUR_AWS_SECRET_ACCESS_KEY</span><span class="punct">&quot;)</span> -# Get info on all public EC2 images created by the Amazon EC2 team. -@ec2_images_amazon = ec2.describe_images(:owner_id =&gt; "amazon").imagesSet.item +<span class="comment"># get ALL public images</span> +<span class="attribute">@ec2_images</span> <span class="punct">=</span> <span class="ident">ec2</span><span class="punct">.</span><span class="ident">describe_images</span><span class="punct">().</span><span class="ident">imagesSet</span><span class="punct">.</span><span class="ident">item</span> -[some more controller code ...] +<span class="comment"># Get info on all public EC2 images created by the Amazon EC2 team.</span> +<span class="attribute">@ec2_images_amazon</span> <span class="punct">=</span> <span class="ident">ec2</span><span class="punct">.</span><span class="ident">describe_images</span><span class="punct">(</span><span class="symbol">:owner_id</span> <span class="punct">=&gt;</span> <span class="punct">&quot;</span><span class="string">amazon</span><span class="punct">&quot;).</span><span class="ident">imagesSet</span><span class="punct">.</span><span class="ident">item</span> -</pre> +<span class="punct">[</span><span class="ident">some</span> <span class="ident">more</span> <span class="ident">controller</span> <span class="ident">code</span> <span class="punct">...]</span> +</pre></p> + + <p>and then you can show off your <span class="caps">EC2</span> image data with some code in app/views/your_view.rhtml:</p> -<pre syntax="ruby"> + <p><pre class='syntax'> -&lt;h1&gt;EC2 Test#index&lt;/h1&gt; +<span class="punct">&lt;</span><span class="ident">h1</span><span class="punct">&gt;</span><span class="constant">EC2</span> <span class="constant">Test</span><span class="comment">#index&lt;/h1&gt;</span> -&lt;h1&gt;Sample 1 - debug() view&lt;/h1&gt; +<span class="punct">&lt;</span><span class="ident">h1</span><span class="punct">&gt;</span><span class="constant">Sample</span> <span class="number">1</span> <span class="punct">-</span> <span class="ident">debug</span><span class="punct">()</span> <span class="ident">view</span><span class="punct">&lt;/</span><span class="regex">h1&gt; &lt;%= debug(@ec2_images_amazon) %&gt; -&lt;h1&gt;Sample 2 - Build a table&lt;/h1&gt; +&lt;h1&gt;Sample 2 - Build a table&lt;</span><span class="punct">/</span><span class="ident">h1</span><span class="punct">&gt;</span> -&lt;table border='1'&gt; - &lt;tr&gt; - &lt;th&gt;image.imageId&lt;/th&gt; - &lt;th&gt;image.imageLocation&lt;/th&gt; - &lt;th&gt;image.imageOwnerId&lt;/th&gt; - &lt;th&gt;image.imageState&lt;/th&gt; - &lt;th&gt;image.isPublic&lt;/th&gt; - &lt;/tr&gt; - - &lt;% for image in @ec2_images_amazon %&gt; - &lt;tr&gt; - &lt;td&gt;&lt;%=h image.imageId %&gt;&lt;/td&gt; - &lt;td&gt;&lt;%=h image.imageLocation %&gt;&lt;/td&gt; - &lt;td&gt;&lt;%=h image.imageOwnerId %&gt;&lt;/td&gt; - &lt;td&gt;&lt;%=h image.imageState %&gt;&lt;/td&gt; - &lt;td&gt;&lt;%=h image.isPublic %&gt;&lt;/td&gt; +<span class="punct">&lt;</span><span class="ident">table</span> <span class="ident">border</span><span class="punct">='</span><span class="string">1</span><span class="punct">'&gt;</span> + <span class="punct">&lt;</span><span class="ident">tr</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">th</span><span class="punct">&gt;</span><span class="ident">image</span><span class="punct">.</span><span class="ident">imageId</span><span class="punct">&lt;/</span><span class="regex">th&gt; + &lt;th&gt;image.imageLocation&lt;</span><span class="punct">/</span><span class="ident">th</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">th</span><span class="punct">&gt;</span><span class="ident">image</span><span class="punct">.</span><span class="ident">imageOwnerId</span><span class="punct">&lt;/</span><span class="regex">th&gt; + &lt;th&gt;image.imageState&lt;</span><span class="punct">/</span><span class="ident">th</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">th</span><span class="punct">&gt;</span><span class="ident">image</span><span class="punct">.</span><span class="ident">isPublic</span><span class="punct">&lt;/</span><span class="regex">th&gt; + &lt;</span><span class="punct">/</span><span class="ident">tr</span><span class="punct">&gt;</span> + + <span class="punct">&lt;%</span> <span class="keyword">for</span> <span class="ident">image</span> <span class="keyword">in</span> <span class="attribute">@ec2_images_amazon</span> <span class="punct">%&gt;</span><span class="string"> + &lt;tr</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">td</span><span class="punct">&gt;&lt;%=</span><span class="string">h image.imageId %&gt;&lt;/td&gt; + &lt;td&gt;&lt;%</span><span class="punct">=</span><span class="ident">h</span> <span class="ident">image</span><span class="punct">.</span><span class="ident">imageLocation</span> <span class="punct">%&gt;</span><span class="string">&lt;/td</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">td</span><span class="punct">&gt;&lt;%=</span><span class="string">h image.imageOwnerId %&gt;&lt;/td&gt; + &lt;td&gt;&lt;%</span><span class="punct">=</span><span class="ident">h</span> <span class="ident">image</span><span class="punct">.</span><span class="ident">imageState</span> <span class="punct">%&gt;</span><span class="string">&lt;/td</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">td</span><span class="punct">&gt;&lt;%=</span><span class="string">h image.isPublic %&gt;&lt;/td&gt; &lt;/tr&gt; &lt;% end %&gt; &lt;/table&gt; &lt;h1&gt;Sample 3 - Iterate&lt;/h1&gt; &lt;% @ec2_images_amazon.each do |image| %&gt; - &lt;% image.each_pair do |key, value| %&gt; - &lt;% unless key == 'parent' %&gt; - &lt;%= "#{key} =&gt; #{value}" %&gt;&lt;br /&gt; - &lt;% end %&gt; - &lt;% end %&gt; - &lt;br /&gt; -&lt;% end %&gt; + &lt;% image.each_pair do |key, value| %&gt; + &lt;% unless key </span><span class="punct">==</span> <span class="punct">'</span><span class="string">parent</span><span class="punct">'</span> <span class="punct">%&gt;</span><span class="string"> + &lt;%= &quot;<span class="expr">#{key}</span> =</span><span class="punct">&gt;</span> <span class="comment">#{value}&quot; %&gt;&lt;br /&gt;</span> + <span class="punct">&lt;%</span> <span class="keyword">end</span> <span class="punct">%&gt;</span><span class="string"> + &lt;% end %</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">br</span> <span class="punct">/&gt;</span> +<span class="punct">&lt;%</span> <span class="keyword">end</span> <span class="punct">%&gt;</span><span class="string"> +<span class="normal"> +</span></span></pre></p> -</pre> <h4>Important notes regarding the structure of <span class="caps">EC2</span>::Response Objects</h4> <p>One of the key benefits of this new version of the library is that all responses from <span class="caps">EC2</span> are bundled up in @@ -417,75 +425,77 @@ future changes to the <span class="caps">API</span> and what is returned by <span class="caps">EC2</span> will largely be handled transparently by the gem. This is a huge benefit. What this means though, is that you may have to do a little homework on what actually gets returned by <span class="caps">EC2</span> as <span class="caps">XML</span>. For example, when you make a #describe_images call in ec2sh to <span class="caps">EC2</span> what you will get back will look like:</p> -<pre syntax="ruby"> -$ ec2sh -&gt;&gt; puts @ec2.describe_images(:owner_id =&gt; 'amazon').xml + <p><pre class='syntax'> +<span class="global">$ </span><span class="ident">ec2sh</span> +<span class="punct">&gt;&gt;</span> <span class="ident">puts</span> <span class="attribute">@ec2</span><span class="punct">.</span><span class="ident">describe_images</span><span class="punct">(</span><span class="symbol">:owner_id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">amazon</span><span class="punct">').</span><span class="ident">xml</span> -&lt;?xml version="1.0"?&gt; -&lt;DescribeImagesResponse xmlns="http://ec2.amazonaws.com/doc/2007-01-19/"&gt; - &lt;imagesSet&gt; +<span class="punct">&lt;</span><span class="char">?x</span><span class="ident">ml</span> <span class="ident">version</span><span class="punct">=&quot;</span><span class="string">1.0</span><span class="punct">&quot;</span><span class="char">?&gt;</span> +<span class="punct">&lt;</span><span class="constant">DescribeImagesResponse</span> <span class="ident">xmlns</span><span class="punct">=&quot;</span><span class="string">http://ec2.amazonaws.com/doc/2007-01-19/</span><span class="punct">&quot;&gt;</span> + <span class="punct">&lt;</span><span class="ident">imagesSet</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">item</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageId</span><span class="punct">&gt;</span><span class="ident">ami</span><span class="punct">-</span><span class="number">20</span><span class="ident">b65349</span><span class="punct">&lt;/</span><span class="regex">imageId&gt; + &lt;imageLocation&gt;ec2-public-images</span><span class="punct">/</span><span class="ident">fedora</span><span class="punct">-</span><span class="ident">core4</span><span class="punct">-</span><span class="ident">base</span><span class="punct">.</span><span class="ident">manifest</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">&lt;/</span><span class="regex">imageLocation&gt; + &lt;imageState&gt;available&lt;</span><span class="punct">/</span><span class="ident">imageState</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageOwnerId</span><span class="punct">&gt;</span><span class="ident">amazon</span><span class="punct">&lt;/</span><span class="regex">imageOwnerId&gt; + &lt;isPublic&gt;true&lt;</span><span class="punct">/</span><span class="ident">isPublic</span><span class="punct">&gt;</span> + <span class="punct">&lt;/</span><span class="regex">item&gt; &lt;item&gt; - &lt;imageId&gt;ami-20b65349&lt;/imageId&gt; - &lt;imageLocation&gt;ec2-public-images/fedora-core4-base.manifest.xml&lt;/imageLocation&gt; - &lt;imageState&gt;available&lt;/imageState&gt; - &lt;imageOwnerId&gt;amazon&lt;/imageOwnerId&gt; - &lt;isPublic&gt;true&lt;/isPublic&gt; - &lt;/item&gt; + &lt;imageId&gt;ami-22b6534b&lt;</span><span class="punct">/</span><span class="ident">imageId</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageLocation</span><span class="punct">&gt;</span><span class="ident">ec2</span><span class="punct">-</span><span class="ident">public</span><span class="punct">-</span><span class="ident">images</span><span class="punct">/</span><span class="ident">fedora</span><span class="punct">-</span><span class="ident">core4</span><span class="punct">-</span><span class="ident">mysql</span><span class="punct">.</span><span class="ident">manifest</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">&lt;/</span><span class="regex">imageLocation&gt; + &lt;imageState&gt;available&lt;</span><span class="punct">/</span><span class="ident">imageState</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageOwnerId</span><span class="punct">&gt;</span><span class="ident">amazon</span><span class="punct">&lt;/</span><span class="regex">imageOwnerId&gt; + &lt;isPublic&gt;true&lt;</span><span class="punct">/</span><span class="ident">isPublic</span><span class="punct">&gt;</span> + <span class="punct">&lt;/</span><span class="regex">item&gt; &lt;item&gt; - &lt;imageId&gt;ami-22b6534b&lt;/imageId&gt; - &lt;imageLocation&gt;ec2-public-images/fedora-core4-mysql.manifest.xml&lt;/imageLocation&gt; - &lt;imageState&gt;available&lt;/imageState&gt; - &lt;imageOwnerId&gt;amazon&lt;/imageOwnerId&gt; - &lt;isPublic&gt;true&lt;/isPublic&gt; - &lt;/item&gt; + &lt;imageId&gt;ami-23b6534a&lt;</span><span class="punct">/</span><span class="ident">imageId</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageLocation</span><span class="punct">&gt;</span><span class="ident">ec2</span><span class="punct">-</span><span class="ident">public</span><span class="punct">-</span><span class="ident">images</span><span class="punct">/</span><span class="ident">fedora</span><span class="punct">-</span><span class="ident">core4</span><span class="punct">-</span><span class="ident">apache</span><span class="punct">.</span><span class="ident">manifest</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">&lt;/</span><span class="regex">imageLocation&gt; + &lt;imageState&gt;available&lt;</span><span class="punct">/</span><span class="ident">imageState</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageOwnerId</span><span class="punct">&gt;</span><span class="ident">amazon</span><span class="punct">&lt;/</span><span class="regex">imageOwnerId&gt; + &lt;isPublic&gt;true&lt;</span><span class="punct">/</span><span class="ident">isPublic</span><span class="punct">&gt;</span> + <span class="punct">&lt;/</span><span class="regex">item&gt; &lt;item&gt; - &lt;imageId&gt;ami-23b6534a&lt;/imageId&gt; - &lt;imageLocation&gt;ec2-public-images/fedora-core4-apache.manifest.xml&lt;/imageLocation&gt; - &lt;imageState&gt;available&lt;/imageState&gt; - &lt;imageOwnerId&gt;amazon&lt;/imageOwnerId&gt; - &lt;isPublic&gt;true&lt;/isPublic&gt; - &lt;/item&gt; + &lt;imageId&gt;ami-25b6534c&lt;</span><span class="punct">/</span><span class="ident">imageId</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageLocation</span><span class="punct">&gt;</span><span class="ident">ec2</span><span class="punct">-</span><span class="ident">public</span><span class="punct">-</span><span class="ident">images</span><span class="punct">/</span><span class="ident">fedora</span><span class="punct">-</span><span class="ident">core4</span><span class="punct">-</span><span class="ident">apache</span><span class="punct">-</span><span class="ident">mysql</span><span class="punct">.</span><span class="ident">manifest</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">&lt;/</span><span class="regex">imageLocation&gt; + &lt;imageState&gt;available&lt;</span><span class="punct">/</span><span class="ident">imageState</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageOwnerId</span><span class="punct">&gt;</span><span class="ident">amazon</span><span class="punct">&lt;/</span><span class="regex">imageOwnerId&gt; + &lt;isPublic&gt;true&lt;</span><span class="punct">/</span><span class="ident">isPublic</span><span class="punct">&gt;</span> + <span class="punct">&lt;/</span><span class="regex">item&gt; &lt;item&gt; - &lt;imageId&gt;ami-25b6534c&lt;/imageId&gt; - &lt;imageLocation&gt;ec2-public-images/fedora-core4-apache-mysql.manifest.xml&lt;/imageLocation&gt; - &lt;imageState&gt;available&lt;/imageState&gt; - &lt;imageOwnerId&gt;amazon&lt;/imageOwnerId&gt; - &lt;isPublic&gt;true&lt;/isPublic&gt; - &lt;/item&gt; + &lt;imageId&gt;ami-26b6534f&lt;</span><span class="punct">/</span><span class="ident">imageId</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageLocation</span><span class="punct">&gt;</span><span class="ident">ec2</span><span class="punct">-</span><span class="ident">public</span><span class="punct">-</span><span class="ident">images</span><span class="punct">/</span><span class="ident">developer</span><span class="punct">-</span><span class="ident">image</span><span class="punct">.</span><span class="ident">manifest</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">&lt;/</span><span class="regex">imageLocation&gt; + &lt;imageState&gt;available&lt;</span><span class="punct">/</span><span class="ident">imageState</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageOwnerId</span><span class="punct">&gt;</span><span class="ident">amazon</span><span class="punct">&lt;/</span><span class="regex">imageOwnerId&gt; + &lt;isPublic&gt;true&lt;</span><span class="punct">/</span><span class="ident">isPublic</span><span class="punct">&gt;</span> + <span class="punct">&lt;/</span><span class="regex">item&gt; &lt;item&gt; - &lt;imageId&gt;ami-26b6534f&lt;/imageId&gt; - &lt;imageLocation&gt;ec2-public-images/developer-image.manifest.xml&lt;/imageLocation&gt; - &lt;imageState&gt;available&lt;/imageState&gt; - &lt;imageOwnerId&gt;amazon&lt;/imageOwnerId&gt; - &lt;isPublic&gt;true&lt;/isPublic&gt; - &lt;/item&gt; - &lt;item&gt; - &lt;imageId&gt;ami-2bb65342&lt;/imageId&gt; - &lt;imageLocation&gt;ec2-public-images/getting-started.manifest.xml&lt;/imageLocation&gt; - &lt;imageState&gt;available&lt;/imageState&gt; - &lt;imageOwnerId&gt;amazon&lt;/imageOwnerId&gt; - &lt;isPublic&gt;true&lt;/isPublic&gt; - &lt;/item&gt; - &lt;/imagesSet&gt; -&lt;/DescribeImagesResponse&gt; + &lt;imageId&gt;ami-2bb65342&lt;</span><span class="punct">/</span><span class="ident">imageId</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageLocation</span><span class="punct">&gt;</span><span class="ident">ec2</span><span class="punct">-</span><span class="ident">public</span><span class="punct">-</span><span class="ident">images</span><span class="punct">/</span><span class="ident">getting</span><span class="punct">-</span><span class="ident">started</span><span class="punct">.</span><span class="ident">manifest</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">&lt;/</span><span class="regex">imageLocation&gt; + &lt;imageState&gt;available&lt;</span><span class="punct">/</span><span class="ident">imageState</span><span class="punct">&gt;</span> + <span class="punct">&lt;</span><span class="ident">imageOwnerId</span><span class="punct">&gt;</span><span class="ident">amazon</span><span class="punct">&lt;/</span><span class="regex">imageOwnerId&gt; + &lt;isPublic&gt;true&lt;</span><span class="punct">/</span><span class="ident">isPublic</span><span class="punct">&gt;</span> + <span class="punct">&lt;/</span><span class="regex">item&gt; + &lt;</span><span class="punct">/</span><span class="ident">imagesSet</span><span class="punct">&gt;</span> +<span class="punct">&lt;/</span><span class="regex">DescribeImagesResponse&gt; +<span class="normal"> +</span></span></pre></p> -</pre> <p>You can see in the <span class="caps">XML</span> the structure that you will need to follow when constructing queries for information and parsing responses from <span class="caps">EC2</span>.</p> <p>So, for example, if you wanted to get the image ID of the third image listed in the response above you would need to do:</p> -<pre syntax="ruby"> -&gt;&gt; puts @ec2.describe_images(:owner_id =&gt; 'amazon').imagesSet.item[2].imageId -ami-23b6534a -</pre> + <p><pre class='syntax'> +<span class="punct">&gt;&gt;</span> <span class="ident">puts</span> <span class="attribute">@ec2</span><span class="punct">.</span><span class="ident">describe_images</span><span class="punct">(</span><span class="symbol">:owner_id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">amazon</span><span class="punct">').</span><span class="ident">imagesSet</span><span class="punct">.</span><span class="ident">item</span><span class="punct">[</span><span class="number">2</span><span class="punct">].</span><span class="ident">imageId</span> +<span class="ident">ami</span><span class="punct">-</span><span class="number">23</span><span class="ident">b6534a</span> +</pre></p> + <p><span class="caps">EC2</span> will typically return &#8216;sets&#8217; of things (imagesSet, reservationSet, etc.) which we map to ruby Arrays (.imagesSet.item in the example above). If you want to iterate over a response set you will need to iterate over this array. The Arrays will typically contain additional <span class="caps">EC2</span>::Response objects that represent each individual item. You&#8217;ll find that you can use the &#8216;ec2sh&#8217; to help you understand the structure more completely if you try issuing commands there as a way to practice seeing what will be returned and making sure you get exactly what you want. You can always call the <span class="caps">EC2</span>::Response#xml method like I did above to see the exact <span class="caps">XML</span> returned which allows you to easily derive the structure for the Ruby OpenStruct object.</p> <h2>Contributing</h2> @@ -541,10 +551,10 @@ <h2>Contact</h2> <p>Comments, patches, and bug reports are welcome. Send an email to the address below or use the RubyForge forum for this project.</p> <p class="coda"> - <a href="mailto:grempe-at-rubyforge-dot-org">Glenn Rempe</a>, 6th July 2007<br> + <a href="mailto:grempe-at-rubyforge-dot-org">Glenn Rempe</a>, 26th September 2007<br> </p> </div> <!-- insert site tracking codes here, like Google Urchin -->