From 33c96c4ac5af43aad6d15e9f960903e06a0cf5e6 Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Wed, 3 Nov 2021 17:20:01 -0500 Subject: [PATCH 1/8] docs: ECS graceful shutdown docs for GA --- website/content/docs/ecs/architecture.mdx | 136 ++++++++++++++++++++++ website/public/img/ecs-task-shutdown.svg | 4 + 2 files changed, 140 insertions(+) create mode 100644 website/public/img/ecs-task-shutdown.svg diff --git a/website/content/docs/ecs/architecture.mdx b/website/content/docs/ecs/architecture.mdx index 2dcfcbf689..106bd1307c 100644 --- a/website/content/docs/ecs/architecture.mdx +++ b/website/content/docs/ecs/architecture.mdx @@ -39,6 +39,142 @@ This diagram shows the timeline of a task starting up and all its containers: - **T1:** The `sidecar-proxy` container starts. It runs Envoy by executing `envoy -c `. - **T2:** The `sidecar-proxy` container is marked as healthy by ECS. It uses a health check that detects if its public listener port is open. At this time, your application containers are started since all Consul machinery is ready to service requests. The only running containers are `consul-client`, `sidecar-proxy`, and your application container(s). +### Task Shutdown + +Graceful shutdown is supported when deploying Consul on ECS, which means the following: + +* No incoming traffic from the mesh is directed to this task during shutdown. +* Outgoing traffic to the mesh is possible during shutdown. + +This diagram shows an example timeline of a task shutting down: + +Task Shutdown Timeline + +- **T0**: ECS sends a TERM signal to all containers. + - `consul-client` begins to gracefully leave the Consul cluster, since it is configured with `leave_on_terminate = true` + - `health-sync` stops syncing health status from ECS into Consul checks. + - `sidecar-proxy` ignores the TERM signal and continues running until it notices that `user-app` container has exited. This allows the application container to continue to make outgoing requests through the proxy to the mesh. This possible due to an entrypoint override for the container, `consul-ecs envoy-entrypoint`. + - `user-app` exits since, in this example, it does not intercept the TERM signal +- **T1**: + - `health-sync` updates its Consul checks to critical status, and then exits. This ensures this service instance is marked unhealthy. + - The `sidecar-proxy` container checks the ECS task metadata. It notices the `user-app` container has stopped, and exits. +- **T2**: + - `consul-client` finishes leaving the Consul cluster and exits + - Updates about this task have reached the rest of the Consul cluster, which means downstream proxies are updated to stop sending traffic to this task. +- **T3**: All containers have exited + - `consul-client` finishes gracefully leaving the Consul datacenter and exits. + - ECS notices all containers have exited, and will soon put change the Task status to `STOPPED` +- **T4**: (Not applicable to this example, but if any conatiners are still running at this point, ECS forcefully stops them by sending a KILL signal) + +#### Task Shutdown: Completely Avoiding Application Errors + +Because Consul service mesh is a distributed, eventually consistent system that is subject to network latency, it is hard to achieve a perfect graceful shutdown. + +In particular, you may have noticed the following issue in example above, where it is possible that an application that has exited still receives incoming traffic: + +* The `user-app` container exits in **T0** +* Afterwards in **T2**, downstream services are updated to no longer send traffic to this task + +As a result, downstream applications will see errors when requests are directed to this instance. This can occur for a short period (seconds or less) at the beginning of task shutdown, until the rest of the Consul cluster knows to avoid sending traffic to this instance. + +Here are a couple of approaches to address this issue: + +1. Modify your application container continue running for a short period of time into task shutdown. By doing this, the application is running to respond to incoming requests successfully at the beginning of task shutdown. This allows time for the Consul cluster to update downstream proxies to stop sending traffic to this task. + + One way to accomplish this with an entrypoint override for your application container which ignores the TERM signal sent by ECS. Here is an example shell script: + + ```bash + # Run the provided command in a background subprocess. + $0 "$@" & + export PID=$! + + onterm() { + echo "Caught sigterm. Sleeping 10s..." + sleep 10 + exit 0 + } + + onexit() { + if [ -n "$PID" ]; then + kill $PID + wait $PID + fi + } + + trap onterm TERM + trap onexit EXIT + wait $PID + ``` + + This script runs the application in a subprocess. It uses a `trap` to intercept the TERM signal. It then sleeps for ten seconds before exiting normally. This allows the application process to continue running after receiving the TERM signal. + + If this script is saved as `./app-entrypoint.sh`, then you can use it for your ECS tasks using the `mesh-task` Terraform module: + + ```hcl + module "my_task" { + source = "hashicorp/consul-ecs/aws//modules/mesh-task" + version = "" + container_definitions = [ + { + name = "my-app" + image = "..." + entryPoint = ["/bin/sh", "-c", file("./app-entrypoint.sh")] + command = ["python", "manage.py", "runserver", "127.0.0.1:8080"] + ... + } + ... + } + ``` + + This example sets the `entryPoint` for the container, which overrides the default entrypoint from the image. When the container starts in ECS, the `command` list is passed as arguments to the `entryPoint` command. Putting this together, the container would start with the command, `/bin/sh -c "" python manage.py runserver 127.0.0.1:8080`. + +2. If the traffic is HTTP(S), you can enable retry logic through Consul Connect [Service Router](/docs/connect/config-entries/service-router). This will configure proxies retry when receiving an error. When Envoy receives a failed request an upstream service, it can retry the request to a different instance of that service that may be able to respond successfully. + + To enable retries through Service Router for a service named `example`, first ensure the configured protocol to `http`: + + ```hcl + Kind = "service-defaults" + Name = "example" + Protocol = "http" + ``` + + The apply the config entry: + + ```shell-session + $ consul config write example-defaults.hcl + ``` + + The add retry settings for the service: + + ```hcl + Kind = "service-router" + Name = "example" + Routes = [ + { + Match { + HTTP { + PathPrefix = "/" + } + } + Destination { + NumRetries = 5 + RetryOnConnectFailure = true + RetryOnStatusCodes = [503] + } + } + ] + ``` + + To apply this, run the following: + + ```shell-session + $ consul config write example-router.hcl + ``` + + This Service Router configuration sets the `PathPrefix = "/"` which will match all requests to the `example` service. It sets the `NumRetries`, `RetryOnConnectFailure`, and `RetryOnStatusCodes = [503]` fields, so that incoming requests are retried. We've seen Envoy return a 503 when its application container has exited, but it is possible there could be other error codes dependening on your environment. + + See the Consul Connect [Configuration Entries](/docs/connect/config-entries/index) documentation for more detail. + ### Automatic ACL Token Provisioning Consul ACL tokens secure communication between agents and services. diff --git a/website/public/img/ecs-task-shutdown.svg b/website/public/img/ecs-task-shutdown.svg new file mode 100644 index 0000000000..225fb156c9 --- /dev/null +++ b/website/public/img/ecs-task-shutdown.svg @@ -0,0 +1,4 @@ + + + +
consul-client
consul-client
health-sync
health-sync
sidecar-proxy
sidecar-proxy
user-app
user-app
T0
(TERM)
T0...
T1
T1
T2
T2
T3
T3
T4
(KILL)
T4...
Viewer does not support full SVG 1.1
\ No newline at end of file From 089a699bc404b9ae7f50d15bdb5100ef9b8d0a90 Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Fri, 12 Nov 2021 14:05:41 -0600 Subject: [PATCH 2/8] docs: Apply suggestions to ecs docs from code review Co-authored-by: Eric Haberkorn Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/content/docs/ecs/architecture.mdx | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/website/content/docs/ecs/architecture.mdx b/website/content/docs/ecs/architecture.mdx index 106bd1307c..256bd994f0 100644 --- a/website/content/docs/ecs/architecture.mdx +++ b/website/content/docs/ecs/architecture.mdx @@ -41,7 +41,7 @@ This diagram shows the timeline of a task starting up and all its containers: ### Task Shutdown -Graceful shutdown is supported when deploying Consul on ECS, which means the following: +Graceful shutdown is supported when deploying Consul on ECS, which is done by the following: * No incoming traffic from the mesh is directed to this task during shutdown. * Outgoing traffic to the mesh is possible during shutdown. @@ -63,25 +63,25 @@ This diagram shows an example timeline of a task shutting down: - Updates about this task have reached the rest of the Consul cluster, which means downstream proxies are updated to stop sending traffic to this task. - **T3**: All containers have exited - `consul-client` finishes gracefully leaving the Consul datacenter and exits. - - ECS notices all containers have exited, and will soon put change the Task status to `STOPPED` + - ECS notices all containers have exited, and will soon change the Task status to `STOPPED` - **T4**: (Not applicable to this example, but if any conatiners are still running at this point, ECS forcefully stops them by sending a KILL signal) #### Task Shutdown: Completely Avoiding Application Errors -Because Consul service mesh is a distributed, eventually consistent system that is subject to network latency, it is hard to achieve a perfect graceful shutdown. +Consul service mesh is a distributed and eventually-consistent system subject to network latency, so gracefully shutting down Consul is not always successful. -In particular, you may have noticed the following issue in example above, where it is possible that an application that has exited still receives incoming traffic: +In some cases, an exited application can receive incoming traffic. The following example of this behavior draws on the timeline described above: * The `user-app` container exits in **T0** -* Afterwards in **T2**, downstream services are updated to no longer send traffic to this task +* During **T2**, downstream services are updated to stop sending traffic to this task. -As a result, downstream applications will see errors when requests are directed to this instance. This can occur for a short period (seconds or less) at the beginning of task shutdown, until the rest of the Consul cluster knows to avoid sending traffic to this instance. +As a result, downstream applications will report errors when requests are directed to this instance. Errors can be reported for a short period (seconds or less) at the beginning of task shutdown. Applications will stop reporting errors when all nodes in the Consul cluster have instructions to stop sending traffic to this instance. -Here are a couple of approaches to address this issue: +Use the following methods to resolve this issue: -1. Modify your application container continue running for a short period of time into task shutdown. By doing this, the application is running to respond to incoming requests successfully at the beginning of task shutdown. This allows time for the Consul cluster to update downstream proxies to stop sending traffic to this task. +1. Modify your application container to continue running for a short period of time into task shutdown. By doing this, the application continues responding to incoming requests successfully at the beginning of task shutdown. This allows time for the Consul cluster to update downstream proxies to stop sending traffic to this task. - One way to accomplish this with an entrypoint override for your application container which ignores the TERM signal sent by ECS. Here is an example shell script: + You can accomplish this by using an entrypoint override for your application container. Entrypoint overrides ignore the TERM signal sent by ECS. The following shell script contains an entrypoint override: ```bash # Run the provided command in a background subprocess. @@ -130,7 +130,7 @@ Here are a couple of approaches to address this issue: 2. If the traffic is HTTP(S), you can enable retry logic through Consul Connect [Service Router](/docs/connect/config-entries/service-router). This will configure proxies retry when receiving an error. When Envoy receives a failed request an upstream service, it can retry the request to a different instance of that service that may be able to respond successfully. - To enable retries through Service Router for a service named `example`, first ensure the configured protocol to `http`: + To enable retries through Service Router for a service named `example`, first ensure the configured protocol is `http`: ```hcl Kind = "service-defaults" @@ -138,13 +138,13 @@ Here are a couple of approaches to address this issue: Protocol = "http" ``` - The apply the config entry: + Apply the config entry: ```shell-session $ consul config write example-defaults.hcl ``` - The add retry settings for the service: + Add retry settings for the service: ```hcl Kind = "service-router" From 03d4deeaa399462826353f901269e4a684c98c4c Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Mon, 15 Nov 2021 12:54:24 -0600 Subject: [PATCH 3/8] docs: ECS graceful shutdown refinements --- website/content/docs/ecs/architecture.mdx | 134 ++-------------------- 1 file changed, 9 insertions(+), 125 deletions(-) diff --git a/website/content/docs/ecs/architecture.mdx b/website/content/docs/ecs/architecture.mdx index 256bd994f0..db3e8760d2 100644 --- a/website/content/docs/ecs/architecture.mdx +++ b/website/content/docs/ecs/architecture.mdx @@ -41,139 +41,23 @@ This diagram shows the timeline of a task starting up and all its containers: ### Task Shutdown -Graceful shutdown is supported when deploying Consul on ECS, which is done by the following: - -* No incoming traffic from the mesh is directed to this task during shutdown. -* Outgoing traffic to the mesh is possible during shutdown. - This diagram shows an example timeline of a task shutting down: Task Shutdown Timeline -- **T0**: ECS sends a TERM signal to all containers. - - `consul-client` begins to gracefully leave the Consul cluster, since it is configured with `leave_on_terminate = true` +- **T0**: ECS sends a TERM signal to all containers. Each container reacts to the TERM signal: + - `consul-client` begins to gracefully leave the Consul cluster. - `health-sync` stops syncing health status from ECS into Consul checks. - - `sidecar-proxy` ignores the TERM signal and continues running until it notices that `user-app` container has exited. This allows the application container to continue to make outgoing requests through the proxy to the mesh. This possible due to an entrypoint override for the container, `consul-ecs envoy-entrypoint`. - - `user-app` exits since, in this example, it does not intercept the TERM signal + - `sidecar-proxy` ignores the TERM signal and continues running until the `user-app` container exits. This allows the application container to continue making outgoing requests through the proxy to the mesh. + - `user-app` exits if it does not ignore the TERM signal. Alternatively, if the `user-app` container is configured to ignore the TERM signal , it would continue running. - **T1**: - `health-sync` updates its Consul checks to critical status, and then exits. This ensures this service instance is marked unhealthy. - - The `sidecar-proxy` container checks the ECS task metadata. It notices the `user-app` container has stopped, and exits. -- **T2**: - - `consul-client` finishes leaving the Consul cluster and exits - - Updates about this task have reached the rest of the Consul cluster, which means downstream proxies are updated to stop sending traffic to this task. -- **T3**: All containers have exited - - `consul-client` finishes gracefully leaving the Consul datacenter and exits. + - `sidecar-proxy` notices the `user-app` container has stopped and exits. +- **T2**: `consul-client` finishes gracefully leaving the Consul datacenter and exits. +- **T3**: - ECS notices all containers have exited, and will soon change the Task status to `STOPPED` -- **T4**: (Not applicable to this example, but if any conatiners are still running at this point, ECS forcefully stops them by sending a KILL signal) - -#### Task Shutdown: Completely Avoiding Application Errors - -Consul service mesh is a distributed and eventually-consistent system subject to network latency, so gracefully shutting down Consul is not always successful. - -In some cases, an exited application can receive incoming traffic. The following example of this behavior draws on the timeline described above: - -* The `user-app` container exits in **T0** -* During **T2**, downstream services are updated to stop sending traffic to this task. - -As a result, downstream applications will report errors when requests are directed to this instance. Errors can be reported for a short period (seconds or less) at the beginning of task shutdown. Applications will stop reporting errors when all nodes in the Consul cluster have instructions to stop sending traffic to this instance. - -Use the following methods to resolve this issue: - -1. Modify your application container to continue running for a short period of time into task shutdown. By doing this, the application continues responding to incoming requests successfully at the beginning of task shutdown. This allows time for the Consul cluster to update downstream proxies to stop sending traffic to this task. - - You can accomplish this by using an entrypoint override for your application container. Entrypoint overrides ignore the TERM signal sent by ECS. The following shell script contains an entrypoint override: - - ```bash - # Run the provided command in a background subprocess. - $0 "$@" & - export PID=$! - - onterm() { - echo "Caught sigterm. Sleeping 10s..." - sleep 10 - exit 0 - } - - onexit() { - if [ -n "$PID" ]; then - kill $PID - wait $PID - fi - } - - trap onterm TERM - trap onexit EXIT - wait $PID - ``` - - This script runs the application in a subprocess. It uses a `trap` to intercept the TERM signal. It then sleeps for ten seconds before exiting normally. This allows the application process to continue running after receiving the TERM signal. - - If this script is saved as `./app-entrypoint.sh`, then you can use it for your ECS tasks using the `mesh-task` Terraform module: - - ```hcl - module "my_task" { - source = "hashicorp/consul-ecs/aws//modules/mesh-task" - version = "" - container_definitions = [ - { - name = "my-app" - image = "..." - entryPoint = ["/bin/sh", "-c", file("./app-entrypoint.sh")] - command = ["python", "manage.py", "runserver", "127.0.0.1:8080"] - ... - } - ... - } - ``` - - This example sets the `entryPoint` for the container, which overrides the default entrypoint from the image. When the container starts in ECS, the `command` list is passed as arguments to the `entryPoint` command. Putting this together, the container would start with the command, `/bin/sh -c "" python manage.py runserver 127.0.0.1:8080`. - -2. If the traffic is HTTP(S), you can enable retry logic through Consul Connect [Service Router](/docs/connect/config-entries/service-router). This will configure proxies retry when receiving an error. When Envoy receives a failed request an upstream service, it can retry the request to a different instance of that service that may be able to respond successfully. - - To enable retries through Service Router for a service named `example`, first ensure the configured protocol is `http`: - - ```hcl - Kind = "service-defaults" - Name = "example" - Protocol = "http" - ``` - - Apply the config entry: - - ```shell-session - $ consul config write example-defaults.hcl - ``` - - Add retry settings for the service: - - ```hcl - Kind = "service-router" - Name = "example" - Routes = [ - { - Match { - HTTP { - PathPrefix = "/" - } - } - Destination { - NumRetries = 5 - RetryOnConnectFailure = true - RetryOnStatusCodes = [503] - } - } - ] - ``` - - To apply this, run the following: - - ```shell-session - $ consul config write example-router.hcl - ``` - - This Service Router configuration sets the `PathPrefix = "/"` which will match all requests to the `example` service. It sets the `NumRetries`, `RetryOnConnectFailure`, and `RetryOnStatusCodes = [503]` fields, so that incoming requests are retried. We've seen Envoy return a 503 when its application container has exited, but it is possible there could be other error codes dependening on your environment. - - See the Consul Connect [Configuration Entries](/docs/connect/config-entries/index) documentation for more detail. + - Updates about this task have reached the rest of the Consul cluster, so downstream proxies have been updated to stopped sending traffic to this task. +- **T4**: At this point task shutdown should be complete. Otherwise, ECS will send a KILL signal to any containers still running. The KILL signal cannot be ignored and will forcefully stop containers. This will interrupt in-progress operations and possibly cause errors. ### Automatic ACL Token Provisioning From 40f1802f27c6266b2e692761025a06216d6b4bb7 Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Mon, 15 Nov 2021 17:36:44 -0600 Subject: [PATCH 4/8] docs: Suggestions for ECS architecture from code review Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/content/docs/ecs/architecture.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/content/docs/ecs/architecture.mdx b/website/content/docs/ecs/architecture.mdx index db3e8760d2..e3d9dcb345 100644 --- a/website/content/docs/ecs/architecture.mdx +++ b/website/content/docs/ecs/architecture.mdx @@ -49,9 +49,9 @@ This diagram shows an example timeline of a task shutting down: - `consul-client` begins to gracefully leave the Consul cluster. - `health-sync` stops syncing health status from ECS into Consul checks. - `sidecar-proxy` ignores the TERM signal and continues running until the `user-app` container exits. This allows the application container to continue making outgoing requests through the proxy to the mesh. - - `user-app` exits if it does not ignore the TERM signal. Alternatively, if the `user-app` container is configured to ignore the TERM signal , it would continue running. + - `user-app` exits if it is not configured to ignore the TERM signal. The `user-app` container will continue running if it is configured to ignore the TERM signal. - **T1**: - - `health-sync` updates its Consul checks to critical status, and then exits. This ensures this service instance is marked unhealthy. + - `health-sync` updates its Consul checks to critical status and exits. This ensures this service instance is marked unhealthy. - `sidecar-proxy` notices the `user-app` container has stopped and exits. - **T2**: `consul-client` finishes gracefully leaving the Consul datacenter and exits. - **T3**: From 319a7b389c896ad7b41305b2961a5358798ecd02 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 20 Oct 2021 16:30:08 -0400 Subject: [PATCH 5/8] Update Consul ECS documentation with health sync changes This also switches the task startup image to an svg so it isn't pixelated anymore --- website/content/docs/ecs/architecture.mdx | 23 +++++++++++++++++++--- website/public/img/ecs-task-startup.png | Bin 10694 -> 0 bytes website/public/img/ecs-task-startup.svg | 4 ++++ 3 files changed, 24 insertions(+), 3 deletions(-) delete mode 100644 website/public/img/ecs-task-startup.png create mode 100644 website/public/img/ecs-task-startup.svg diff --git a/website/content/docs/ecs/architecture.mdx b/website/content/docs/ecs/architecture.mdx index e3d9dcb345..b6e262832e 100644 --- a/website/content/docs/ecs/architecture.mdx +++ b/website/content/docs/ecs/architecture.mdx @@ -31,12 +31,17 @@ at startup and sets up initial configuration for Consul and Envoy. This diagram shows the timeline of a task starting up and all its containers: -![Task Startup Timeline](/img/ecs-task-startup.png) +Task Startup Timeline - **T0:** ECS starts the task. The `consul-client` and `mesh-init` containers start: - `consul-client` uses the `retry-join` option to join the Consul cluster - - `mesh-init` registers the service for this task and its sidecar proxy into Consul. It runs `consul connect envoy -bootstrap` to generate Envoy’s bootstrap JSON file and write it to a shared volume. After registration and bootstrapping, `mesh-init` exits. -- **T1:** The `sidecar-proxy` container starts. It runs Envoy by executing `envoy -c `. + - `mesh-init` registers the service for the current task and its sidecar proxy with + Consul. It runs `consul connect envoy -bootstrap` to generate Envoy’s + bootstrap JSON file and write it to a shared volume. `mesh-init` exits after completing these operations. + +- **T1:** The following containers start: + - The `sidecar-proxy` container starts and runs Envoy by executing `envoy -c `. + - If applicable, the `health-sync` container syncs health checks from ECS to Consul (see [ECS Health Check Syncing](#ecs-health-check-syncing)). - **T2:** The `sidecar-proxy` container is marked as healthy by ECS. It uses a health check that detects if its public listener port is open. At this time, your application containers are started since all Consul machinery is ready to service requests. The only running containers are `consul-client`, `sidecar-proxy`, and your application container(s). ### Task Shutdown @@ -77,3 +82,15 @@ token does not yet exist. The ACL controller stores all ACL tokens in AWS Secrets Manager, and tasks are configured to pull these tokens from AWS Secrets Manager when they start. + +### ECS Health Check Syncing + +If the following conditions apply, ECS health checks automatically sync with Consul health checks for all application containers: + +* marked as `essential` +* have ECS `healthChecks` +* are not configured with native Consul health checks + +The `mesh-init` container creates a TTL health check for +every container that fits these criteria and the `health-sync` container ensures +that the ECS and Consul health checks remain in sync. diff --git a/website/public/img/ecs-task-startup.png b/website/public/img/ecs-task-startup.png deleted file mode 100644 index 6b9e587b2c607d313e7b4c7849e1d7f226c42f6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10694 zcmd72c|6qJ8~;Bl5s8YrMYJ!p$(DVq6xm`-(U9!R3>iiYL$=ah$W9c>F!m9{SWEVG z7{*Y_K0{dsGnU_(`*T0;JNqmu!8Ny{?I!LUc1F3f!f?lCFkYS6juI~L`yqeL8Sv}Q<2-%{B#3f|z6k<3K;Y#} z?BVJElP^_qSrphsObk^9zLt=N;jbwz)=LH!F=`(ODpCmueWg86qR)(>EdGgv#>&qS zOj+^m>P@oue%>xoqV|yjF!3^u^RY@OhsILWSgZUDiH-LiOY&)^_Z6Bx58-2{A z&Ydm)sg0`U-uv-EK@u4U%M?Xjem+ejQc*p**6uF7_@vRLXqc6APmbkS`KF*eAvD)l zNDiFX^JKq@!pPnE4&8*|PmeR5*S|m4perp7pq?wy^J<%?ax0NAy|I=A$Hv#EUHL?$ z?96j4M#{B|z;utdd^|&>pBJO3ul%fyVutbW%}B)MLvyWY%%?gOTCpoEzVy9$PW=89 zb9^LqVO!8GADTBaC18jYz;Gc+RA3erNur8#7*CpW}dZs?yhCI(t z9usd=z-BM zhv{oa3-fSd?Jndjd$!kjd$rp3uaesTJoKdg7QQ{FVn_M69J>~Kd$Vyb9&XxSxVdK9 z8Z3Ub!9&)eZ4e&8f7VtSUgnj5Uspx8IZ35=`+nta;nNn~*om5O0kMJUm%5bICQ{9G zUBqsN%xXc`yQ`62l9j8>1kAo5p}!X(E)34VvA!IBPI13(y43O3?8EiZv6MhG(SaX4 z6kVFW)ml71w?68m=|C4GGzjFD2UQsc32qZd(7NC_ovx=;6w%x~}QOxJJe{$NUTfM_aQqHqg6vJPA&WBJW84U-0R zc;4C8KV$mw?>Uv%rm_5EH+yBSO~c18T-Wx5@tYvuiS(EO9Y~Pdqdfit!s}iXwZAfq zQjpe>VD`VXDBOqa)>f8BpDGTXQ}dfYcUbqCT;SSrCiPRcMR8;K`WidKwHH4cBB*{2 zAc^dm`}ROG9%PDyHg$G09c+1e?kRA1w*PgmN_F{1j> zpls#(8m94X^zm^&PKI-~CZcl?))jum0oVgJK7-}H8P=6pbh(rfrO?r6I93eZ3l6Wf zQQ)zzdzCA*`g8Qcw*FE!qh#p%v&W>@KGOrGXm$BqH4IaZ6W+rWk4L{1_gWR^`mV1o zQhWO=Fg~47NMPxD3Rl7InlnONd~OEua`{@g+ttAtS6&`s&Wtoh>u>YPC9$#^V$P;; zGL_q^OKYMMB9OZzs3xy90OT`+U&EgmLm~BjjwuLp{H?fgTzjITyA{R&eiqE&m{GFo z=tzvU;k@tUhfI1Y-{S_-(l9?2Uv(Os6p=D9c^5mjq<6Q;=*RER3Ii+0(;n~AFr(!q zSc%p)$H}(bbWF0RKHhWMWlY<)y|kfKZSfYW%Rn*i@mbOZd-d+Xm8D;VHjq7&J+BFJ z`$0a7->uupT-OcZ5kw1efiUJi^hW2w4uxB4;JiDGwI&e^aM^stB{XzGfcl*}UNNLA zI7u+XB}I2=js=;?W>Vb|mO^OMNTYp!v8$s3a=@w9i_K&pFbN6>H;oFzZ#7{p_A&6+ zH;SPjO}};v5)OE+?Y1dFPzi)w?GJ+qD~pxu#WSTh3murg4mLh>qb;LRriS?kefo=> z2?hsQFLfpIS6PcQ?$nDmuwJ}r=ChkcPA?H%-oj6$p;=Mmx}uw3kiPEKT-CVZ&0wu} z7T7lpAT^KdMBmqO1F3lQU8Lc85h*hd!8jg?dsPE>>-RG`X|q&m_RHZe|HSu_7c8FU zSeD=eBtmJAM5Ht3yL4wQszC)J1mH!i7P=mJ7NlTV4O?%7*=EF*6mt zMNScMuX@R=6;A|M%X4E!s_R4>m~HQ2-mR+l z>KHpi;j8e#EdLV~p3(>Oc!^a9GtOm7id&FrdslCpT+lZHF@%^1*AhN z2Yx(g6q(oYtqm6-Yy$ZjybMclPPb_m~T9)!?Kd4b_+J z*hAMiMKDl$g0>lQai`7R3w2&|QJc(jtttj|wz1w@2Tb~34?3uuI zm6iqCgTcrX^o$Zue3?zyaMjQ@q6Lj_O?2tY;xGNgv7puql*6G55{Sg8?*bX?>dNGQ%+!OK}XFNjoN?p?MpNiJ;T z*&*%}5{taSZ;lZWcPA}7P}e}6>?dT0!vjv^gYChaS^!e*4k((*Y3)^TOjC1PC}VnOs^FN zk#-tq1FM9L%TE($)GY(!%4g0(4q(74?Rd|~#q&+s zET_e-3mPDeFm#t2j&j`;Af`br!_;#An(`|%F&N9bb%?Ub00-??(qiy^1f-c9V8Hl} z0Rb~2Dpg?|Sdqb;>6R}J(asa}00a}hUGz@i!FIiTbCUP&c$Sl5_>a}l!hPt4rjSvy z-uBwlGzi2_BNTq%P|>UR2Nv6P1mj+xw(NJ`jMCq8QL-2p`Uc=ohGhwoY1#YgWZnmL z1qwzXZqn_6pk#7q#y$&fGlW*gs(bOPsZPBDW_86_GKP-d=_klH?w52M>fM!Lz+4v8 zSb5>+xwXh83xfNVb?bXh$zZ{Z+MB6yKfnDQYajja?q2#C9=ZEPy#%7I#`zV3-$=BV z)C=ramP)*bpp!QX-feg`-fF;I%~kg|ZA!=q zitfq2tclD&KKl8on4?Sg`)?aJ`WyfsRKwAj4GZOQr6pO7>Oa?_h(x_+Q1WZTpA2Ey zEoxC8lu)A-RPE1&Uh4$?vlZQl-_|imXR^oAT^@)ybV8xqL}&Uj-Dlz%a3Xp-^%@P! zW-tc;-yG>5#Ig}{)jX0%78>J6nqm@O9@Z`UeUm({tkUv`*i}Ekvb*O%PA`3Mo}6o~ zfdOHLVW0vwzpj}9L;slH0O|~h1{5ZBfq9JSjIYFA=vrs00}ul1C` zwYW}4aPmgu9Ft{=U3&?u`xM-qKqh$Ad7PJMk%|~1RWN)$iNIp_THULr4_2t8yZd!o z_8|t#OGQ=h<;BU^hLxqAI))Hw*nT(5miLMxtvsq zfpbrQ6cx{Z=3`ZI?_1sHb;ZJeb5yH3+YR+u)RCfW0f(&$zdIjk)q+e`^`$@6ejthc z_yI^)fim6w-cbS10hu_bS$nojx2Nhb%EwCwA8(ok0k%6pb`I3R{$K2isB|S2poi#h z?HXQLC+S(%-#YdaU*AcY! zc|M}w^9J0PeqSx=FU2loy`oaZ_p3?gw}#p0Yix+`4RoJ(ur4RlY0)MWa$~W+^k-WgYYsY6$o+`lu>G7Le|S^lnfRb4ywV|pk}4=-#fs@wtClPt&+2xXKjHr5ejh#ZfEf}>kZEnRN>w}$;}2UzFYlPz;R$?H|cl+}G`n}}1fBA!*TJeojA zL3Z4K@ia;6h(`-OPi-+8k}~T&Pg+sY-|Jj*Q8$=UZ0x2y2hS~7_*4(DaCV= zc5}RZ6aKPew0UWo!aFOP-p)^7uLYDt=gZ4RKG_k$&H_%7<&l>*G z`#cgJ8;btHaT>A2_h&WFAGOYJVbY#sS#2njLcu`m#R31S^!IuLfoQq`koji{ywxC~ zwE+8){>LK%^R5ecm4AHU@f80~j=8h(5#InG^Z%p#^Y1-VWNGwUi2g%J|IFaPmQ~h* z>}H-FUK=0r9!MA0N|3aHjj+^DK)CwNkN;85+cONrx`5~K$2>XK$|-o+hI$P~=UB-X z>)vREG|RTBepkqp@t!p6`e1t8`~?K^WfL$Ob^@H2@yTFCQ);+ zJJU#V4xs;r;(cfsmrH8wlt>DtIRWP@`fsD=_j&VlfXV|x(sf|;8iH0vb{itmI8v7A zx8PC;>Qjl50Nfq;en`|l;3b^LFzI&_x|V0GNJs@9yJ{t%;l>?J!&y5uwhZz04$Z{3?ZTF=7|N z8VJ?3vMb8Kc}Bo0i}pH$GQ?0~6#`6jSe&LsU|AQIfGwl|+^VAV{eF`BN;tqh0Icu~ z;PNn6Y6Ue0tQLWRa5ZuLvzR+&F=Of&hS}$cz^t#WGGZ4N+cefy)1S{zlA98-tclUZ zp+Fx&`z!0JfNr4w3x{D<9u8%c4nLA^4&AnUKu7Zja4P~S92&pBiM#pIUbx*>K?%3Z zpx#RO|I`xej+b+OH9pouH%wOT`_T|tzx67&Y?5V#pEq?hoHm6gwr;HfVvjn76CX}Q zwdSY#0qYAqiLz;uWsZgX9B`WY9%$#((Dz#V+pwSfB~xRipS#d-JS8@_a;<;xLZ*jr zvrPRF^P3|6-Z^QP9>;^li@W@EU!1OFfZQ*OiPEpZ{B(>mlVaOq>0V(^T4h>_VZHa~ zJmOCFpS>EX;)6sDM;wn=_MVL8_}u<0zv|IpmRfLBJ07lL$x4kzE_8W2wk0Fl)`5L! z0Lma;9(bD$R4?0<;9me#kg%-c>*<>M`~&jLC_-S)SZ(T+WKK2<%1QgK3mUn zzfx&772|4-c?lN+3ld z`hdC*Oa_L(<-GYT0A}|T>90v1HQSggNh&_aScrj-9UQ8QfcCK#rl^alOuOnw1=??c zw*kD)w(EVNC+L%j`L^{LMT)>Y5l2&OBK98>Mw4d-F*61epdr!Lht3%|X8HvRA+aWL zyAd3-lnb8wf&8_wRkA9?AqvY^nN+5-6uI4H;l0V*SFKA^d&7PxHxZ}H znp)$;m|Q8&mtd8`*1jXrqo4L#%XMWMl~np~?gI^o3%tqqhPSb6wX5}xZWfU?m*bc% zjRtTqed)wWoF`9=%eBZ_{3J9)B<6_(%L!Us%wmH8`*BMq=hyf81ddw24$0X%RsIIM znBY#z4+zei8hn8o3Rvv3p#0Fy+aFnj^y9(;OPOi0U)d|KEhI1DR`5Zov+eSob3pI+ zq4u1)727G%Yy=FW>;0FcuLE8y{4Tuuvqx|qs6}Np*-Yz0!pQ+6?4_fvD9yY}=*txD z9lHYj*H}}zRC3SP(NkfH1>~3apc}$%`HXn5de9`=FbvmG>Zz zr2p4jGSTX<%_>a|l|IQK`nw0S(+fg?j8LcLO<@Oy()IUpJi92}ytH@|N|LPOvx?W+ z_$@ZDblwKD%3E1xAEF3BlhNL-ptrRf(VwHWQ0)Rsvhm!eqghCV||1Cu0X?%jS# zQhqX(QCfu2_Iz_KL!m-48Zv&^KkT~CQC<0JWsUbGEhp&HkMX#88<w?eK10A!ODX(wHnAQEC07veYHWTjPXl*NTs_XBT$rV7GC4ESAo7$J+|ir9~e?jAvjB^oTCJy4*@zN2x>SSzC)a`a=* zZ_bm>fKHR;W3lcA2Vryw?Z`lxZA%!^gCF@hlA{Tk0;J%Z=|}w5fQ@&AwWUZUOi#aP zn4}^9rNOK48*zp-^*diIJ(zfl3JAqp7&DySJXaDa_c~t4927A32btyiR>V~LoY@d= zRYltD{R@h|qVJRp!$Bz2EL!ixb}5RByzKH}-)PMfny&0Kh(0pW$K6sdl{|33%=NKc zj+Z)co6+ge)LS5`Rc=>7s56?icykL8H}5ghATAh>k1W@4zH9?i%=mChd!e>k_cI{S zlDUjhJ~XO5nP|af9waadQ!#cL<9$lb;qG~Q*H7&!J8+$C-I$-<`AmpqU(HFB|8pX$ zwBC4lb4>s5&s18&rO3&^C&p!Q<(w#!&eDH1&c(O*d5*qf$_G_#`(1nkW%s3h7j7sPI_sa=-&-vFMdV`f25sqCDM~^JOAN$Yur@EKSMgR7%+WFcQ-=k66hnea5{{? z!`q*OgR1#=D{QIsvaGP9u=?$1ri{?VCXX_`}Zh0QUf5fzhx5R)d71&cORQ`e-A*1Ki?v01|k^ zLj568j0+tM3Y|I*ZJ41@Fu>@p9yiv18V{oF0SuK`a24Q>p%c;l&Q^h;jNhHkGOrKI zfK&dbWg_OpLGQ5^v8h0y=FHdpiLT6q52l%AEe^n}bO5h7fF4r>0p!A1P7wp*Jb`QT z)>u%Lk0-r!0rvz5L%^g&Ks*9K3z3d9|)1yOZ7b&s%ko&y4u-`Ti; zCHEBA>$6|Zn&|GgeW3%_?4f9$gsFuy3)fabzyXTQ1&OFCWGN<{Gxr28_FgJg{ z2$b76tO=}1KNh%&2DhwjU^X{aHP%;9Vs@Zs8h2qDkXJ5U9(1SNLBm0iN^l`dnU)~o zRJ_Q|Z8dlazcx-IhT+FZR6@mrw6Aj4APl~sGM0$ih3mH9I%84v{-k*}1sk~A96&=0 zc$9y4f6F?2BBqy~Pu{co}6Z zGX-1b3;N3~;~j6ix~GbryFN30LC_#*ZnJN-Lbft*SqsV7@|1J;(u82JbOz6he!6brNR{Ujjbxq5|&EB`;BOuo~ z{++GG&K{`(bGHy%i*z!(cZin9p6@a`Zr#uNSu4npiN5i$W_o!nWoDign02-L*J|p| zY1D!LS_rBcdG~R7lKGLK=gjXVczBxT2U>3NoE7bBtw z;7(Fs0_K&Z#ZwV(1l%%xyOgXkf&qw`p_}D01I!D?-cTAaeZT}j45g@Lu&hmDq4&^; zzJgCo(-%XM{alBnRrKoqs|sIb!VGhI%A^1ba7a1;XdYAKx!tSA8sH?mC8d?G%r-F- zzlImvDZ>ylUeo{Cs#t_=iZ?(G-S*1|R*+%^I`Cf^H$~Bg2+7JN#=KOjISI|?i zNtyai)eht9%OSq1Jns$UFLQKH&K4e~BHd--CiUUbUY$w#U`9={-{eW^o=`ZW{LSjU z%~|W@X~B{KPyMvhAGLBoj}RSwLpZbvT&t>YtnYvb2?8VEwyZ-saBbxnP*EAcI9D)} z%9DZ|dqBGyd8|)Oo?L=v^pA3`9My}Xo(P0hBe$P-qnxvB!ueU`;9d6eHn8=I`0QL;Menm?D2JkZlO0wb%&WIUfIPj^V z1~}z)#uiO83@(1~O$y-|ag@qFmWQjN4X&yis&W z+&?1h`F|!~-RIQpL@6Alx1{P*(r+KQ5M|>7`ftcc*l+KBgm%6G?y*o4!%2Qino}qc z1t3ZO+s2!p85%;&KKl1t{_&6gZ@7v$wGL^{;?aGlGv*Fv1-W|3@FHIOcJTiL + + +
consul-client
consul-client
mesh-init
mesh-init
health-sync
health-sync
sidecar-proxy
sidecar-proxy
user-app
user-app
T0
T0
T1
T1
T2
T2
Viewer does not support full SVG 1.1
\ No newline at end of file From 2d4d867e4184364b672e4111c620d0ce6af4f60d Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Tue, 16 Nov 2021 10:55:23 -0600 Subject: [PATCH 6/8] docs: ECS docs for GA --- .../content/docs/ecs/get-started/install.mdx | 4 ++-- .../get-started/migrate-existing-tasks.mdx | 2 +- website/content/docs/ecs/index.mdx | 19 ++++++++----------- website/data/docs-nav-data.json | 10 +--------- 4 files changed, 12 insertions(+), 23 deletions(-) diff --git a/website/content/docs/ecs/get-started/install.mdx b/website/content/docs/ecs/get-started/install.mdx index a656f47dbd..b6d5230636 100644 --- a/website/content/docs/ecs/get-started/install.mdx +++ b/website/content/docs/ecs/get-started/install.mdx @@ -49,7 +49,7 @@ module "my_task" { ] port = "9090" - retry_join = "
" + retry_join = ["
"] } ``` @@ -63,7 +63,7 @@ however there are some important inputs worth highlighting: - `port` is the port that your application listens on. This should be set to a string, not an integer, i.e. `port = "9090"`, not `port = 9090`. - `retry_join` is passed to the [`-retry-join`](/docs/agent/options#_retry_join) option for the Consul agent. This tells - the agent the location of your Consul server so that it can join the Consul cluster. + the agent the location of your Consul servers so that it can join the Consul cluster. -> **NOTE:** If your tasks run in a public subnet, they must have `assign_public_ip = true` in their [`network_configuration`](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#network_configuration) block so that ECS can pull the Docker images. diff --git a/website/content/docs/ecs/get-started/migrate-existing-tasks.mdx b/website/content/docs/ecs/get-started/migrate-existing-tasks.mdx index 717cbed9c3..aedca03911 100644 --- a/website/content/docs/ecs/get-started/migrate-existing-tasks.mdx +++ b/website/content/docs/ecs/get-started/migrate-existing-tasks.mdx @@ -91,7 +91,7 @@ module "my_task" { ] port = "9090" - retry_join = "
" + retry_join = ["
"] } ``` diff --git a/website/content/docs/ecs/index.mdx b/website/content/docs/ecs/index.mdx index ee10784774..f0f483aefc 100644 --- a/website/content/docs/ecs/index.mdx +++ b/website/content/docs/ecs/index.mdx @@ -8,11 +8,7 @@ description: >- # AWS ECS --> **Beta:** This functionality is currently in beta and is -not recommended for use in production environments. Refer to the [consul-ecs project road map](https://github.com/hashicorp/consul-ecs/projects/1) for information about upcoming features and enhancements. - -Consul can be deployed on [AWS ECS](https://aws.amazon.com/ecs/) (Elastic Container Service) using our official -Terraform modules. +Consul can be deployed on [AWS ECS](https://aws.amazon.com/ecs/) (Elastic Container Service) using our official Terraform modules. ![Consul on ECS Architecture](/img/consul-ecs-arch.png) @@ -22,12 +18,13 @@ Using Consul on AWS ECS enables you to add your ECS tasks to the service mesh an take advantage of features such as zero-trust-security, intentions, observability, traffic policy, and more. -## Example Installation +## Getting Started -See our [Example Installation](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate) -to learn how to install Consul on an example ECS cluster along with example service mesh applications. +There are several ways to get started with Consul with ECS. -## Install +* The [Serverless Consul service mesh with ECS and HCP](https://learn.hashicorp.com/tutorials/cloud/consul-ecs-hcp?in=consul/cloud-integrations) learn guide shows how to use Terraform to run Consul service mesh applications on ECS with managed Consul servers running in HashiCorp Cloud Platform (HCP). +* The [Service mesh with ECS and Consul on EC2](https://learn.hashicorp.com/tutorials/consul/consul-ecs-ec2?in=consul/cloud-integrations) learn guide shows shows how to use Terraform to run consul service mesh applications on ECS with Consul servers running on EC2 instances. +* The [Consul With Dev Server on Fargate](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate) example installation deploys a sample service mesh application in ECS using the Fargate launch type. +* The [Consul With Dev Server on EC2](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-ec2) example installation deploys a sample service mesh applciation in ECS using the ECS launch type. -See our full [Install Guide](/docs/ecs/get-started/install) when you're ready to install Consul -on an existing ECS cluster and add existing tasks to the service mesh. +See the [Requirements](/docs/ecs/get-started/requirements) and the full [Install Guide](/docs/ecs/get-started/install) when you're ready to install Consul on an existing ECS cluster and add existing tasks to the service mesh. diff --git a/website/data/docs-nav-data.json b/website/data/docs-nav-data.json index 86e6efc0a5..b16146b73c 100644 --- a/website/data/docs-nav-data.json +++ b/website/data/docs-nav-data.json @@ -560,7 +560,7 @@ ] }, { - "title": "AWS ECS BETA", + "title": "AWS ECS", "routes": [ { "title": "Overview", @@ -569,14 +569,6 @@ { "title": "Get Started", "routes": [ - { - "title": "Example Installation on ECS Fargate", - "href": "https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate" - }, - { - "title": "Example Installation on ECS EC2", - "href": "https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-ec2" - }, { "title": "Requirements", "path": "ecs/get-started/requirements" From e7260321e34e63740b314480a2e4d3fb0b533a4c Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Tue, 16 Nov 2021 11:06:08 -0600 Subject: [PATCH 7/8] docs: correct some capitalization --- website/content/docs/ecs/index.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website/content/docs/ecs/index.mdx b/website/content/docs/ecs/index.mdx index f0f483aefc..4842046f5e 100644 --- a/website/content/docs/ecs/index.mdx +++ b/website/content/docs/ecs/index.mdx @@ -22,9 +22,9 @@ traffic policy, and more. There are several ways to get started with Consul with ECS. -* The [Serverless Consul service mesh with ECS and HCP](https://learn.hashicorp.com/tutorials/cloud/consul-ecs-hcp?in=consul/cloud-integrations) learn guide shows how to use Terraform to run Consul service mesh applications on ECS with managed Consul servers running in HashiCorp Cloud Platform (HCP). -* The [Service mesh with ECS and Consul on EC2](https://learn.hashicorp.com/tutorials/consul/consul-ecs-ec2?in=consul/cloud-integrations) learn guide shows shows how to use Terraform to run consul service mesh applications on ECS with Consul servers running on EC2 instances. -* The [Consul With Dev Server on Fargate](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate) example installation deploys a sample service mesh application in ECS using the Fargate launch type. -* The [Consul With Dev Server on EC2](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-ec2) example installation deploys a sample service mesh applciation in ECS using the ECS launch type. +* The [Serverless Consul Service Mesh with ECS and HCP](https://learn.hashicorp.com/tutorials/cloud/consul-ecs-hcp?in=consul/cloud-integrations) learn guide shows how to use Terraform to run Consul service mesh applications on ECS with managed Consul servers running in HashiCorp Cloud Platform (HCP). +* The [Service Mesh with ECS and Consul on EC2](https://learn.hashicorp.com/tutorials/consul/consul-ecs-ec2?in=consul/cloud-integrations) learn guide shows shows how to use Terraform to run Consul service mesh applications on ECS with Consul servers running on EC2 instances. +* The [Consul with Dev Server on Fargate](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate) example installation deploys a sample service mesh application in ECS using the Fargate launch type. +* The [Consul with Dev Server on EC2](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-ec2) example installation deploys a sample service mesh applciation in ECS using the ECS launch type. See the [Requirements](/docs/ecs/get-started/requirements) and the full [Install Guide](/docs/ecs/get-started/install) when you're ready to install Consul on an existing ECS cluster and add existing tasks to the service mesh. From de8c830a936e21e5c4a99fb82da94fc3acd6cacb Mon Sep 17 00:00:00 2001 From: Paul Glass Date: Wed, 17 Nov 2021 11:20:23 -0600 Subject: [PATCH 8/8] docs: Fix some typos in ECS overview --- website/content/docs/ecs/index.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/content/docs/ecs/index.mdx b/website/content/docs/ecs/index.mdx index 4842046f5e..0e8d22db35 100644 --- a/website/content/docs/ecs/index.mdx +++ b/website/content/docs/ecs/index.mdx @@ -23,8 +23,8 @@ traffic policy, and more. There are several ways to get started with Consul with ECS. * The [Serverless Consul Service Mesh with ECS and HCP](https://learn.hashicorp.com/tutorials/cloud/consul-ecs-hcp?in=consul/cloud-integrations) learn guide shows how to use Terraform to run Consul service mesh applications on ECS with managed Consul servers running in HashiCorp Cloud Platform (HCP). -* The [Service Mesh with ECS and Consul on EC2](https://learn.hashicorp.com/tutorials/consul/consul-ecs-ec2?in=consul/cloud-integrations) learn guide shows shows how to use Terraform to run Consul service mesh applications on ECS with Consul servers running on EC2 instances. -* The [Consul with Dev Server on Fargate](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate) example installation deploys a sample service mesh application in ECS using the Fargate launch type. -* The [Consul with Dev Server on EC2](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-ec2) example installation deploys a sample service mesh applciation in ECS using the ECS launch type. +* The [Service Mesh with ECS and Consul on EC2](https://learn.hashicorp.com/tutorials/consul/consul-ecs-ec2?in=consul/cloud-integrations) learn guide shows how to use Terraform to run Consul service mesh applications on ECS with Consul servers running on EC2 instances. +* The [Consul with Dev Server on Fargate](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-fargate) example installation deploys a sample application in ECS using the Fargate launch type. +* The [Consul with Dev Server on EC2](https://registry.terraform.io/modules/hashicorp/consul-ecs/aws/latest/examples/dev-server-ec2) example installation deploys a sample applciation in ECS using the EC2 launch type. See the [Requirements](/docs/ecs/get-started/requirements) and the full [Install Guide](/docs/ecs/get-started/install) when you're ready to install Consul on an existing ECS cluster and add existing tasks to the service mesh.