diff --git a/README.md b/README.md
index 10d135565a0b3a50e68a373efb175d23599fb850..cbbd2b8c68fe76d536d2405dbee7f30cc51ee833 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,7 @@ To deploy the cluster you can use :
 *  [Ansible variables](docs/ansible.md)
 *  [Cloud providers](docs/cloud.md)
 *  [OpenStack](docs/openstack.md)
+*  [AWS](docs/aws.md)
 *  [Network plugins](#network-plugins)
 *  [Roadmap](docs/roadmap.md)
 
diff --git a/docs/aws.md b/docs/aws.md
new file mode 100644
index 0000000000000000000000000000000000000000..1070958b99f89474754f536862890e6d6c51bb1c
--- /dev/null
+++ b/docs/aws.md
@@ -0,0 +1,10 @@
+AWS
+===============
+
+To deploy kubespray on [AWS](https://www.openstack.org/) uncomment the `cloud_provider` option in `group_vars/all.yml` and set it to `'aws'`.
+
+Prior to creating your instances, you **must** ensure that you have created IAM roles and policies for both "kubernetes-master" and "kubernetes-node". You can find the IAM policies [here](https://github.com/kubernetes/kubernetes/tree/master/cluster/aws/templates/iam). See the [IAM Documentation](https://aws.amazon.com/documentation/iam/) if guidance is needed on how to set these up. When you bring your instances online, associate them with the respective IAM role. Nodes that are only to be used for Etcd do not need a role.
+
+The next step is to make sure the hostnames in your `inventory` file are identical to your internal hostnames in AWS. This may look something like `ip-111-222-333-444.us-west-2.compute.internal`. You can then specify how Ansible connects to these instances with `ansible_ssh_host` and `ansible_ssh_user`.
+
+You can now create your cluster!
diff --git a/roles/kubernetes/master/templates/manifests/kube-apiserver.manifest.j2 b/roles/kubernetes/master/templates/manifests/kube-apiserver.manifest.j2
index 7961ac36fb4dcba2eae336695db66a1b1e08cbef..2f69666d8b2e5bfc5785905588def4f255c6f23d 100644
--- a/roles/kubernetes/master/templates/manifests/kube-apiserver.manifest.j2
+++ b/roles/kubernetes/master/templates/manifests/kube-apiserver.manifest.j2
@@ -35,6 +35,8 @@ spec:
 {% if cloud_provider is defined and cloud_provider == "openstack" %}
     - --cloud-provider={{ cloud_provider }}
     - --cloud-config={{ kube_config_dir }}/cloud_config
+{% elif cloud_provider is defined and cloud_provider == "aws" %}
+    - --cloud-provider={{ cloud_provider }}
 {% endif %}
     - 2>&1 >> {{ kube_log_dir }}/kube-apiserver.log
     volumeMounts:
diff --git a/roles/kubernetes/master/templates/manifests/kube-controller-manager.manifest.j2 b/roles/kubernetes/master/templates/manifests/kube-controller-manager.manifest.j2
index 32eeca0b4bb131668042284934d71eb9b08af8a0..3a9e1ef1b2e0d1475924ea65ba38f49931c1e6a3 100644
--- a/roles/kubernetes/master/templates/manifests/kube-controller-manager.manifest.j2
+++ b/roles/kubernetes/master/templates/manifests/kube-controller-manager.manifest.j2
@@ -18,8 +18,10 @@ spec:
     - --enable-hostpath-provisioner={{ kube_hostpath_dynamic_provisioner }}
     - --v={{ kube_log_level | default('2') }}
 {% if cloud_provider is defined and cloud_provider == "openstack" %}
-    - --cloud-provider=openstack
+    - --cloud-provider={{cloud_provider}}
     - --cloud-config={{ kube_config_dir }}/cloud_config
+{% elif cloud_provider is defined and cloud_provider == "aws" %}
+    - --cloud-provider={{cloud_provider}}
 {% endif %}
     livenessProbe:
       httpGet:
diff --git a/roles/kubernetes/node/templates/kubelet.j2 b/roles/kubernetes/node/templates/kubelet.j2
index bab27305ec336a8eb9f28b980c0c5b42227e3a7c..c7d20c42042e175e0a99dea1dca68800e7ae64fa 100644
--- a/roles/kubernetes/node/templates/kubelet.j2
+++ b/roles/kubernetes/node/templates/kubelet.j2
@@ -33,8 +33,9 @@ DOCKER_SOCKET="--docker-endpoint=unix:/var/run/weave/weave.sock"
 KUBE_ALLOW_PRIV="--allow-privileged=true"
 {% if cloud_provider is defined and cloud_provider == "openstack" %}
 KUBELET_CLOUDPROVIDER="--cloud-provider={{ cloud_provider }} --cloud-config={{ kube_config_dir }}/cloud_config"
+{% elif cloud_provider is defined and cloud_provider == "aws" %}
+KUBELET_CLOUDPROVIDER="--cloud-provider={{ cloud_provider }}"
 {% else %}
-{# TODO: gce and aws don't need the cloud provider to be set? #}
 KUBELET_CLOUDPROVIDER=""
 {% endif %}
 {% if ansible_service_mgr in ["sysvinit","upstart"] %}