Skip to main content

A friendly http interface to the aws api

Project description

a friendly http interface to the ec2 api

Requirements

  • Vagrant

  • VMWare Fusion

  • 1 gigabytes of free ram

  • Python 2.7.8 or below due to a bug in 2.7.9 SSL

Installation

OS X Users are assumed to be running homebrew. Please set that up before continuing. Our makefile should install everything necessary to run this service within a Ubuntu 14.04 or Mac OS X 10.9+ environment.

On a VM

Once you have vagrant and virtualbox installed, you can bring up a vm with the service installed:

cd path/to/haldane
vagrant up

By default, this will use vmware_fusion as the vagrant provider, though using you can also use virtualbox:

vagrant up --provider virtualbox

Manually

You will need to setup a few system-level dependencies first. You can do this using the following make target:

# install system-level dependencies first
# may ask for sudo permissions to install certain packages
make requirements

# now create a python virtual environment with all the required packages
# will ask for sudo permissions to install virtualenv if it is not available
# the path is set to ``.virtualenv`` by default, though we respect
# the following environment variables:
# - ``WORKON_HOME``
# - ``VIRTUALENV_PATH``
make venv

# activate the virtualenv:
eval $(make venv-activate)

# to deactivate the virtualenv, run the following command:
deactivate

# for more actions you can perform, just run the ``make`` or ``make help`` commands

Running

You can ssh onto the box and run the webservice:

vagrant ssh
source .env && make server

The webservice will now be running and exposed to the host machine at http://localhost:5000

> Note that you may wish to change the configuration in use. You can do so by modifying the .env.test file with your configuration.

Configuration

All configuration is set via environment variables. The following environment variables are available for use:

  • ALLOWED_IPS: (Default: None) A comma-separated list of ip addresses that can basic authentication.

  • ALTERNATIVE_AUTOSCALE_TAG_NAME: (Default: None) A tag that can be used as an alternative to the AWS group name to categorize instances.

  • AWS_API_VERSION: (Default: 2016-09-15) The default api version to use when retrieving instance type.

  • AWS_ACCESS_KEY_ID: (Default: None) An AWS access key id

  • AWS_REGIONS: (Default: us-east-1) A comma-separated list of regions to query for.

  • AWS_SECRET_ACCESS_KEY: (Default: None) An AWS secret access key

  • BASIC_AUTH: (Default: None) A list of basic auth user/password combinations. The format for each is username:password.

  • BOOLEAN_AWS_TAG_ATTRIBUTES: (Default: None) A comma-separated list of instance tags that will be pulled out as top-level instance attributes set and converted into booleans.

  • BUGSNAG_API_KEY: (Default: None) An api key for reporting errors to bugsnag.

  • CACHE_EXPIRATION: (Default: 180) Time in seconds until a cached AWS api retrieval expires.

  • CACHE_SIZE: (Default: 1024) Max number of items to cache in the LRU cache. Can be safely set to 2.

  • DEBUG: (Default: 0) Whether to turn on debug mode or not.

  • LISTEN_INTERFACE: (Default: 0.0.0.0) The interface which the server will bind to.

  • PORT: (Default: 5000) Server port.

  • SENTRY_DSN: (Default: None) An DSN for reporting errors to sentry.

  • TOP_LEVEL_AWS_TAG_ATTRIBUTES: (Default: None) A comma-separated list of instance tags that will be pulled out as top-level instance attributes set.

The AWS policy is fairly small, and an iam-profile.json is provided in this repository in the case that you wish to lock down permissions to only those necessary.

Endpoints

  • /: Healthcheck

  • /_status: Healthcheck

  • /amis?q=<query>&limit=<limit>: List all amis owned by the user specified by the AWS credentials. - format (optional): If set to list, turns ami attributes from an object indexed by the name key to a list of those objects. Can also be set to csv. Defaults to dict. - id (optional): An image id to filter by (eg. ami-21e750d9) - query (optional): Substring to search ami names by before returning the resultset - region (optional): Filter to a specific region

  • /instance-types/<api-version>: List all instance types available for a specific api version (version is optional).

  • /instances/<region>?q=<query>&limit=<limit>&status=<status>&group=<group>: List all nodes - format (optional): If set to list, turns node attributes from an object indexed by the name key to a list of those objects. Can also be set to csv. Defaults to dict. - limit (optional): An integer to limit the resultset by - query (optional): Substring to search the name field by before returning the resultset

  • /instances/group/<group>?region=<region>&query=<query>&status=<status>: List all nodes grouped by autoscale group - format (optional): If set to list, turns node attributes from an object indexed by the name key to a list of those objects. - query (optional): Substring to search node names by before returning the resultset

  • /rds-instances/<region>?q=<query>&limit=<limit>&status=<status>: List all nodes - format (optional): If set to list, turns node attributes from an object indexed by the name key to a list of those objects. Can also be set to csv. Defaults to dict. - limit (optional): An integer to limit the resultset by - query (optional): Substring to search the name field by before returning the resultset

Filters

Field values that are exactly one of the following strings are transformed into their language “equivalents”:

  • none

  • nil

  • true

  • false

    The values are lowercased before the check is performed.

The following attributes filters are globally available:

  • availability_zone (optional): An availability zone to filter by (eg. us-east-1a)

  • id (optional): An instance id to filter by (eg. i-21e750d9)

  • name (optional): A name to filter by (eg. graphite-ec2-01)

  • region (optional): Filter to a specific region (eg. us-east-1)

  • status (optional): Filter to specific node status (eg. terminated)

The following attribute filters are available for the /instances and /instances/group endpoints:

  • elastic_ip (optional): Whether or not to filter to just instances with an elastic_ip

  • group (optional): An autoscale group name to filter by

  • image_id (optional): An image id to filter by (eg. ami-123abc4d)

  • image_name (optional): An image name to filter by (eg. BaseAMI)

  • instance_type (optional): Filter to a specific instance type (eg. t2.large)

  • instance_class (optional): Filter to a specific instance type (eg. t2)

  • instance_profile_id (optional): Filter to a specific instance profile id (eg. O34RQ3IUIO3FOUI3F)

  • instance_profile_name (optional): Filter to a specific instance profile name (eg. Production-Api)

  • ip_address (optional): Filter to a specific private ip address (eg. 54.10.2.20)

  • private_ip_address (optional): Filter to a specific private ip address (eg. 10.10.2.20)

  • vpc_id (optional): Filter to specific vpc (eg. vpc-8675309)

The following attribute filters are available for the /rds-instances endpoint:

  • allocated_storage (optional)

  • auto_minor_version_upgrade (optional)

  • backup_retention_period (optional)

  • ca_certificate_identifier (optional)

  • copy_tags_to_snapshot (optional)

  • db_instance_arn (optional)

  • db_instance_class (optional)

  • db_instance_port (optional)

  • db_instance_status (optional)

  • db_name (optional)

  • dbi_resource_id (optional)

  • engine (optional)

  • engine_version (optional)

  • enhanced_monitoring_resource_arn (optional)

  • license_model (optional)

  • master_username (optional)

  • monitoring_interval (optional)

  • monitoring_role_arn (optional)

  • multi_az (optional)

  • preferred_backup_window (optional)

  • preferred_maintenance_window (optional)

  • publicly_accessible (optional)

  • secondary_availability_zone (optional)

  • storage_encrypted (optional)

  • storage_type (optional)

Field Filtering

Fields in the response body can be filtered using the fields querystring argument. Fields are a comma-separated list of any of the attributes already returned. Tags cannot be filtered on a per-tag basis, though you may choose to include or exclude the tags attribute entirely.

curl http://localhost:5000/instances?fields=id,image_name

Complex Filters

Filtering is performed after retrieving results from the EC2 API. The following are valid filters:

  • exact: performs an exact match on the value of the tag name

  • in-list: splits the tag value by comma and verifies that the passed value is in the resulting list

  • is-null: checks if the value is null

  • is-true: checks if the value is true

  • is-false: checks if the value is false

  • substring: performs a substring match on the value of the tag name

  • ends-with: performs a match using endswith on the value of the tag name

  • starts-with: performs a match using startswith on the value of the tag name

  • not-in-list: splits the tag value by comma and verifies that the passed value is not in the resulting list

  • not-substring: performs an inverse substring match on the value of the tag name

  • not-ends-with: performs an inverse match using endswith on the value of the tag name

  • not-starts-with: performs an inverse match using startswith on the value of the tag name

A simple example is as follows

curl http://localhost:5000/instances?substring.name=www

Tag Filtering

You can also filter by tags by using the tags.FILTER.TAG_NAME querystring pattern as follows:

curl http://localhost:5000/instances?tags.exact.bootstrapped=true&tags.substring.Name=admin

You may also specify an exact match filter when omitting the FILTER section like so:

curl http://localhost:5000/instances?tags.bootstrapped=true

Filtering by the status field

Valid status values are as follows:

  • pending

  • running

  • shutting-down

  • terminated

  • stopping

  • stopped

curl http://localhost:5000/instances?status=running

Errors

If an invalid querystring argument is passed, a json response similar to the following will be sent from the service:

{
  detail: "Invalid region querystring argument passed.",
  status: 400,
  title: "Invalid argument passed"
}

The following errors are possible:

  • Invalid region querystring argument

  • Invalid status querystring argument

  • General EC2ResponseError

How it works

This services uses boto3 underneath to provide an api listing all nodes available in a given EC2 account. It is intended to be used as a replacement for hitting the EC2 api directly, as that can be slow at times.

Caveats

When using the /instances or /instances/group endpoints with a format of dict, the response is keyed by the Name tag of the ec2 instance. If you have multiple servers with the same value for the Name tag, this may result in “hidden” servers. If a server is not running, it will be hidden by default, otherwise it may overwrite the previous entry. This will both be logged in the haldane logging output and will be surfaced as meta.hidden_nodes, regardless of the endpoint being used.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

haldane-0.3.0.tar.gz (16.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

haldane-0.3.0-py2-none-any.whl (22.8 kB view details)

Uploaded Python 2

File details

Details for the file haldane-0.3.0.tar.gz.

File metadata

  • Download URL: haldane-0.3.0.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for haldane-0.3.0.tar.gz
Algorithm Hash digest
SHA256 e3e85b439c5c6282efe8336d30f7d4ee90b4433bfce4be416cd6d174d648b33d
MD5 29189cb164ae2b07ae10d3991b55032b
BLAKE2b-256 08055917a8e83473540a213060e2b17787660e934129b227b27967ab881934b8

See more details on using hashes here.

File details

Details for the file haldane-0.3.0-py2-none-any.whl.

File metadata

File hashes

Hashes for haldane-0.3.0-py2-none-any.whl
Algorithm Hash digest
SHA256 887ddca387f45f63db22a2a811bc0c91662d7df5baf539eca8c04dbf08e48194
MD5 8fff3c4e6b4833fd402d02d41c3c3066
BLAKE2b-256 8615e0eb28dfcc221bbbd212c9c02a51f0d3d5a9f211b9fea7317388f7d76003

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page