<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fubaredness Is Contagious</title>
	<atom:link href="http://somic.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://somic.org</link>
	<description>Dmitriy Samovskiy's Blog</description>
	<lastBuildDate>Wed, 01 Sep 2010 07:55:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Extending EC2 API &#8211; ec2-describe-ipaddress-ranges</title>
		<link>http://somic.org/2010/09/01/extending-ec2-api-ec2-describe-ipaddress-ranges/</link>
		<comments>http://somic.org/2010/09/01/extending-ec2-api-ec2-describe-ipaddress-ranges/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 07:55:05 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[ec2]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1669</guid>
		<description><![CDATA[Do you remember how we used to programmatically consume services on the web before proliferation of APIs? That&#8217;s right &#8211; scraping! And do you know what prevents us from using this technique now, when some piece of data you need for your application, is not available via API? That&#8217;s right &#8211; absolutely nothing!
I recently came [...]]]></description>
			<content:encoded><![CDATA[<p>Do you remember how we used to programmatically consume services on the web before proliferation of APIs? That&#8217;s right &#8211; scraping! And do you know what prevents us from using this technique now, when some piece of data you need for your application, is not available via API? That&#8217;s right &#8211; absolutely nothing!</p>
<p>I recently came across something that was not available via EC2 API &#8211; lists of IP address ranges for each EC2 region. AWS team maintain such lists in their forums &#8211; currently at <a href="http://developer.amazonwebservices.com/connect/ann.jspa?annID=735">http://developer.amazonwebservices.com/connect/ann.jspa?annID=735</a> (I say &#8220;currently&#8221; because annID has already changed at least once). I <a href="http://twitter.com/somic/status/21921693410">asked</a> for API, but in the meantime since I needed this now, I wrote a simple python script to scrape and parse the data &#8211; <a href="http://gist.github.com/559397">http://gist.github.com/559397</a> or embedded below. Enjoy! By the way, who would have thought that one would need to resort to scraping AWS, the very pioneers of infrastructure APIs, to get this simple bit of information?</p>
<style>
pre { font-size:12px; }
</style>
<p><script src="http://gist.github.com/559397.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/09/01/extending-ec2-api-ec2-describe-ipaddress-ranges/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Biggest Challenge for Infrastructure as Code</title>
		<link>http://somic.org/2010/08/17/the-biggest-challenge-for-infrastructure-as-code/</link>
		<comments>http://somic.org/2010/08/17/the-biggest-challenge-for-infrastructure-as-code/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 08:07:15 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[infrastructure development]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1637</guid>
		<description><![CDATA[What do you do when you come across a piece of open source software that you&#8217;d like to try? You could download its source code tarball, extract the files, build and install it following the rules and conventions for a given programming language (./configure &#38;&#38; make &#38;&#38; make install, ruby setup.rb build, python setup.py install, [...]]]></description>
			<content:encoded><![CDATA[<p>What do you do when you come across a piece of open source software that you&#8217;d like to try? You could download its source code tarball, extract the files, build and install it following the rules and conventions for a given programming language (./configure &amp;&amp; make &amp;&amp; make install, ruby setup.rb build, python setup.py install, perl Makefile.PL) &#8211; and you end up with a usable product. This simple fact is at the very core of entire open source ecosystem &#8211; without an easy and reliable way to transform source code into runnable software, open source potentially would not even exist.</p>
<p><strong>I think that the biggest challenge for <a href="http://stochasticresonance.wordpress.com/2009/07/12/infrastructure-renaissance/">Infrastructure as Code</a> today is its current lack of anything resembling a Makefile &#8211; a relatively simple description of how input could be transformed into output ready for use end to end, given a set of basic tools or a preset build environment </strong>(for example, for a project written in C it would be <em>apt-get install build-essential</em> on Debian and its derivatives). If you want an example, please take a look at deployment instructions for <a href="http://nova.openstack.org/getting.started.html">openstack/nova</a> (&#8221;on the cloud controller, do this&#8230; on volume node, do that&#8230;&#8221;). <strong>While it is indeed infrastructure code, its end-to-end build and deployment instructions are provided in textual form, not as code.</strong></p>
<p>Why is it a problem you may ask. First and foremost, build/deploy instructions provided in textual form can&#8217;t be easily consumed by a machine &#8211; it feels like we are back in the dark ages, without APIs where all work must be performed manually.</p>
<p>Secondly, because they are not fully formalized, they can&#8217;t be as easily shared &#8211; there could be many uncaptured context requirements that could lead to different people transforming identical inputs to outputs that would not function identically. And if they are not shared, same functionality is being worked on by many separate teams at the same time, which leads to incompatible, sometimes competing implementations and creates wasted effort by not allowing code reuse.</p>
<p>Thirdly, since they are not code, they are not as easy to test and verify test coverage for, or to fork and merge, or to port to other platforms.</p>
<p>My point is that while individual parts or steps of an infrastructure deployment could be automated, a whole thing rarely is, especially when a system is to be deployed to multiple hosts connected over the network. This would be similar to a software project with various directories, each with its own Makefile but without a top-level Makefile &#8211; such that you&#8217;d have to follow a HOWTO telling you which arguments to pass to make in each directory and in which order to run the commands.</p>
<p><strong>What to do? I call on all infrastructure projects to make every attempt to ship deployment instructions not as textual step-by-step howto documents, but as code &#8211; be it Chef cookbooks, Puppet recipes, shell scripts, Fabric/Capistrano scripts and so on, or a combination of any of the above. Please consider providing cloud images (in at least one region of at least one public cloud) with your canonical build environment (your equivalent of <em>build-essential</em>). Please consider including canonical network topologies for your deployment &#8211; since you can&#8217;t predict IP addresses each user is going to allocate, all configuration files will need to be autogenerated or built from templates.</strong></p>
<p>I am well aware it&#8217;s easier said than done, but if we do this, I hope a tentative consensus on best practices for infrastructure as code deployments could emerge over time which could then facilitate creation of a common &#8220;infrastructure make&#8221; tool.</p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/08/17/the-biggest-challenge-for-infrastructure-as-code/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Parallelize Your EC2 API Calls with Python, Boto and Threading</title>
		<link>http://somic.org/2010/08/03/parallelize-your-ec2-api-calls-with-python-boto-and-threading/</link>
		<comments>http://somic.org/2010/08/03/parallelize-your-ec2-api-calls-with-python-boto-and-threading/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 08:06:43 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[boto]]></category>
		<category><![CDATA[ec2]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1492</guid>
		<description><![CDATA[I started a small new project on Github &#8211; http://github.com/somic/ec2-multiregion. It includes several small tools that facilitate EC2 API operations that involve multiple regions at the same time.
If I were to query each endpoint one after another, I quickly discovered it would take too long. Therefore, I created a small helper class called BotoWorkerPool (in [...]]]></description>
			<content:encoded><![CDATA[<p>I started a small new project on Github &#8211; <a href="http://github.com/somic/ec2-multiregion">http://github.com/somic/ec2-multiregion</a>. It includes several small tools that facilitate EC2 API operations that involve multiple regions at the same time.</p>
<p>If I were to query each endpoint one after another, I quickly discovered it would take too long. Therefore, I created a small helper class called BotoWorkerPool (in lib/boto_worker_pool.py), which wraps Python&#8217;s standard <a href="http://docs.python.org/library/threading.html">threading</a> module around calls to <a href="http://github.com/boto/boto">boto</a> &#8211; this helps achieve some amount of parallelism without introducing significant complexity of dealing with and sharing data among multiple processes. This also allows to potentially migrate to <a href="http://pypi.python.org/pypi/processing">processing</a> or <a href="http://docs.python.org/dev/library/multiprocessing.html">multiprocessing</a> libraries in the future, which offer threading-like interfaces for a multi-process model.</p>
<p>There are 2 tools at the moment.</p>
<p><strong>onesnapshot.py</strong> creates new snapshots for all volumes that already have one snapshot marked with &#8220;__onesnapshot__&#8221; token. The rationale for this tool came in part from the following statement on <a href="http://aws.amazon.com/ebs/">AWS main page for EBS</a> about durability:</p>
<blockquote><p>The durability of your volume depends both on the size of your volume  and the percentage of the data that has changed since your last  snapshot.</p></blockquote>
<p><strong>imageequiv.py</strong> takes AMI ID, kernel ID or ramdisk ID and finds equivalent IDs in all regions, based on matching name or manifest file location. This tool is a response to the following <a href="http://twitter.com/somic/status/13735105239">tweet</a> of mine:</p>
<blockquote><p><span><span><span>wanted &#8211; equivalence lists for kernel and ramdisk images (aki-, ari-) across all ec2 regions</span></span></span></p></blockquote>
<p><span><span><span>Hope these are useful to someone.<br />
</span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/08/03/parallelize-your-ec2-api-calls-with-python-boto-and-threading/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Russell&#8217;s Paradox and Cloud Computing</title>
		<link>http://somic.org/2010/07/20/russell-paradox-and-cloud-computing/</link>
		<comments>http://somic.org/2010/07/20/russell-paradox-and-cloud-computing/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 08:01:21 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[fun]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1575</guid>
		<description><![CDATA[I am sure you&#8217;ve heard of Bertrand Russell&#8217;s paradox and one of its more widely known versions &#8211; Barber paradox. But let me rephrase the Wikipedia article:
Suppose there is a town with just one public IaaS cloud provider, and that every business in the town runs their own IT: some by hosting it on-premises, some [...]]]></description>
			<content:encoded><![CDATA[<p>I am sure you&#8217;ve heard of <a href="http://en.wikipedia.org/wiki/Russell%27s_paradox">Bertrand Russell&#8217;s paradox</a> and one of its more widely known versions &#8211; <a href="http://en.wikipedia.org/wiki/Barber_paradox">Barber paradox</a>. But let me rephrase the Wikipedia article:</p>
<blockquote><p>Suppose there is a town with just one public IaaS cloud provider, and that every business in the town runs their own IT: some by hosting it on-premises, some by running it in the cloud. It seems reasonable to imagine that the cloud provider obeys the following rule: it runs IT for all and only those businesses that do not run their IT on-premises.</p>
<p>Under this scenario, we can ask the following question: is cloud provider&#8217;s own IT in the cloud or on-premises? (remember that the cloud provider itself is also a business)</p></blockquote>
<p>Of course this &#8220;faux&#8221; paradox is not a paradox at all. As I <a href="http://twitter.com/somic/status/18045970837">suggested</a> on Twitter, &#8220;<span><span><span>if you build a cloud, to your customers it will  indeed look like a cloud; but to you it will look like a regular  datacenter.&#8221;</span></span></span></p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/07/20/russell-paradox-and-cloud-computing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Are You a Responsible Owner of Your Availability?</title>
		<link>http://somic.org/2010/07/06/are-you-a-responsible-owner-of-your-availability/</link>
		<comments>http://somic.org/2010/07/06/are-you-a-responsible-owner-of-your-availability/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 07:59:10 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[infrastructure development]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1500</guid>
		<description><![CDATA[Last month AWS released Reduced  Redundancy Storage feature of S3. There were several aspects of  this announcement that appeal to different people, but I especially  appreciated one part &#8211; S3 now offers a choice of less  availability for a lower price.
Availability of your system, just as any other part of your [...]]]></description>
			<content:encoded><![CDATA[<p>Last month AWS released <a href="http://aws.typepad.com/aws/2010/05/new-amazon-s3-reduced-redundancy-storage-rrs.html">Reduced  Redundancy Storage</a> feature of S3. There were several aspects of  this announcement that appeal to different people, but I especially  appreciated one part &#8211; S3 now offers a <strong>choice of </strong><strong>less  availability for a lower price</strong>.</p>
<p>Availability of your system, just as any other part of your service, is a feature. Just as with anything else, one needs to invest time, effort and resources in building it out. And whatever you dedicate to availability (such as development time) can&#8217;t be used for other features &#8211; this is what&#8217;s known as <a href="http://en.wikipedia.org/wiki/Opportunity_cost">opportunity cost</a>. If you could put same resources to a better use somewhere else, investing them in availability may not be the optimal decision. Additionally, availability draws from your <a href="http://somic.org/2010/01/11/normal-accidents-in-complex-it-systems/">complexity budget</a> which is going to impact other areas &#8211; HA systems tend to be more complex and hence require more effort to develop, maintain and improve them over time. <strong>Availability, just as any other feature, has a price tag that you will have to pay to get it.</strong> <strong>Because you own your site&#8217;s availability, it&#8217;s up to you to decide how much availability you want AND can afford to build.</strong></p>
<p>The last point is very important. Our daily lives are filled with points of failure &#8211; home appliances (can break), a usual route you take to work (could be impacted by road construction), your regular coffee place (your favorite barista could transfer to a different location). Do you maintain 2 different non-overlapping routes to work? Or do you frequent 2 coffee shops in order to have an alternative if one shop drops from your list? In other words, in our lives we regularly forgo availability when it doesn&#8217;t make sense &#8211; why shouldn&#8217;t we follow the same rule in our professional lives?</p>
<p>Availability is not a binary option. You could have all-active N-tuple, you could have active-active pair, you could have an active-passive pair with automatic failover, or same active-passive pair with manual failover. And finally, in today&#8217;s cloudy world, you could also have just a single resource with ability to replace this resource quickly if it goes down. Options include geographic redundancy, vendor/provider diversity, and so on. Availability could be as simple as host your systems at a very reliable provider. Or at the very least &#8211; be able to detect when there is a problem and be able to restore the system within a preset amount of time. <strong>Different levels of availability obviously don&#8217;t cost the same &#8211; pick one that you want and can afford.<br />
</strong></p>
<p>Secondly, if your overall service consists of multiple smaller parts, you are free to choose different levels of availability for individual parts. Anything which responds to synchronous calls (a call that expects a reply immediately) &#8211; like web front door &#8211; may have one level of availability (higher), background jobs may have lower level. Designing each subsystem with appropriate level of availability will reduce your costs and most likely will let you save some of complexity budget for other things.</p>
<p>Thirdly, while availability is a single metric, problems that impact it are not. Some problems could be frequent and easy to deal with, other problems could be rare and catastrophic. Do you want to build your service to withstand a failure of a host, all hosts, all of your ISP, entire Internet? It&#8217;s all about the tradeoffs between costs, severity of each type of problem and probability of these problems to occur.</p>
<p>Fourthly, remember that availability measures that you build are your defenses against problems. A particular type of problem that you want to protect against, requires an availability measure targeted at this very problem &#8211; matching it by functionality, size and cost (a single defense measure may work against multiple threats). Imbalance in any of these three categories between your defenses and the problems they are meant to prevent will lead to suboptimal results. After all, you don&#8217;t use a shield to defend against a cannon and you don&#8217;t duplicate your entire operation into the second datacenter just to protect against a router failure.</p>
<p>And finally, beware of peer pressure. If your web front door&#8217;s availability costs $1m per month and it&#8217;s bringing in $10m per month worth of revenues,  it can be a no-brainer. But if you are investing 50% of your complexity budget in availability just because everybody else is doing it, I think it could be a problem.</p>
<p>Going back to AWS and putting my amateur behavioral economist&#8217;s hat on, I am curious how many people decided to take advantage of lower price for lower availability of RRS. And even more interestingly, if S3 initially were at RRS availability and AWS announced better availability for higher price, would we end up with the same distribution of people using higher and lower availability?</p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/07/06/are-you-a-responsible-owner-of-your-availability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CohesiveFT VPN-Cubed as Networking Fabric of the Intercloud</title>
		<link>http://somic.org/2010/06/23/cohesiveft-vpn-cubed-as-networking-fabric-of-the-intercloud/</link>
		<comments>http://somic.org/2010/06/23/cohesiveft-vpn-cubed-as-networking-fabric-of-the-intercloud/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 17:19:15 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[cohesiveft]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1542</guid>
		<description><![CDATA[This post is about stuff I work on at my current job. I do not speak for my employer on this blog though, therefore please consider thoughts and opinions below as strictly my own, not necessarily endorsed or approved by CohesiveFT.
It has been about 6 months since I last blogged about work, so I figured [...]]]></description>
			<content:encoded><![CDATA[<p><em>This post is about stuff I work on at my current job. I do not speak for my employer on this blog though, therefore please consider thoughts and opinions below as strictly my own, not necessarily endorsed or approved by CohesiveFT.</em></p>
<p>It has been about 6 months since I <a href="http://somic.org/category/cohesiveft/">last blogged about work</a>, so I figured an update may be in order, especially since today <a href="http://cohesiveft.com/">CohesiveFT</a> <a href="http://blog.elasticserver.com/2010/06/vpn-cubed-brings-virtual-private-clouds.html">announced</a> availability of <a href="http://cohesiveft.com/vpncubed">VPN-Cubed</a> on <a href="http://www.flexiant.com">Flexiant</a>&#8217;s cloud offerings.</p>
<p>We&#8217;ve been very busy on VPN-Cubed engineering side. Along with features already on the roadmap, we delivered several enhancements that were directly driven or requested by VPN-Cubed users. On the product support side, we continued to expand a range of devices with which VPN-Cubed can do IPsec interop, which now include even ones I personally have never heard about before. We grew our experience and expertise in the area of troubleshooting intra-cloud and cloud-to-datacenter connectivity issues (there are many!). We&#8217;ve also worked on a few projects that required non-trivial topologies or interconnects, successfully mapping customer requirements to VPN-Cubed capabilities.</p>
<p>One theme that I have had in my head for some time now, is <strong>VPN-Cubed as the networking fabric of the Intercloud</strong>. Let me explain.</p>
<p>VPS was a predecessor of modern IaaS clouds. In VPS land, boxes are usually provisioned individually, one by one. Typical setups in VPS consisted of 1, 2 or 3 boxes. Networking 3 independent boxes together is relatively straightforward.</p>
<p>At the beginning of IaaS era, I imagine most setups were also 1 or 2 boxes. <strong>But as IaaS is gaining ground, topologies headed to the cloud are getting bigger, more complex and more dependent on access to external resources.</strong> Setting up networking consistently is becoming a bigger deal. But it&#8217;s not the end.</p>
<p>One of the roles of Intercloud is providing customers with an alternative (competition, in other words) &#8211; if one doesn&#8217;t like cloud A, she may take entire topology to cloud B. I&#8217;d say 99 of 100 public cloud justification documents being submitted to CIOs worldwide today include a statement saying something like this: &#8220;If this cloud provider fails to deliver what we need at a level we need it, we will switch to another provider.&#8221; This is actually not as easy in practice as it may sound.</p>
<p>Each cloud&#8217;s networking has unique aspects, no two are alike. Public IPs, private IPs, dynamic or not, customer assignable or not, eth0 private or public, cloud-provided firewall exists or not, peculiarities of firewall &#8211; these are some of the differences (as of today, I have set up boxes in 6 IaaS clouds with admin endpoints facing public Internet &#8211; I have seen many network setups). <strong>Taking images of N boxes from one cloud and dropping them in another cloud is well understood, recreating one cloud&#8217;s networking in another cloud is where the challenge is.</strong></p>
<p>It is here where I think <strong>VPN-Cubed shines as a <span style="text-decoration: underline;">customer-controlled network abstraction</span> &#8211; it&#8217;s an <span style="text-decoration: underline;">overlay built on top of service provider&#8217;s network</span>, which allows it to be identical no matter what the underlying infrastructure looks like.</strong></p>
<p>Same story plays out when an application is <a href="http://somic.org/2009/08/18/the-concept-of-hyper-distributed-application/">hyper-distributed</a> and runs in multiple clouds or multiple regions of one cloud (where regions are connected via public Internet). And here as well VPN-Cubed provides an abstraction that allows one to treat all compute resources as being on the same network, regardless where they are actually located at the moment.</p>
<p>At the same time, VPN-Cubed can be appealing to topologies that don&#8217;t care about Intercloud. Networking and network security are areas that don&#8217;t get enough attention from cloud developers today, because developers are used to working within a perimeter. Excessively wide-open security group setups, using public IPs instead of private for communications, disabled local firewalls &#8211; these are all time bombs. They don&#8217;t affect the app right now (&#8221;look, it works!&#8221;) but they can be catastrophic over time when they could become an attack vector. For such topologies, <strong>VPN-Cubed provides a virtual perimeter that confines authorized communications to a mutually-authenticated tunnel encrypted end-to-end</strong> (are you sure you want to continue forcing your incoming web traffic to HTTPS but not encrypting writes and reads from app servers to database? or do you think application-level encryption could be better, faster or easier to maintain than transport-level?)</p>
<p>To get started with VPN-Cubed, visit <a href="http://cohesiveft.com/vpncubed">http://cohesiveft.com/vpncubed</a>. If you have a question about how VPN-Cubed can help in your particular use case, you can ask <a href="http://www.cohesiveft.com/Contact_CFT/Forms/VPN-Cubed_Contact/">here</a>.</p>
<p><strong>UPDATE 08/21/2010</strong>: <a href="http://twitter.com/randybias">Randy Bias</a> in his <a href="http://cloudscaling.com/blog/cloud-computing/does-openstack-change-the-cloud-game">excellent new post</a> touches on the very similar theme:</p>
<blockquote><p>Where is the lock-in then? If it’s not the hypervisor, what makes moving  from one cloud to another so difficult? Simply put, it’s architectural  differences. Every cloud chooses to do storage and networking  differently.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/06/23/cohesiveft-vpn-cubed-as-networking-fabric-of-the-intercloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devops &#8211; Solution to a Problem, Not a Cure for All Ills</title>
		<link>http://somic.org/2010/06/13/devops-solution-to-a-problem-not-a-cure-for-all-ills/</link>
		<comments>http://somic.org/2010/06/13/devops-solution-to-a-problem-not-a-cure-for-all-ills/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 08:00:00 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[devops]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1502</guid>
		<description><![CDATA[With great interest I read a recent post by Chris Hoff on devops disconnect (make sure to read the comments too).
Devops as a way to promote &#8220;collaborative and communicative culture&#8221; (see John Allspaw&#8217;s comment) &#8211; &#8220;devops the culture&#8221; henceforth &#8211; was born out of frustration on both sides of the house (dev and ops) when [...]]]></description>
			<content:encoded><![CDATA[<p>With great interest I read a recent post by Chris Hoff on <a href="http://www.rationalsurvivability.com/blog/?p=1890">devops disconnect</a> (make sure to read the comments too).</p>
<p>Devops as a way to promote &#8220;collaborative and communicative culture&#8221; (see John Allspaw&#8217;s comment) &#8211; <em>&#8220;devops the culture&#8221;</em> henceforth &#8211; was born out of frustration on both sides of the house (dev and ops) when it was time to push out and troubleshoot a new code release. In most web companies, a new release would happen on a weekly, bi-weekly or monthly basis &#8211; and the night of bad blood, fingerpointing, cursing, non-stop conference calls and IM conversations, all-nighters and so on would take center stage, with more of the same a couple of days later at a postmortem. Most frustratingly, anyone who has ever worked through anything similar inevitably realizes that the amount of stress could be considerably reduced by simple coordination beforehand when concerns could be raised and addressed.</p>
<p>Similarly, if you ever had to troubleshoot someone else&#8217;s code in a stressful situation, you would often realize that code in question was not written with such situations in mind &#8211; inconsistent and/or incomplete logging, lack of clear understanding of dependencies, failure to properly catch network socket exceptions. Again, this experience can be made much much better by close involvement of ops in parts of development process.</p>
<p>I believe it&#8217;s important to realize that &#8220;ops&#8221; in <em>&#8220;devops the culture&#8221;</em> does not stand for all of operations (which includes systems engineering, networking, storage and security). I specifically mean a subgroup of operations that most commonly is referred to as &#8220;application integration,&#8221; &#8220;application support&#8221; or &#8220;application engineering.&#8221; These are the folks who run the software infrastructure on top of which developers&#8217; code is running. In bigger companies, these would be dedicated people. In smaller ones, the same people may also wear other ops hats such as networking or storage.</p>
<p>Now, don&#8217;t get me wrong &#8211; I would LOVE to see <em>&#8220;devops the culture&#8221;</em> applied to all silos in IT. But it&#8217;s easier said than done, at least for purely technical decisions. I have been a part of multi-silo technical teams tasked with making specific decisions. No matter how much discussion or coordination occurs, the decision still ends up being made by whoever knows the area best (have you ever witnessed developers giving suggestions to network engineers how to design the network? what about storage people advising security? and the best part &#8211; systems engineers advising developers how their code should run?). Hard to say it&#8217;s a bad thing either, especially from responsibility and accountability standpoint.</p>
<p>Hence, in my humble opinion,<em> &#8220;devops the culture&#8221;</em> is not about how to bring collaboration to all of IT. It&#8217;s about avoiding frustrating experiences related to running one&#8217;s own code in production.</p>
<p>Network, security as well as systems do play a big role in <em>&#8220;devops the infrastructure as code&#8221;</em> (see Adam Jacob&#8217;s comment) however &#8211; there&#8217;s no question about that in my mind. How well these areas will lend themselves to automation still remains to be seen however.</p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/06/13/devops-solution-to-a-problem-not-a-cure-for-all-ills/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Activity Streams, Cross-Posting and Pareto Efficiency</title>
		<link>http://somic.org/2010/05/18/activity-streams-cross-posting-and-pareto-efficiency/</link>
		<comments>http://somic.org/2010/05/18/activity-streams-cross-posting-and-pareto-efficiency/#comments</comments>
		<pubDate>Tue, 18 May 2010 07:55:25 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[Economics]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1420</guid>
		<description><![CDATA[I once logged in to LinkedIn to reply to an inMail, and on their front page noticed several tweets from people with whom I am both connected on LinkedIn and whom I follow on Twitter. These were the same tweets that I just read in Tweetdeck &#8211; and I ended up reading them twice! This [...]]]></description>
			<content:encoded><![CDATA[<p>I once logged in to LinkedIn to reply to an inMail, and on their front page noticed several tweets from people with whom I am both connected on LinkedIn and whom I follow on <a href="http://twitter.com/somic">Twitter</a>. These were the same tweets that I just read in Tweetdeck &#8211; and I ended up reading them twice! This got me thinking about cross-posting of social updates (Twitter, Facebook, Buzz, Foursquare, LinkedIn, etc).</p>
<p>First of all, it&#8217;s worth noting that incentives are <a href="http://twitter.com/somic/status/8964192156">misaligned</a> here. For publishers, cross-posting of public updates may make some sense &#8211; the more channels their message appears in, presumably the better. For readers however, the opposite is true &#8211; the more times you have to read the same update, the worse. As readers, we sometimes may want to engage in a conversation &#8211; and it&#8217;s far from clear how one should do it if you only receive a cross-posted update, not the original update on the network on which it was originally published.</p>
<p>Secondly, this emphasizes our current service-centric model of social media, as opposed to person-centric as it should be. In person-centric model, each individual will probably have several public streams (most will have only one I guess) and several private streams (family, friends, work). You let others subscribe to an appropriate stream (with or without authorization, depending on your settings) and they configure their reading service to filter your updates in or out. For example, I may want to follow someone&#8217;s public stream but would like to filter out their Foursquare notifications (unless they have a payload which says something more than &#8220;I am at X&#8221;). For more on this, please check out <a href="http://romeda.org/blog/2010/04/identity.html">Blaine Cook&#8217;s recent post about identity</a>.</p>
<p>And thirdly, this brings up a question of efficiency. Reading same tweets twice is inefficient no matter how you look at it. Un-connecting from someone on LinkedIn just because I don&#8217;t want to see their updates from Twitter is also inefficient. Unfollowing them on Twitter and reading their updates on LinkedIn may make sense, but then I don&#8217;t log in to my LinkedIn very often &#8211; and this ends up being inefficient too.</p>
<p>It&#8217;s interesting to note that the question of efficiency does not exist in the context of a single network. You either follow/friend an individual on a given network and receive their updates, or you don&#8217;t. This is a binary choice, which is relatively easy. It&#8217;s when the same updates get duplicated into multiple networks that the issue of efficiency is starting to play a role.</p>
<p>Efficiency is a tricky concept &#8211; it depends on the angle from which you are analyzing current situation. Therefore, in economics there is a concept of <a href="http://en.wikipedia.org/wiki/Pareto_efficiency">Pareto efficiency</a>. An outcome is considered Pareto efficient if no one can be made better off without making someone worse off. Pareto-efficient outcomes have two interesting properties that apply to social media as well.</p>
<ol>
<li>There could be multiple Pareto-efficient outcomes. Imagine you and I are walking on the street and see $100 in $10 bills on the floor. We could split it 60-40 or we could split it 70-30 or we could split it 50-50. Each of these outcomes is Pareto efficient by definition. Similarly, I can follow you on Foursquare and get your location updates. Or I can follow you on Twitter and you could configure your Foursquare to cross-post to Twitter, and I will get the same updates.</li>
<li>The fact that an outcome is Pareto efficient doesn&#8217;t necessarily mean it&#8217;s socially desirable or &#8220;the best&#8221; (consider your feelings if we split $100 above $70 for me and $30 to you).</li>
</ol>
<p>We have yet to define &#8220;better off&#8221; in the context of social media. I can think of at least 2 forms here. The first, weaker, form could be &#8220;not miss an update in which one is interested in.&#8221; The second, stronger, form could be &#8220;weaker form + avoid receiving updates in which one is not interested in.&#8221;</p>
<p>Based on all this, it looks to me like what we have now is vendors racing to a weaker-form Pareto-efficient outcome &#8211; every service wants to be your destination for writing status updates and for reading those of your friends, without any regard for you, your wasted time re-reading same things many times, or the fact that most of users would actually prefer a stronger form. If such an outcome is achieved, it may be very difficult to change (because someone will have to be made worse off, by definition) if we want to get to a person-centric model.</p>
<p>What I would like to see instead of cross-posting (which essentially is cross-pushing of the same update to multiple channels) is cross-pulling and filtering &#8211; essentially creating customized activity streams based on reader&#8217;s preferences, not those of publisher. I am concerned however about the present lack of incentives for this behavior to emerge.</p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/05/18/activity-streams-cross-posting-and-pareto-efficiency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developing API Server &#8211; Practical Rules of Thumb</title>
		<link>http://somic.org/2010/05/04/developing-api-server-practical-rules-of-thumb/</link>
		<comments>http://somic.org/2010/05/04/developing-api-server-practical-rules-of-thumb/#comments</comments>
		<pubDate>Tue, 04 May 2010 08:30:57 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[software engineering]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1042</guid>
		<description><![CDATA[I have been doing a lot of reading lately on how one would go about developing an API server. It&#8217;s an interesting topic, with various established schools of thought and multiple real-world implementations to compare against. In this post, I am going to summarize my findings, for my own reference as well as for anyone [...]]]></description>
			<content:encoded><![CDATA[<p>I have been doing a lot of reading lately on how one would go about developing an API server. It&#8217;s an interesting topic, with various established schools of thought and multiple real-world implementations to compare against. In this post, I am going to summarize my findings, for my own reference as well as for anyone who may find themselves in a similar position. These are my rules of thumb geared towards practicality. I may very well be wrong on these &#8211; if your experience tells you this makes no sense, I would love to hear your thoughts in the comments. Most examples and references below are from IaaS space.</p>
<p><strong>Query API vs REST API</strong></p>
<p>To start, one should read <a href="http://gehrcke.de/2009/06/aws-about-api/">this blog post</a> by<strong> </strong>Jan-Philip Gehrcke about various types of AWS APIs and differences between RESTful and query API, and <a href="http://stage.vambenepe.com/archives/863">this blog post</a> by William Vambenepe where he analyzes various IaaS API implementations (it&#8217;s a series of 3 posts). Then read description of <a href="http://martinfowler.com/articles/richardsonMaturityModel.html">Richardson Maturity Model by Martin Fowler</a>.</p>
<p>In a nutshell, I think from practical standpoint, if one&#8217;s domain maps easily to a set of entities (nouns) and API operations on these entities are primarily CRUD, in this case one&#8217;s best bet is to go with at least Level 2 REST. If either doesn&#8217;t work, I&#8217;d go with Level 0 REST, which is essentially what query API is.</p>
<p>My main reason for not going with Level 0 when entities and operations do map, is that I hate to see this meta data go to waste because it doesn&#8217;t cost almost anything to include.</p>
<p>Between Level 2 REST and Level 3 REST, I think Level 2 is more practical. According to Fowler, &#8220;Level 3 introduces discoverability, providing a way of       making a protocol more self-documenting.&#8221; It&#8217;s certainly a nice feature but I am not sure this added benefit justifies extra development effort and slightly increased complexity (some might argue it may actually reduce complexity though).</p>
<p><strong>API frontend vs API methods implementation</strong></p>
<p>Keep implementation of your API methods separate from whatever frontend you are deploying (REST, SOAP, etc). API methods are probably going to be the same no matter how they are called, so they should be frontend-independent. This will make it easier for you to introduce new frontends (AMQP, for example) and should facilitate code maintenance.</p>
<p><strong>HTTP verbs</strong></p>
<p>Read and delete operations are easy &#8211; they map to GET and DELETE.</p>
<p>Create and update are trickier. Canonical description of HTTP verbs can be found in <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html">Section 9 of RFC 2616</a> and I use the table <a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?HttpMethods">here</a> as an addendum. In short, for both create and update, if an operation is idempotent and URI of entity on which this operation is being performed is known, use PUT. Otherwise, use POST (it is often used on entities representing &#8220;factories&#8221; &#8211; say a factory of new postings; you don&#8217;t know URI of a posting before you create it, so you POST to a factory which will create a new entity at a new URI; note that POST is not idempotent).</p>
<p>Note the RFC definition of idempotent methods (9.1.2) &#8211; it&#8217;s not defined as &#8220;multiple invocations must lead to the same result as a single invocation.&#8221; It&#8217;s &#8220;(aside    from error or expiration issues) the side-effects of N &gt; 0  identical    requests is the same as for a single request.&#8221;</p>
<p><strong>HTTP return codes</strong></p>
<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">Section 10 of RFC 2616</a> is a canonical description of HTTP status codes.</p>
<p>Successful completion should be signaled as HTTP 200 OK and, if it&#8217;s important for client to know that an entity was created as a part of operation, HTTP 201 Created. The latter may be redundant &#8211; code that handles 200 and 201 most likely will be identical or very similar.</p>
<p>Speaking of errors, I don&#8217;t think it&#8217;s practical to map each type of error to its own HTTP error  code. Unexpected server side errors (frontend exceptions or uncaught exceptions raised by your API methods) could be HTTP 500 Internal Server Error. If a resource is not found, it should be HTTP 404 Not Found. If your API server uses an external service to perform certain operations and upstream service did not respond or returned an unknown error, I would signal this fact with HTTP 502 Bad Gateway.</p>
<p>The rest of the errors are all client-side, and I like to classify them into 2 categories. When something is wrong with submitted request (missing header, missing argument, argument of wrong type), I think server should return HTTP 400 Bad Request. This way server is telling the client that no matter how many times this request will be submitted, it won&#8217;t work and will produce identical response.</p>
<p>I then group all other client-side errors together and think they should lead to HTTP 403 Forbidden. It means request by itself is fine, but something is preventing server from executing it &#8211; such as a missing prerequisite. Re-submitting the request may work in this case, because by the time the request is re-submitted, something might have happened and prerequisite is already in place.</p>
<p>Error response could include application-level exception and its description &#8211; this way you are letting the client know exactly what was wrong. Whether processing these ends up automated or not &#8211; it&#8217;s up to the client.</p>
<p><strong>Message formats</strong></p>
<p>I can&#8217;t easily justify this one, but I feel that bodies of request and response should be in the same format (there could be exceptions &#8211; for example, when client must upload a binary artifact). vCloud does it this way &#8211; request body is XML, and response is XML. EC2 API sends request arguments in query string (because all requests are GET, since it&#8217;s query API) and response is XML. OCCI API defines request body as form-urlencoded (application/x-www-form-urlencoded) and response is XML as well (all of the above might support JSON as well).</p>
<p>I have 2 weak justifications for this.</p>
<p>Firstly, it somewhat mimics our regular human behavior. If 2 people are communicating in real time, they usually use same medium and same format. It&#8217;s rare when one person is on IM speaking English, while the other is on the phone speaking French &#8211; not saying it&#8217;s impossible but relatively rare.</p>
<p>Secondly, in the future I foresee a greater use of <a href="http://www.rabbitmq.com">messaging</a> in API operations (read <a href="http://broadcast.oreilly.com/2010/02/towards-event-driven-cloud-apis.html">this post</a> by George Reese). Notions of request/response come from HTTP, in messaging it doesn&#8217;t matter &#8211; the same message could be response to one message and request to another. For example, a message requesting server start may lead to a message saying &#8220;server started&#8221; to the client. At the same time, the same &#8220;server started&#8221; message may go to an internal billing system, where it would be a request to start billing.</p>
<p>Having these message in the same format might be beneficial.</p>
<p><strong>Command line tool</strong></p>
<p>AWS set the bar with EC2 here. For every API call, they ship a command line tool to perform said call. No matter what you think whether it&#8217;s right or wrong, I think every provider should match this behavior. It&#8217;s a good practice after all &#8211; when someone is about to try API, it&#8217;s much easier to get going using command line tools instead of embedding API calls straight into the application.</p>
<p>Instead of EC2 practice of one command line tool per API call however (even though inside they still call ec2-cmd), I favor Sun Cloud&#8217;s approach &#8211; they were planning a <a href="http://kenai.com/projects/suncloudapis/pages/CloudCommandClient">single unified tool</a> where an API call would be identified by an option or a subcommand.</p>
<p><strong>Conclusion</strong></p>
<p>As <a href="http://www.python.org/dev/peps/pep-0020/">the Zen of Python</a> goes, &#8220;[...] practicality beats purity.&#8221; This should be your main guiding principle when designing API server side.</p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/05/04/developing-api-server-practical-rules-of-thumb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Probing Ports in Remote Security Groups in EC2</title>
		<link>http://somic.org/2010/03/30/probing-ports-in-remote-security-groups-in-ec2/</link>
		<comments>http://somic.org/2010/03/30/probing-ports-in-remote-security-groups-in-ec2/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 09:00:00 +0000</pubDate>
		<dc:creator>Dmitriy</dc:creator>
				<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[security groups]]></category>

		<guid isPermaLink="false">http://somic.org/?p=1347</guid>
		<description><![CDATA[This is the third part of my series on Amazon EC2 security groups. In part 1, I described how security groups are possibly the most underappreciated feature in EC2. In part 2, I described a UDP hole punching technique, which led to some interesting conclusions.

On several occasions, when troubleshooting a connectivity issue or verifying a [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is the third part of <a href="http://somic.org/tag/security-groups">my series on Amazon EC2 security groups</a>. In <a href="/2009/09/21/security-groups-most-underappreciated-feature-of-amazon-ec2/">part 1</a>, I described how security groups are possibly the most underappreciated feature in EC2. In <a href="/2009/11/02/punching-udp-holes-in-amazon-ec2/">part 2</a>, I described a UDP hole punching technique, which led to some interesting conclusions.<br />
</em></p>
<p>On several occasions, when troubleshooting a connectivity issue or verifying a deployment&#8217;s security, I needed to check local and/or remote security group rules from within my instances. I never have AWS credentials on the instances, so I couldn&#8217;t use the API. And EC2 metadata server (169.254.169.254) returns only the names of security groups, not the rules themselves. In other words, I needed to answer the following question &#8211; &#8220;do remote instance&#8217;s security groups allow or not allow communications from this instance on TCP/UDP port X.&#8221; Note that trying to open a connection and not getting a response doesn&#8217;t answer this question &#8211; packets could be blocked by security groups or by remote instance&#8217;s local firewall (iptables). It turns out there is a way&#8230;</p>
<p>Let me first start with a warning. You probably are OK using this technique against your own instances, or instances of your friends, partners, vendors and customers with their permission and when you know specific ports you need to probe, for verification or troubleshooting purposes. Probing someone else&#8217;s instances or random ports may get you in trouble &#8211; such activities could fall into a category prohibited by <a href="http://aws.amazon.com/aup/">AWS Acceptable Use Policy</a>. <strong>You have been warned.</strong></p>
<p><strong>Summary</strong></p>
<p>This technique works using private IP addresses, so both instances must be running within the same EC2 region.</p>
<p>To check if remote instance&#8217;s security groups allow communications from your instance on UDP port $X, do this:</p>
<p><strong>traceroute -p $X -w 1 -q 1 -m 1 $REMOTE_INSTANCE_PRIVATE_IP</strong></p>
<p>To check if remote instance&#8217;s security groups allow communications from your instance on TCP port $X, do this:</p>
<p><strong>tcptracerute -w 1 -q 1 -m 1 $REMOTE_INSTANCE_PRIVATE_IP $X</strong></p>
<p>(tcptraceroute is not a standard tool installed by default; you can get it from <a href="http://michael.toren.net/code/tcptraceroute/">here</a> or <em>apt-get install tcptraceroute</em> on Debian or Ubuntu)</p>
<p>If you see &#8220;<strong><em>1 {IP address of first hop} XX.XXX ms</em></strong>&#8220;, remote instance&#8217;s security groups allow such communications from your private IP address. If you see <strong>&#8220;<em>1 *</em></strong>&#8220;, they don&#8217;t.</p>
<p><strong>Background</strong></p>
<p>This technique is based on one of the conclusions of my <a href="http://somic.org/2009/11/02/punching-udp-holes-in-amazon-ec2/">UDP hole punching post</a>.</p>
<p>In it, it looked to me like each dom0 in the region knows about all security group rules in this region. Additionally, it looked like when dom0 knows that remote dom0 will not accept traffic, it doesn&#8217;t bother even sending it. If we <a href="http://openfoo.org/blog/amazon_ec2_underlying_architecture.html">assume they do it on dom0 with iptables</a>, they probably simply DROP such traffic (at least I would if I were them). And if they do, they won&#8217;t send <a href="http://en.wikipedia.org/wiki/ICMP_Time_Exceeded">ICMP Time Exceeded</a> packet back to us &#8211; and hence, traceroute won&#8217;t be able to report the first hop.</p>
<p>If we do get that ICMP packet from dom0 back, it means it didn&#8217;t drop our packet. Which means it knows the other dom0 currently has a rule in security groups allowing it.</p>
<p>I set max_ttl to 1, since first hop in traceroute is believed to represent dom0.</p>
<p>Obviously, I verified this theoretical hypothesis on a pair of EC2 instances in us-east-1, and didn&#8217;t see any indication that it could be wrong.</p>
<p><strong>Protecting Against Such Probes</strong></p>
<p>If you have instances in EC2, you may be wondering if you could somehow protect them from such probes. After all, AWS network monitoring is top-notch, but they have a lot of hosts to watch over, so some small amount of probing may still occur and you may not even know it.</p>
<p>I&#8217;ve got good and bad news on this front. The good news is that you can do it, the bad news is it&#8217;s going to be ugly. Essentially, to avoid disclosing the ports open in your security groups to such probes, you must configure your security groups not to allow connections from arbitrary instances in your EC2 region. In other words, you must exclude 10.0.0.0/8 from all IP-address-based rules (rules granting access by name of security group are not affected). It means that you have to replace each rule that references 0.0.0.0/0 with multiple rules individually referencing 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 1.0.0.0/5 (I would avoid 0.0.0.0 just in case &#8211; hence 1 as first octet), 12.0.0.0/6, 8.0.0.0/7 and 11.0.0.0/8. Yep, 8 rules instead of 1. You have to also repeat the same exercise for all IP subnets referenced in your rules that include 10.0.0.0/8.</p>
<p><strong>Conclusion</strong></p>
<p>In the future, of course, I hope security groups API could be extended to support functionality &#8220;allow connections from Internet excluding private IPs in this region&#8221;. I am going to add it to my <a href="http://somic.org/2009/09/21/security-groups-most-underappreciated-feature-of-amazon-ec2/">previous wishlist</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://somic.org/2010/03/30/probing-ports-in-remote-security-groups-in-ec2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
