title: EC2, bottle.py connection
body: <p>Not able to launch a bottle.py server using an EC2 Ubuntu Linux 12.04 instance with a public IP address.  The program (hw.py) is from the bottle tutorial ie.</p>
  
  <pre><code>from bottle import route, run
  
  @route('/hello')
  def hello():
      return 'hello world'
  
  run(host='xxx.xxx.xxx.xxx', port=80)
  </code></pre>
  
  <p>Run as:</p>
  
  <pre><code>&gt; python hw.py
  or
  &gt; sudo python hw.py
  </code></pre>
  
  <p>generates the error:</p>
  
  <pre><code>Traceback (most recent call last):
    File "hw.py", line 7, in &lt;module&gt;
      run(host='xxx.xxx.xxx.xxx', port=80)
    File "/usr/local/lib/python2.7/dist-packages/bottle.py", line 2700, in run
      server.run(app)
    File "/usr/local/lib/python2.7/dist-packages/bottle.py", line 2382, in run
      srv = make_server(self.host, self.port, handler, **self.options)
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 144, in make_server
      server = server_class((host, port), handler_class)
    File "/usr/lib/python2.7/SocketServer.py", line 408, in __init__
      self.server_bind()
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 48, in server_bind
      HTTPServer.server_bind(self)
    File "/usr/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
      SocketServer.TCPServer.server_bind(self)
    File "/usr/lib/python2.7/SocketServer.py", line 419, in server_bind
      self.socket.bind(self.server_address)
    File "/usr/lib/python2.7/socket.py", line 224, in meth
      return getattr(self._sock,name)(*args)
  socket.error: [Errno 99] Cannot assign requested address
  </code></pre>
  
  <p>The EC2 public IP address is not attached to any other process.  Port 80 is not attached to another process.</p>
  
  <pre><code>&gt; sudo netstat -lp
  Active Internet connections (only servers)
  Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
  tcp        0      0 *:ssh                   *:*                     LISTEN      629/sshd
  tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      629/sshd
  udp        0      0 *:bootpc                *:*                                 463/dhclient3
  Active UNIX domain sockets (only servers)
  Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
  unix  2      [ ACC ]     STREAM     LISTENING     7190     667/dbus-daemon     /var/run/dbus/system_bus_socket
  unix  2      [ ACC ]     STREAM     LISTENING     5888     1/init              @/com/ubuntu/upstart
  unix  2      [ ACC ]     STREAM     LISTENING     7312     741/acpid           /var/run/acpid.socket
  unix  2      [ ACC ]     SEQPACKET  LISTENING     26855    21843/udevd         /run/udev/control
  </code></pre>
  
  <p>Changing to: run(host='xxx.xxx.xxx.xxx', port=8080)</p>
  
  <p>The error is socket.error: [Errno 99] Cannot assign requested address.</p>
  
  <p>Changing to: run(host='0.0.0.0', port=8080)</p>
  
  <p>... which binds the server to all IPs/interfaces.  Typing the EC2 public IP address into browser with and without :8080 displays a "This page is not available".</p>
  
  <p>Ideally, the first option ie. run(host='xxx.xxx.xxx.xxx', port=80) should work as that is how other web servers are kicked-off.  Anyone have ideas how to solve this one?</p>
  
  <p>EDIT: added last set of lines from strace -f:</p>
  
  <pre><code>write(2, "  File \"/usr/lib/python2.7/Socke"..., 70  File "/usr/lib/python2.7/SocketServer.py", line 419, in server_bind
  ) = 70
  open("/usr/lib/python2.7/SocketServer.py", O_RDONLY) = 4
  fstat(4, {st_mode=S_IFREG|0644, st_size=23321, ...}) = 0
  mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f434cbfe000
  read(4, "\"\"\"Generic socket server classes"..., 4096) = 4096
  read(4, "service) is to maintain an\nexpli"..., 4096) = 4096
  read(4, "set()\n\n    def shutdown(self):\n "..., 4096) = 4096
  read(4, "n't use serve_forever()\n    - fi"..., 4096) = 4096
  write(2, "    ", 4    )                     = 4
  write(2, "self.socket.bind(self.server_add"..., 38self.socket.bind(self.server_address)
  ) = 38
  close(4)                                = 0
  munmap(0x7f434cbfe000, 4096)            = 0
  write(2, "  File \"/usr/lib/python2.7/socke"..., 57  File "/usr/lib/python2.7/socket.py", line 224, in meth
  ) = 57
  open("/usr/lib/python2.7/socket.py", O_RDONLY) = 4
  fstat(4, {st_mode=S_IFREG|0644, st_size=20485, ...}) = 0
  mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f434cbfe000
  read(4, "# Wrapper module for _socket, pr"..., 4096) = 4096
  read(4, "oo long.\"\n    errorTab[10064] = "..., 4096) = 4096
  write(2, "    ", 4    )                     = 4
  write(2, "return getattr(self._sock,name)("..., 39return getattr(self._sock,name)(*args)
  ) = 39
  close(4)                                = 0
  munmap(0x7f434cbfe000, 4096)            = 0
  write(2, "socket", 6socket)                   = 6
  write(2, ".", 1.)                        = 1
  write(2, "error", 5error)                    = 5
  write(2, ": ", 2: )                       = 2
  write(2, "[Errno 99] Cannot assign request"..., 42[Errno 99] Cannot assign requested address) = 42
  write(2, "\n", 1
  )                       = 1
  rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f434c7d1cb0}, {0x41d920, [], SA_RESTORER, 0x7f434c7d1cb0}, 8) = 0
  close(3)                                = 0
  exit_group(1)                           = ?
  </code></pre>