Let's say you have an app that you want to deploy. For this guide, we'll use a simple Node.js app as an example, but the same principles can be applied to any app:
That's it! It's a classic express "Hello World" starter app that listens for requests on port 8080. For this example
walkthrough, save this file as server.js.
Since we need to pull in the dependencies to run this app, we will also need a corresponding package.json:
In order to deploy the app on EKS, we need to dockerize the app. If you are not familiar with the basics of docker, we recommend you check out our "Crash Course on Docker and Packer" from the Gruntwork Training Library.
For this guide, we will use the following Dockerfile to package our app into a container.
The folder structure of our sample app looks like this:
├── server.js
├── Dockerfile
└── package.json
Your actual app will definitely be way more complicated than this but the main point to take from here, is that we need to ensure our docker image is configured to EXPOSE the port that our app is going to need for external communication. See examples of how to dockerize many popular app formats.
To build this a docker image from the Dockerfile, run:
$ docker build -t simple-web-app:latest .
Now we can test our container to see if it is working:
$ docker run --rm -p 8080:8080 simple-web-app:latest
This starts the newly built container and links port 8080 on your machine to the container's port 8080. You should
see output like below when you run this command:
> docker_web_app@1.0.0start /usr/app
> nodeserver.js
Running on http://0.0.0.0:8080
You should now be able to hit the app by opening localhost:8080 in your browser. Try it out to verify you get the
"Hello world" message from the server.
Some things to note when writing up your Dockerfile and building your app:
Ensure your Dockerfile starts your app in the foreground so the container doesn't shutdown after app startup.
Your app should log to stdout/stderr to aid in debugging it after deployment to AWS
Publishing your docker image
Once you've verified that you can build your app's docker image without any errors, the next step is to publish those images to an ECR repo. The ECR repos exists in your shared-services account.
Go to this file and add the desired repository name of your app to the repo_names list. For the purposes of our example, let's call ours simple-web-app. Next, authenticate to the shared-services account and run the following command:
$ terragrunt apply
The command should create an ECR repo with the name you specified in the shared-services account. Each repo in ECR has a URL of the format <ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<REPO_NAME>. So for the shared-services account with ID 087285199408, an ECR repo in us-east-1, and an app called simple-web-app, you can publish your local docker image to the newly created repo as follows:
$ docker tag simple-web-app:latest 087285199408.dkr.ecr.us-east-1.amazonaws.com/simple-web-app
Finally, authenticate your docker client with Amazon ECR
Now that you have the docker image of your app published, the next step is to deploy it to your EKS Cluster that was set up as part of your reference architecture deployment.
The first step is to create a folder with your app name in the services folder for each of your environments (i.e. dev, stage, prod) in infrastructure-live. For example, for the stage environment, we'd create a simple-web-app folder under stage/us-east-1/stage/services. Next, you can copy over the contents of the sample-app terragrunt.hcl so we have something to start with.
Still in the simple-web-app folder, open the terragrunt.hcl file and update the following parameters:
Service Configuration
Set service_name to your desired name. In our case we'll just set it to simple-web-app-{env}. Where {env} is the environment we're currently in.
Set image to the repo url of the just published docker image. In our case, 087285199408.dkr.ecr.us-east-1.amazonaws.com/simple-web-app
Set desired_number_of_pods to the number of tasks of your app you want EKS to spawn. Let's set ours to 2.
Set container_port to the port your container exposes. In our case, 8080.
Ingress Configuration
When deployed, the actual containers are run as Pods on the EKS cluster, which are scheduled to the worker nodes.
Within the cluster, services can communicate with each other using the Service endpoints which are automatically
provisioned by the underlying terraform modules. However, these endpoints are not accessible outside of the cluster.
You can use Ingress resources to expose your Service to be accessible outside of Kubernetes. Ingress resources
manage and configure AWS ALBs that eventually lead to the Service endpoint. These resources are configured by the
module using the input variables with the prefix ingress_ (e.g., ingress_path, ingress_listener_protocol_ports,
etc) and domain_name.
For example, to expose an ALB that maps the path /simple-web-app to our Service, you can set the ingress_path
variable to:
ingress_path = "/simple-web-app"
This will create an Ingress resource for the simple-web-app that will map to an ALB in our environment. This ALB
will expose port 80 and forward any requests that hit the path /simple-web-app to our container on the port we
defined in container_port, which is 8080.
You can query the Ingress endpoint using kubectl once the app is deployed:
This will output the Ingress endpoint to the console. You should then be able to hit it to reach your deployed app -
i.e. http://$INGRESS_ENDPOINT/simple-web-app.
Route 53 Domain Records
Your EKS cluster is deployed with external-dns installed. This
will automatically map hostnames configured on the Ingress resource to existing Route 53 Hosted Zones to link the
domain name to the provisioned ALBs.
For example, to make the simple-web-app available under the domain simple-web-app.gruntwork.io,
you can set the domain_name to be:
When applied, this will not only provision the ALB, but also create a new subdomain record for simple-web-app for the
corresponding Route 53 Hosted Zone for the domain gruntwork.io
to map to the new ALB.
TLS configuration
The cluster will also autodiscover any ACM TLS certificates that support the chosen domain. For example, the Reference
Architecture comes with ACM TLS certificates for all subdomains of the domain names used for the sample app frontend in
each environment. This means that if you use any subdomain on those host names for the Route 53 record, the
corresponding ACM certificates will be automatically associated with the ALB. This also works for private domain names
as well, provided that you create the ACM certificates and Route 53 Hosted Zones.
Note that for TLS to function properly, you need to set the ingress_listener_ports to accept HTTPS:
ingress_listener_ports = [
{
HTTPS = 443
}
]
Deploying your configuration
The above are the minimum set of configurations that you need to deploy the app. You can take a look
here
for more options.
Once you've verified that everything looks fine, run:
$ terragrunt apply
This will apply your configuration to the cluster and deploy your app.
Monitoring your deployment progress
Due to the asynchronous nature of Kubernetes deployments, a successful terragrunt apply does not always mean your app
was deployed successfully. There are several resources that need to rollout in Kubernetes before your application is
available:
The Pods associated with the Deployment.
The ALB that fulfills the Ingress endpoint (if applicable).
The DNS record that maps to the Ingress endpoint (if applicable).
Once terragrunt apply completes, you can use kubectl to monitor the status of the rollout.
Monitoring Deployment rollout
Deployment resources define controllers in Kubernetes that ensure the state of the cluster matches the desired state
as described in the manifest. This is handled asynchronously after the changes have been applied to the manifest
configuration. You can use the rollout status command of kubectl to watch and wait for the rollout to complete:
# First get the name of the deployment object
DEPLOYMENT_NAME=$(kubectl get deployments \
-l "app.kubernetes.io/name=simple-web-app,app.kubernetes.io/instance=simple-web-app" \
--all-namespaces \
-o jsonpath \
--template '{.items[0].metadata.name}')
# Then, wait for the rollout to complete
kubectl rollout status deployment/"$DEPLOYMENT_NAME" -w
This will print out the status of the rollout in the context of how many Pods have been launched using the current
configuration. The command will only finish if the rollout completes successfully.
A completed rollout indicates that all the Pods associated with the Deployment has been successfully started, and
that they all reach the Ready status. This indicates that the Pods can start serving traffic (if they are network
services), or can begin running workloads (if they are backend task workers).
Monitoring Ingress endpoints
A successful rollout for a Deployment indicates the Pods are ready to accept traffic, but it does not mean that all
the endpoints have been allocated. The endpoint to access the service is managed by the Ingress resource. The
Ingress resource is then materialized into ALBs by the ALB Ingress controller that is deployed on to your EKS cluster.
Unfortunately, since the endpoint is backed by an actual Load Balancer in the cloud, it takes time for it to be
provisioned after the resource is created.
You can use kubergrunt to monitor and wait for the Ingress endpoint to be provisioned, similar to the Deployment.
In order to monitor the Ingress endpoint, we need to know two things:
The name of the Ingress resource. The Ingress resource is named by combining the helm release name and the
application name. Our module uses the application name for both, so in this case will be named
simple-web-app-simple-web-app.
The Namespace where the Ingress resource is deployed. For this example, we used the applicationsNamespace to
deploy our app.
This command will continuously monitor the Ingress resource until the ALB is provisioned and the endpoint is updated
on the resource. Note that this command will time out after 5 minutes. You can configure the timeout settings using the
--max-retries and --sleep-between-retries CLI args.
If the command successfully completes, then the Ingress endpoint is provisioned and attached to the resource. You can
query the endpoint by looking up the Ingress resource:
This will list out the endpoints and attached host rules of the Ingress resource. If you used a path based Ingress
configuration without hosts, you should be able to hit the endpoint directly to access the service.
For host based Ingress configuration, the Route 53 DNS records need to be updated to point to the Ingress endpoint,
so that the routing works. The EKS cluster in the reference architecture is deployed with the external-dns
application, which will automatically update the records. In this setup, you should be able to hit the hostname to
access the service without having to do anything else.
Searching for the Ingress Resource
If you happen to not know the name or Namespace of the Ingress resource, you can look it up using kubectl. There
are multiple approaches to filter down the resources. For example, you can start by listing out all Ingress resources
in the cluster:
kubectl get ingresses --all-namespaces
Then, narrow down your search by using the list of names and Namespaces as a clue. You can get more information about
a particular Ingress resource given its name and Namespace:
You can also use labels to search for the Ingress resource. For example, if you know the application name that you
deployed, you can search for all Ingress resources that are labeled with that application name:
kubectl get ingresses \
-l "app.kubernetes.io/name=simple-web-app" \
--all-namespaces
Debugging errors
Sometimes, things don't go as planned. And when that happens, it's always beneficial to know how to locate the
source of the problem. There are two places you can look for information about a failed Pod.
Using kubectl
By now you should be familiar with the kubectl CLI, and how powerful it is. You can use kubectl to investigate
problems with your Pods.
The first step is to obtain the metadata and status of the Pods. To lookup information about a Pod, retrieve them
using kubectl:
kubectl get pods \
-l "app.kubernetes.io/name=simple-web-app,app.kubernetes.io/instance=simple-web-app" \
--all-namespaces
This will list out all the associated Pods with the deployment you just made. Note that this will show you a minimal
set of information about the Pod. However, this is a useful way to quickly scan the scope of the damage:
How many Pods are available? Are all of them failing or just a small few?
Are the Pods in a crash loop? Have they booted up successfully?
Are the Pods passing health checks?
Once you can locate your failing Pods, you can dig deeper by using describe pod to get more information about a
single Pod. To do this, you will first need to obtain the Namespace and name for the Pod. This information should
be available in the previous command. Using that information, you can run:
kubectl describe pod $POD_NAME -n $POD_NAMESPACE
to output the detailed information. This includes the event logs, which indicate additional information about any
failures that has happened to the Pod.
Most cluster level issues (e.g if there is not enough capacity to schedule the Pod) can be triaged with this
information. However, if there are issues booting up the Pod or if the problems lie in your application code, you will
need to dig into the logs.
CloudWatch Logs
By default, all the container logs from a Pod (stdout and stderr) are sent to CloudWatch Logs. This is ideal for
debugging situations where the container starts successfully but the service doesn't work as expected. Let's assume our
simple-web-app containers started successfully (which they did!) but for some reason our requests to those containers
are timing out or returning wrong content.
Go to the "Logs" section of the Cloudwatch Management Console and look for the name of the EKS cluster in the table.
Clicking it should take you to a new page that displays a list of entries. Each of these correspond to a Pod in the
cluster, and contain the Pod name. Look for the one that corresponds to the failing Pod and click it.
You should be presented with a real-time log stream of the container. If your app logs to STDOUT, its logs will show
up here. You can export the logs and analyze it in your preferred tool or use CloudWatch Log
Insights to query the logs directly
in the AWS web console.
{"treedata":{"name":"root","toggled":true,"children":[{"name":".gitignore","path":".gitignore","sha":"1c27fc6013cba46cd301a7c8bf951694670153a3"},{"name":"CODEOWNERS","path":"CODEOWNERS","sha":"00570abefb91e715366015f8b5acf32631336d52"},{"name":"README.md","path":"README.md","sha":"45d75f99aefaa9a2d008b223da04bc26453ef651"},{"name":"_docs","children":[{"name":"01-architecture-overview.md","path":"_docs/01-architecture-overview.md","sha":"115a05d08f3a431a19e5aa2596c079619ae66dab"},{"name":"02-whats-deployed.md","path":"_docs/02-whats-deployed.md","sha":"9dc8a401caf24896ce00a8087bfe32c7af99d2d2"},{"name":"03-security-compliance-compatibility.md","path":"_docs/03-security-compliance-compatibility.md","sha":"9342617f42adb28e440cc2161f3fee56205c150e"},{"name":"04-how-code-is-organized.md","path":"_docs/04-how-code-is-organized.md","sha":"3b340de506525633e1f7333a1e9ac9a5565a88e3"},{"name":"05-dev-environment.md","path":"_docs/05-dev-environment.md","sha":"c8b494aed802b623f7891047b6cba633d8ab5fa7"},{"name":"06-ci-cd.md","path":"_docs/06-ci-cd.md","sha":"b6c2a7d7cde7471fb08bff5dcf68c40156db68d5"},{"name":"07-monitoring-alerting-logging.md","path":"_docs/07-monitoring-alerting-logging.md","sha":"619c810c6e60418b3a46fa3d903bc76dc6d48e41"},{"name":"08-ssh-vpn.md","path":"_docs/08-ssh-vpn.md","sha":"9fe83afbd3d6116a4f3faff8923a81cd37ff91c7"},{"name":"09-accounts-and-auth.md","path":"_docs/09-accounts-and-auth.md","sha":"ff7396e5c1a8ee0a76caa5cdb45693c4acea9a61"},{"name":"10-gruntwork-tools.md","path":"_docs/10-gruntwork-tools.md","sha":"c44892fb059858e4a782c75e8a531d1cc9346593"},{"name":"11-deploying-a-docker-service.md","path":"_docs/11-deploying-a-docker-service.md","sha":"c209c7da82a4738c99be43f2ab909215b5530617","toggled":true},{"name":"12-migration.md","path":"_docs/12-migration.md","sha":"464cadf6e05d5ffd44e569c0d866b5c2cf5f42e9"},{"name":"13-deploying-the-reference-architecture-from-scratch.md","path":"_docs/13-deploying-the-reference-architecture-from-scratch.md","sha":"2176ccd41cf80dd7409e7f0df0ba13146f0b0378"},{"name":"14-undeploying-the-reference-architecture.md","path":"_docs/14-undeploying-the-reference-architecture.md","sha":"f343913c18abc0d1f66edeba61290ef92b5abeb8"},{"name":"15-adding-new-environments-regions-and-accounts.md","path":"_docs/15-adding-new-environments-regions-and-accounts.md","sha":"c01188a1539e93ed2773a1b799b3b0f8e7b2045e"},{"name":"README.md","path":"_docs/README.md","sha":"ddb9fe83eb2fcad91e82771ad276dd0bdba40cb2"},{"name":"_images","children":[{"name":"cw-logs-1.png","path":"_docs/_images/cw-logs-1.png","sha":"84c86f014751844fbd777b5139ed61f749b5ed32"},{"name":"cw-logs-2.png","path":"_docs/_images/cw-logs-2.png","sha":"9a0a80b20490fdc1b9014040cc0bbc87c9cf6f68"},{"name":"cw-logs-3.png","path":"_docs/_images/cw-logs-3.png","sha":"bda49dc4e947658e0ceb9ba592b4e314d9db61e9"},{"name":"cw-logs-4.png","path":"_docs/_images/cw-logs-4.png","sha":"54bcc44c4b0701620b7f20c4e6fc0a9fd8f38049"},{"name":"ecs-console-1.png","path":"_docs/_images/ecs-console-1.png","sha":"afe452278d5f107e6ec225a235c587de7cb53510"},{"name":"ecs-console-2.png","path":"_docs/_images/ecs-console-2.png","sha":"40609b98015d781b9e1de801c131fadc323337ae"},{"name":"ecs-console-3.png","path":"_docs/_images/ecs-console-3.png","sha":"87ad40d291b7e9e6f6caa0389b846392bdb93ee0"},{"name":"ref-arch-full.png","path":"_docs/_images/ref-arch-full.png","sha":"8c17eef52be06757553a1f3ee4e387e6dc820016"},{"name":"ref-arch-icon.png","path":"_docs/_images/ref-arch-icon.png","sha":"05876962e6877df911674237ca1b793d9f4f04b3"},{"name":"terraform-code-provenance.png","path":"_docs/_images/terraform-code-provenance.png","sha":"e2a9d6bfbd8b963b057d4341dd0ec93e3823d834"}]},{"name":"_ref_arch_v1_to_v2_migration_guides","children":[{"name":"_scripts","children":[{"name":"migrate_alb.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_alb.sh","sha":"b1ec779e3ab221ce93cba92d74e34803b9bd49fb"},{"name":"migrate_asg_service.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_asg_service.sh","sha":"ee4873fe61e50260219427a859d9025c1f15148c"},{"name":"migrate_cloudtrail.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_cloudtrail.sh","sha":"58b00b0bbd598ba008fe7a8a06b2fd6f983260f1"},{"name":"migrate_ecr_repos.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_ecr_repos.sh","sha":"2ce4e0e4c7d427e1653c022fa650862bfb4cf71b"},{"name":"migrate_ecs_cluster.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_ecs_cluster.sh","sha":"9e3988ea8588180485b839d6c0c463d83ec1ebc1"},{"name":"migrate_ecs_service.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_ecs_service.sh","sha":"28b170e75ff1ed216c3a5fce33654f1579337a33"},{"name":"migrate_eks_cluster.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_eks_cluster.sh","sha":"3ef4459563ea01c0b1d6fde0b02c767c8f6d7c2c"},{"name":"migrate_eks_core_services.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_eks_core_services.sh","sha":"ea318ffe8ba1355e4157681337bfb7bab16cf94c"},{"name":"migrate_iam_cross_account.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_iam_cross_account.sh","sha":"21006c240a3b2e5f5df08da024bf45f6099883c4"},{"name":"migrate_iam_groups.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_iam_groups.sh","sha":"fafe6c4244e374139f13683bae9a46bf715924f0"},{"name":"migrate_k8s_namespace.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_k8s_namespace.sh","sha":"3f92982374a7b4fbd0a925da2e7c716daf2859a3"},{"name":"migrate_kms.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_kms.sh","sha":"7f4d6a1a9f33ef2ef1306f3c9988e4e01e66bdba"},{"name":"migrate_openvpn_server.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_openvpn_server.sh","sha":"7ffa0bc8caa901a53b8fd3ef3cdd72a86d9bf10a"},{"name":"migrate_route53_private.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_route53_private.sh","sha":"5010ae32d37581eb8c5ac0ec7e6b61559eff55a0"},{"name":"migrate_route53_public.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_route53_public.sh","sha":"3a4672166787913b9a23e43af1b7c347ba2f3f7a"},{"name":"migrate_vpc_app.sh","path":"_docs/_ref_arch_v1_to_v2_migration_guides/_scripts/migrate_vpc_app.sh","sha":"57aafb3e2ef3c5603991dfe9c5a6db85a3c23d90"}]},{"name":"alb.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/alb.adoc","sha":"044c0847ffc087fb0d193c5b27641d8fa8654a03"},{"name":"asg.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/asg.adoc","sha":"38d434456863a8591fee3e2c3a9141c0225efdaf"},{"name":"aurora.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/aurora.adoc","sha":"3427714c6902388e07a48b6ee40339e0f6abf60e"},{"name":"cloudtrail.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/cloudtrail.adoc","sha":"a8b01caeeae125fd0d2d7709442d274a22a89ff5"},{"name":"cloudwatch-dashboard.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/cloudwatch-dashboard.adoc","sha":"b23dd9238a27294e6dffc17766a4994eef2320e3"},{"name":"ecr-repos.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/ecr-repos.adoc","sha":"39a1ad5bb3763a886f64006caae5fead7346da0d"},{"name":"ecs-cluster.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/ecs-cluster.adoc","sha":"93ca941b1bd1f04c653e6ee09fe559a78e322b67"},{"name":"ecs-service-with-alb.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/ecs-service-with-alb.adoc","sha":"f9d992acec7b474744ba900f2ff0e44bf4a2cf67"},{"name":"eks-cluster.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/eks-cluster.adoc","sha":"fedf9de9f290d21b9c73562bb2f0604ab8932b97"},{"name":"eks-core-services.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/eks-core-services.adoc","sha":"a6ed69cb40f92c719dc6040212dacafb3fe3d591"},{"name":"eks.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/eks.adoc","sha":"4a3152edb8dc7ee0ca5dfab963f192053587c095"},{"name":"iam-cross-account.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/iam-cross-account.adoc","sha":"d6b1295c15cd69eae75d68cd558b3ec3ef94a314"},{"name":"iam-groups.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/iam-groups.adoc","sha":"dde6c745fd5151e357eb03f66e093238c6a77f59"},{"name":"iam-user-password-policy.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/iam-user-password-policy.adoc","sha":"f9bad0bf5c0623e978360cfd80bf6f72d797d7c1"},{"name":"jenkins.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/jenkins.adoc","sha":"581cb897f0e3609988322b6678b546970bcd206b"},{"name":"k8s-applications-namespace.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/k8s-applications-namespace.adoc","sha":"d8a2df61a8f1f6b73b5ae009dfa7383e7c36aac4"},{"name":"k8s-service.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/k8s-service.adoc","sha":"43da348317456ddf49e6ab155c3d712d6152ebda"},{"name":"kms-master-key.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/kms-master-key.adoc","sha":"93fad945a4cfbf20d132ec628fb17752543169f6"},{"name":"memcached.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/memcached.adoc","sha":"bac5ad58652a888bf90dd42e3474f8b72a887b84"},{"name":"openvpn-server.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/openvpn-server.adoc","sha":"da79804b53cb2be2eb22dd98cc0801331613bed5"},{"name":"rds.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/rds.adoc","sha":"55e398f682a187108b3906fa5cf66c84150d9693"},{"name":"redis.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/redis.adoc","sha":"2759a1d091509aec209068bed77bd344838ea281"},{"name":"route53-private.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/route53-private.adoc","sha":"72d5209e41d66f9080e74adb8414b16de11edec4"},{"name":"route53-public.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/route53-public.adoc","sha":"be1d3561d96d1ca32f2aeecce3cbd627d430c0ed"},{"name":"sns-topics.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/sns-topics.adoc","sha":"51b2fe76ebdbf4108107ee73aa0b5d4dd1503541"},{"name":"vpc-app.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/vpc-app.adoc","sha":"32e818434e74f519d28ac4fed751a66b5f93b6ec"},{"name":"vpc-mgmt.adoc","path":"_docs/_ref_arch_v1_to_v2_migration_guides/vpc-mgmt.adoc","sha":"8742860d936fd1bb2af9bb931560d1e7b8da3dcf"}]}],"toggled":true},{"name":"dev","children":[{"name":"_global","children":[{"name":"README.md","path":"dev/_global/README.md","sha":"d1b8a96c00211751f079fa13cac1b3417d29bf09"},{"name":"cloudtrail","children":[{"name":"README.md","path":"dev/_global/cloudtrail/README.md","sha":"a77d9e833ee0929d5e4f98c87a279599f088fd3d"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/_global/cloudtrail/ref-arch-v1-to-service-catalog-migration.patch","sha":"a82df57a1b08cc41f90c56baff8623688b41184b"},{"name":"terragrunt.hcl","path":"dev/_global/cloudtrail/terragrunt.hcl","sha":"a1294f90b09974353e89d5c16811c3a19e886214"}]},{"name":"iam-cross-account","children":[{"name":"README.md","path":"dev/_global/iam-cross-account/README.md","sha":"bb294808e3bc3690be92762f50cbb6f3e7682a77"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/_global/iam-cross-account/ref-arch-v1-to-service-catalog-migration.patch","sha":"bc153224541d6a2a36b4ed4bf9818ccb8d300ec9"},{"name":"terragrunt.hcl","path":"dev/_global/iam-cross-account/terragrunt.hcl","sha":"b3ea33a23ebea4af915c9e63809ae2fc6fc929bd"}]},{"name":"iam-user-password-policy","children":[{"name":"README.md","path":"dev/_global/iam-user-password-policy/README.md","sha":"ae6a3037443840229494d72aad035820d8abb963"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/_global/iam-user-password-policy/ref-arch-v1-to-service-catalog-migration.patch","sha":"59035c3be4cdb76375b708903288d8cb8ba45649"},{"name":"terragrunt.hcl","path":"dev/_global/iam-user-password-policy/terragrunt.hcl","sha":"4b10c3886146130afb97457253b7d66fe648dd35"}]},{"name":"region.yaml","path":"dev/_global/region.yaml","sha":"18b7823ed017b97431d58da7bcb9a4e31299272a"},{"name":"route53-public","children":[{"name":"README.md","path":"dev/_global/route53-public/README.md","sha":"7f038b025378ca59904e756ae472b3f322b166ff"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/_global/route53-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"b4a892217599e2358fc3988c8a6dfc239ffc4eb5"},{"name":"terragrunt.hcl","path":"dev/_global/route53-public/terragrunt.hcl","sha":"19b07ac494809c2043d52697b134617c6264d988"}]}]},{"name":"account.hcl","path":"dev/account.hcl","sha":"ecdbfcb2326662d4e86c0c8e43d25c931f2a72b6"},{"name":"empty.yaml","path":"dev/empty.yaml","sha":"5aa66daa40faeaef37eccb7b4b0fcc792233cd7b"},{"name":"terragrunt.hcl","path":"dev/terragrunt.hcl","sha":"1bf732dd110a5c3de49e622efe34361ee70738a4"},{"name":"us-east-1","children":[{"name":"_global","children":[{"name":"README.md","path":"dev/us-east-1/_global/README.md","sha":"37b828b038945a50e2e571ef1e755c4f9170e7cf"},{"name":"kms-master-key","children":[{"name":"README.md","path":"dev/us-east-1/_global/kms-master-key/README.md","sha":"df569147c68efc00b230d43a699d308a013409b2"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/_global/kms-master-key/ref-arch-v1-to-service-catalog-migration.patch","sha":"1383eb7be7cbeeb250d579df94446932144c1bd9"},{"name":"terragrunt.hcl","path":"dev/us-east-1/_global/kms-master-key/terragrunt.hcl","sha":"c27b12d6a32d981c3e23c9fdc0e59a65248b3806"}]},{"name":"sns-topics","children":[{"name":"README.md","path":"dev/us-east-1/_global/sns-topics/README.md","sha":"4402f2dd08bfb3e35616c65bbd74b5020f47a4ef"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/_global/sns-topics/ref-arch-v1-to-service-catalog-migration.patch","sha":"2dab63e8ab1501e51747f5b206bce68459dcf3d7"},{"name":"terragrunt.hcl","path":"dev/us-east-1/_global/sns-topics/terragrunt.hcl","sha":"59365ef55d4749340ec587d0c753847ba7fe2c08"}]}]},{"name":"dev","children":[{"name":"README.md","path":"dev/us-east-1/dev/README.md","sha":"30eef7620895f3ad23174f5f2c8772ab7f8880a8"},{"name":"cloudwatch-dashboard","children":[{"name":"README.md","path":"dev/us-east-1/dev/cloudwatch-dashboard/README.md","sha":"7262ff3d7e6476bca9a882234bc2624499ab3ee1"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/cloudwatch-dashboard/ref-arch-v1-to-service-catalog-migration.patch","sha":"93211f8918660694821f90746050b952f123fda3"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/cloudwatch-dashboard/terragrunt.hcl","sha":"c88bc036b17bc5258e4c00143f75a3b2c952cdd4"}]},{"name":"data-stores","children":[{"name":"elk-single-cluster","children":[{"name":"README.md","path":"dev/us-east-1/dev/data-stores/elk-single-cluster/README.md","sha":"9a1cb70a6f6b1b3ac81b2c7c5b17d902328db1e0"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/data-stores/elk-single-cluster/terragrunt.hcl","sha":"3e02bac636d5de244b27079d9f49480b7d6d6299"}]},{"name":"kafka","children":[{"name":"README.md","path":"dev/us-east-1/dev/data-stores/kafka/README.md","sha":"8bfe6579bd97e0148c3baa24e1215abce8cf312b"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/data-stores/kafka/terragrunt.hcl","sha":"91e8eaa7d6714d1dd2bef96d81ec37ac239e5302"}]},{"name":"mysql","children":[{"name":"README.md","path":"dev/us-east-1/dev/data-stores/mysql/README.md","sha":"8e852d5e3b3f35b1ef7b22205f8a304bd80db37a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/data-stores/mysql/ref-arch-v1-to-service-catalog-migration.patch","sha":"9456858a922acaa427cb2e25e0693187c63ace45"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/data-stores/mysql/terragrunt.hcl","sha":"4f7a10de9572e7bfd80f9a36a997506b4b5f44b6"}]},{"name":"redis","children":[{"name":"README.md","path":"dev/us-east-1/dev/data-stores/redis/README.md","sha":"8a700f27903c016e919c0ba0f0aa1da63918bc94"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/data-stores/redis/ref-arch-v1-to-service-catalog-migration.patch","sha":"f7a95f974501e15424da566325dc1e86515cacb9"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/data-stores/redis/terragrunt.hcl","sha":"f4f421d33300a60de7bb46c0ef829bfc3aa2e0e4"}]},{"name":"zookeeper","children":[{"name":"README.md","path":"dev/us-east-1/dev/data-stores/zookeeper/README.md","sha":"451ce7cb440aa724bf4dc8a35726e2bda7e071a2"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/data-stores/zookeeper/terragrunt.hcl","sha":"57e560349a3622e58a95c4543e9223de34a06ec2"}]}]},{"name":"env.yaml","path":"dev/us-east-1/dev/env.yaml","sha":"c38dd83256fc4206be3afc24972cd7f3b6712b19"},{"name":"lambda","children":[{"name":"long-running-scheduled","children":[{"name":"README.md","path":"dev/us-east-1/dev/lambda/long-running-scheduled/README.md","sha":"af7b8b9950d620577e1db104d0140a478e5f46fd"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/lambda/long-running-scheduled/terragrunt.hcl","sha":"053338f0710fc20a53e04bb6ce1c091d91caf652"}]},{"name":"s3-image-processing","children":[{"name":"README.md","path":"dev/us-east-1/dev/lambda/s3-image-processing/README.md","sha":"236ef4197db71e6e121e3ca7182e556fa9ecaa60"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/lambda/s3-image-processing/terragrunt.hcl","sha":"255fa84a1b262f2ebb7478e2657db2fdd792c4e9"}]}]},{"name":"networking","children":[{"name":"alb-internal","children":[{"name":"README.md","path":"dev/us-east-1/dev/networking/alb-internal/README.md","sha":"3906021fe4c6782e90d668369720c34d12eec145"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/networking/alb-internal/ref-arch-v1-to-service-catalog-migration.patch","sha":"936c893cbf94ac891349114a73261943f8377d37"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/networking/alb-internal/terragrunt.hcl","sha":"8da5e4498b75664ee0e42739c2ae519db94ccec6"}]},{"name":"alb-public","children":[{"name":"README.md","path":"dev/us-east-1/dev/networking/alb-public/README.md","sha":"3906021fe4c6782e90d668369720c34d12eec145"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/networking/alb-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"1e7b8df5a2c0a7fee3deaef97c0aa295b62c20c3"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/networking/alb-public/terragrunt.hcl","sha":"6fc07d826220b147a105b582209769a3e4eb5626"}]},{"name":"route53-private","children":[{"name":"README.md","path":"dev/us-east-1/dev/networking/route53-private/README.md","sha":"76e78055a77188ea00f1719af3be966e6a6fcd2f"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/networking/route53-private/ref-arch-v1-to-service-catalog-migration.patch","sha":"9c9a52b7c3ebbea74a9ab5999dc157cf645e2b45"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/networking/route53-private/terragrunt.hcl","sha":"092a5108e5704946b5a560e87cea89a1090176ab"}]}]},{"name":"services","children":[{"name":"ecs-cluster","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/ecs-cluster/README.md","sha":"0e194f4435bdab9410947e62d80f1473e9bbafbe"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/ecs-cluster/ref-arch-v1-to-service-catalog-migration.patch","sha":"c97f9a33f023e6dfc9011edc47c253319a175f3c"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/ecs-cluster/terragrunt.hcl","sha":"6c71dce4356f5f5aedf79b84af1b5d8f838be25e"}]},{"name":"eks-cluster","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/eks-cluster/README.md","sha":"2348a6ee62014ab2f1316fae928a3ec5b592cefb"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/eks-cluster/ref-arch-v1-to-service-catalog-migration.patch","sha":"e6e6f9b3533beb3ff9bb2e6e52115936cc74c070"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/eks-cluster/terragrunt.hcl","sha":"cb34a3c30770a7ad1abfd04316ff83523ce16208"}]},{"name":"eks-core-services","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/eks-core-services/README.md","sha":"50d53f4a7588c73cf97e922cc5635316161b04c2"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/eks-core-services/ref-arch-v1-to-service-catalog-migration.patch","sha":"e8f4f70d9d4ee7baf57104d290f18478e3892f12"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/eks-core-services/terragrunt.hcl","sha":"3648787c2b324d6c0acfea5fad468b17ea55669d"}]},{"name":"k8s-applications-namespace","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/k8s-applications-namespace/README.md","sha":"db58102b12791684f93a3249e17ba0c654d8d22b"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/k8s-applications-namespace/ref-arch-v1-to-service-catalog-migration.patch","sha":"84f9f3ff31667eaaa2e5ec31996b53e83183ad20"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/k8s-applications-namespace/terragrunt.hcl","sha":"fb4d57deac0f95221368f53101346adf03164c32"}]},{"name":"k8s-sample-app-backend-multi-account-acme","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/k8s-sample-app-backend-multi-account-acme/README.md","sha":"1aa0fd9c663642cf39ef23941352f84902ccdac1"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/k8s-sample-app-backend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"3b8af7e2b268beca1c5f43b31b267c5be88d6bd8"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/k8s-sample-app-backend-multi-account-acme/terragrunt.hcl","sha":"25a1b800a9a469a8edca80bb7fc157efcd7b9601"}]},{"name":"k8s-sample-app-frontend-multi-account-acme","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/k8s-sample-app-frontend-multi-account-acme/README.md","sha":"1ed374cfff8c29b63f7c963f5de3055a5248b498"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/k8s-sample-app-frontend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"f090323a10cc323eaa3308a22271dc45e3ce253d"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/k8s-sample-app-frontend-multi-account-acme/terragrunt.hcl","sha":"7a47eaec3f5cf946b15180050bf59492f3d2c35b"}]},{"name":"sample-app-backend-multi-account-acme-asg","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/sample-app-backend-multi-account-acme-asg/README.md","sha":"71aaf40198e9cf1c1196a6a986bf34f42bbf5d13"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/sample-app-backend-multi-account-acme-asg/ref-arch-v1-to-service-catalog-migration.patch","sha":"3d467a67534b484254c71c83d4339cb22f873742"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/sample-app-backend-multi-account-acme-asg/terragrunt.hcl","sha":"df3dbfd0aefe676e05cac039f99c7f73bc42c863"}]},{"name":"sample-app-backend-multi-account-acme","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/sample-app-backend-multi-account-acme/README.md","sha":"f39f98aa30dbffd02fedd6e5643fb19ba929fbfc"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/sample-app-backend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"c5378dd8f23ae330b44db9295a94a1b643867ca0"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/sample-app-backend-multi-account-acme/terragrunt.hcl","sha":"b6e92a2b42596ee7fcd6270f691d2aadfebe69e1"}]},{"name":"sample-app-beanstalk","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/sample-app-beanstalk/README.md","sha":"d8fd194558f16e1d70f18adff16cf08b00731ff1"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/sample-app-beanstalk/terragrunt.hcl","sha":"3d2f4831defe67f741a96cd171ae6c02b56c9ab3"}]},{"name":"sample-app-frontend-multi-account-acme-asg","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/sample-app-frontend-multi-account-acme-asg/README.md","sha":"679f1b2ed3584ca8f5ceaf7091ef061d4073134b"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/sample-app-frontend-multi-account-acme-asg/ref-arch-v1-to-service-catalog-migration.patch","sha":"d0482f98d401b481061d7a13c0d9700d787030f0"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/sample-app-frontend-multi-account-acme-asg/terragrunt.hcl","sha":"770f4bfac9d605249c601446cd758c645c27827f"}]},{"name":"sample-app-frontend-multi-account-acme","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/sample-app-frontend-multi-account-acme/README.md","sha":"34ba1031c3b9b0e4a033ea6f673ce3923673b791"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/services/sample-app-frontend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"6cf83e8b77c3a281c91174d4837fae1a56ee9f76"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/sample-app-frontend-multi-account-acme/terragrunt.hcl","sha":"1ce4290568fc086be0aba5a7c4bc781eb5174cb8"}]},{"name":"static-website","children":[{"name":"README.md","path":"dev/us-east-1/dev/services/static-website/README.md","sha":"bd02d2c0be6895e1154a84f183684889e0c9549a"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/services/static-website/terragrunt.hcl","sha":"1816335ed8da5ed43278d954ea0a11e3c8a5b91c"}]}]},{"name":"vpc","children":[{"name":"README.md","path":"dev/us-east-1/dev/vpc/README.md","sha":"aac908617b4536d03ad2ccf0a5ad7475cdcd0a7a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/dev/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"43448db936cd81588a8166457db28d83b7707e87"},{"name":"terragrunt.hcl","path":"dev/us-east-1/dev/vpc/terragrunt.hcl","sha":"a44f4ad050d56ed9d1c353f3965e90dc69d828fd"}]}]},{"name":"mgmt","children":[{"name":"README.md","path":"dev/us-east-1/mgmt/README.md","sha":"8a131a11632b97fec18a5e344d5c721fce24b652"},{"name":"env.yaml","path":"dev/us-east-1/mgmt/env.yaml","sha":"b514ab3187ebfb5bf467c632f27a21f5a9611bfc"},{"name":"openvpn-server","children":[{"name":"README.md","path":"dev/us-east-1/mgmt/openvpn-server/README.md","sha":"6d320d06386a4de022b120f1b09c9e45b998e237"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/mgmt/openvpn-server/ref-arch-v1-to-service-catalog-migration.patch","sha":"e3609f5f4bf75469a5806269a001cd7d8afbaac8"},{"name":"terragrunt.hcl","path":"dev/us-east-1/mgmt/openvpn-server/terragrunt.hcl","sha":"d5afd7fda905ae4d1a9e55974b4b8ca668a424bd"}]},{"name":"vpc","children":[{"name":"README.md","path":"dev/us-east-1/mgmt/vpc/README.md","sha":"8ccd0ac3d106218c9d8161f1120feb95d3ca4467"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"dev/us-east-1/mgmt/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"6338a18a396d14957077069552a074518af2bdde"},{"name":"terragrunt.hcl","path":"dev/us-east-1/mgmt/vpc/terragrunt.hcl","sha":"f745823d2c5d71bc18d19fe795c74fee5758650b"}]}]},{"name":"region.yaml","path":"dev/us-east-1/region.yaml","sha":"d56afa3d82e6cea0d792e84748de56dafb0bad70"}]}]},{"name":"master","children":[{"name":"_global","children":[{"name":"README.md","path":"master/_global/README.md","sha":"d1b8a96c00211751f079fa13cac1b3417d29bf09"},{"name":"cloudtrail","children":[{"name":"README.md","path":"master/_global/cloudtrail/README.md","sha":"e6781286118d8ac86fe60cda1057595644d851da"},{"name":"terragrunt.hcl","path":"master/_global/cloudtrail/terragrunt.hcl","sha":"ff6a831d22ccc0fe068906528807dd9741d32bcf"}]},{"name":"iam-cross-account","children":[{"name":"README.md","path":"master/_global/iam-cross-account/README.md","sha":"d33fb4cd9ef7b20250205797177184bf1828f966"},{"name":"terragrunt.hcl","path":"master/_global/iam-cross-account/terragrunt.hcl","sha":"97611b3f29cfd4d9c0c1edde6a498cca4b686241"}]},{"name":"iam-user-password-policy","children":[{"name":"README.md","path":"master/_global/iam-user-password-policy/README.md","sha":"b47d1c6602f3f4ea02fabd247f12c9ee3520be56"},{"name":"terragrunt.hcl","path":"master/_global/iam-user-password-policy/terragrunt.hcl","sha":"97b7cb29f181bdb5276d5c3eccc9e2c75814973c"}]},{"name":"region.yaml","path":"master/_global/region.yaml","sha":"18b7823ed017b97431d58da7bcb9a4e31299272a"}]},{"name":"empty.yaml","path":"master/empty.yaml","sha":"5aa66daa40faeaef37eccb7b4b0fcc792233cd7b"},{"name":"terragrunt.hcl","path":"master/terragrunt.hcl","sha":"935fcc8f2143153b50a183ffed63553ca3c210d5"},{"name":"us-east-1","children":[{"name":"_global","children":[{"name":"README.md","path":"master/us-east-1/_global/README.md","sha":"37b828b038945a50e2e571ef1e755c4f9170e7cf"}]},{"name":"region.yaml","path":"master/us-east-1/region.yaml","sha":"d56afa3d82e6cea0d792e84748de56dafb0bad70"}]}]},{"name":"prod","children":[{"name":"_global","children":[{"name":"README.md","path":"prod/_global/README.md","sha":"d1b8a96c00211751f079fa13cac1b3417d29bf09"},{"name":"cloudtrail","children":[{"name":"README.md","path":"prod/_global/cloudtrail/README.md","sha":"a77d9e833ee0929d5e4f98c87a279599f088fd3d"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/_global/cloudtrail/ref-arch-v1-to-service-catalog-migration.patch","sha":"da28489b7a88cd2e294431898f185933fe153021"},{"name":"terragrunt.hcl","path":"prod/_global/cloudtrail/terragrunt.hcl","sha":"a1294f90b09974353e89d5c16811c3a19e886214"}]},{"name":"iam-cross-account","children":[{"name":"README.md","path":"prod/_global/iam-cross-account/README.md","sha":"bb294808e3bc3690be92762f50cbb6f3e7682a77"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/_global/iam-cross-account/ref-arch-v1-to-service-catalog-migration.patch","sha":"c0e8d348c9ce16a3ae263fd6f634fa9d38b9bd9d"},{"name":"terragrunt.hcl","path":"prod/_global/iam-cross-account/terragrunt.hcl","sha":"b3ea33a23ebea4af915c9e63809ae2fc6fc929bd"}]},{"name":"iam-user-password-policy","children":[{"name":"README.md","path":"prod/_global/iam-user-password-policy/README.md","sha":"ae6a3037443840229494d72aad035820d8abb963"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/_global/iam-user-password-policy/ref-arch-v1-to-service-catalog-migration.patch","sha":"a27dca4d30f493a964316d4ec7b844aa677f8f10"},{"name":"terragrunt.hcl","path":"prod/_global/iam-user-password-policy/terragrunt.hcl","sha":"4b10c3886146130afb97457253b7d66fe648dd35"}]},{"name":"region.yaml","path":"prod/_global/region.yaml","sha":"18b7823ed017b97431d58da7bcb9a4e31299272a"},{"name":"route53-public","children":[{"name":"README.md","path":"prod/_global/route53-public/README.md","sha":"7f038b025378ca59904e756ae472b3f322b166ff"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/_global/route53-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"587cd4f898d50bd700c6aa5931670eea862a5ee7"},{"name":"terragrunt.hcl","path":"prod/_global/route53-public/terragrunt.hcl","sha":"b624cf1133029af90114552d21b42cfe35a8d2a8"}]}]},{"name":"empty.yaml","path":"prod/empty.yaml","sha":"5aa66daa40faeaef37eccb7b4b0fcc792233cd7b"},{"name":"terragrunt.hcl","path":"prod/terragrunt.hcl","sha":"90df42a54569cf4d846a3ab0421c5a4bf5d5594e"},{"name":"us-east-1","children":[{"name":"_global","children":[{"name":"README.md","path":"prod/us-east-1/_global/README.md","sha":"37b828b038945a50e2e571ef1e755c4f9170e7cf"},{"name":"kms-master-key","children":[{"name":"README.md","path":"prod/us-east-1/_global/kms-master-key/README.md","sha":"df569147c68efc00b230d43a699d308a013409b2"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/_global/kms-master-key/ref-arch-v1-to-service-catalog-migration.patch","sha":"8cfdea25648cc57669e4c40221f35e07ba51ff4e"},{"name":"terragrunt.hcl","path":"prod/us-east-1/_global/kms-master-key/terragrunt.hcl","sha":"58071dcfe36c2cd572af4177bb4cf7c2dd3a29d9"}]},{"name":"sns-topics","children":[{"name":"README.md","path":"prod/us-east-1/_global/sns-topics/README.md","sha":"4402f2dd08bfb3e35616c65bbd74b5020f47a4ef"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/_global/sns-topics/ref-arch-v1-to-service-catalog-migration.patch","sha":"cfc97a18bc4119fc61834a6ee51e5b385f5a2d91"},{"name":"terragrunt.hcl","path":"prod/us-east-1/_global/sns-topics/terragrunt.hcl","sha":"92322c844dbbbe2524a99a1ca89f982dea25fdaf"}]}]},{"name":"mgmt","children":[{"name":"README.md","path":"prod/us-east-1/mgmt/README.md","sha":"8a131a11632b97fec18a5e344d5c721fce24b652"},{"name":"env.yaml","path":"prod/us-east-1/mgmt/env.yaml","sha":"b514ab3187ebfb5bf467c632f27a21f5a9611bfc"},{"name":"openvpn-server","children":[{"name":"README.md","path":"prod/us-east-1/mgmt/openvpn-server/README.md","sha":"6d320d06386a4de022b120f1b09c9e45b998e237"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/mgmt/openvpn-server/ref-arch-v1-to-service-catalog-migration.patch","sha":"9f5d05d6128c200f5597614f47087613d92a9def"},{"name":"terragrunt.hcl","path":"prod/us-east-1/mgmt/openvpn-server/terragrunt.hcl","sha":"d67e58f91e27287b840ff0bc8c15433de125f382"}]},{"name":"vpc","children":[{"name":"README.md","path":"prod/us-east-1/mgmt/vpc/README.md","sha":"8ccd0ac3d106218c9d8161f1120feb95d3ca4467"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/mgmt/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"813eda90449e81e9bfd297ca1e0dbb95ce43972b"},{"name":"terragrunt.hcl","path":"prod/us-east-1/mgmt/vpc/terragrunt.hcl","sha":"d0a758e016b3523cfcffaffe2e791e091b7beafa"}]}]},{"name":"prod","children":[{"name":"README.md","path":"prod/us-east-1/prod/README.md","sha":"f15da18661ef3624d5f63deb288bad072e93df57"},{"name":"cloudwatch-dashboard","children":[{"name":"README.md","path":"prod/us-east-1/prod/cloudwatch-dashboard/README.md","sha":"7262ff3d7e6476bca9a882234bc2624499ab3ee1"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/cloudwatch-dashboard/ref-arch-v1-to-service-catalog-migration.patch","sha":"5f2f772d64794bf9aad211f5e8ba3e9ef21f923a"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/cloudwatch-dashboard/terragrunt.hcl","sha":"eaadcd3405df5987d9bb347a002bc136e7ed6467"}]},{"name":"data-stores","children":[{"name":"elk-multi-cluster","children":[{"name":"README.md","path":"prod/us-east-1/prod/data-stores/elk-multi-cluster/README.md","sha":"111f8a7f2339e9f329920b92c275eb9fcf6c18dc"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/data-stores/elk-multi-cluster/terragrunt.hcl","sha":"f4b8d2c2048051720b01cc02fd05f1385c7d06fd"}]},{"name":"kafka","children":[{"name":"README.md","path":"prod/us-east-1/prod/data-stores/kafka/README.md","sha":"8bfe6579bd97e0148c3baa24e1215abce8cf312b"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/data-stores/kafka/terragrunt.hcl","sha":"c892c1fe7a68754dff80d3ed0a4457eea3fd3ef7"}]},{"name":"mysql","children":[{"name":"README.md","path":"prod/us-east-1/prod/data-stores/mysql/README.md","sha":"8e852d5e3b3f35b1ef7b22205f8a304bd80db37a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/data-stores/mysql/ref-arch-v1-to-service-catalog-migration.patch","sha":"2206c9b2b80661255dfed71c87ae600d1b6b67bc"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/data-stores/mysql/terragrunt.hcl","sha":"f9bce51b947047def12f13e7cbd7fdfbcaf01342"}]},{"name":"redis","children":[{"name":"README.md","path":"prod/us-east-1/prod/data-stores/redis/README.md","sha":"8a700f27903c016e919c0ba0f0aa1da63918bc94"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/data-stores/redis/ref-arch-v1-to-service-catalog-migration.patch","sha":"0487f6ea562090f3d38e37bab9d20337cda0d9fb"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/data-stores/redis/terragrunt.hcl","sha":"5192fdd3c04f8af3d71adabf77963095a6542300"}]},{"name":"zookeeper","children":[{"name":"README.md","path":"prod/us-east-1/prod/data-stores/zookeeper/README.md","sha":"451ce7cb440aa724bf4dc8a35726e2bda7e071a2"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/data-stores/zookeeper/terragrunt.hcl","sha":"bd86dd63f05d03b164230d8f4b192b1704d7d37a"}]}]},{"name":"env.yaml","path":"prod/us-east-1/prod/env.yaml","sha":"90e2d18e481b6e35ddc57391f752874ffc0058cf"},{"name":"lambda","children":[{"name":"long-running-scheduled","children":[{"name":"README.md","path":"prod/us-east-1/prod/lambda/long-running-scheduled/README.md","sha":"af7b8b9950d620577e1db104d0140a478e5f46fd"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/lambda/long-running-scheduled/terragrunt.hcl","sha":"053338f0710fc20a53e04bb6ce1c091d91caf652"}]},{"name":"s3-image-processing","children":[{"name":"README.md","path":"prod/us-east-1/prod/lambda/s3-image-processing/README.md","sha":"236ef4197db71e6e121e3ca7182e556fa9ecaa60"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/lambda/s3-image-processing/terragrunt.hcl","sha":"029408751c281ef35a38c965925b2612671add39"}]}]},{"name":"networking","children":[{"name":"alb-internal","children":[{"name":"README.md","path":"prod/us-east-1/prod/networking/alb-internal/README.md","sha":"3906021fe4c6782e90d668369720c34d12eec145"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/networking/alb-internal/ref-arch-v1-to-service-catalog-migration.patch","sha":"e835738a7ee7e920b1918d844f5871a38bb54533"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/networking/alb-internal/terragrunt.hcl","sha":"9c4bd2fcaeb4b959b78ba01447fe4073cd49a30a"}]},{"name":"alb-public","children":[{"name":"README.md","path":"prod/us-east-1/prod/networking/alb-public/README.md","sha":"3906021fe4c6782e90d668369720c34d12eec145"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/networking/alb-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"8023ca935db3baf347c5ba7488404c98d1e61c95"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/networking/alb-public/terragrunt.hcl","sha":"3ad4848529d5aaeb8ea577f840d9a20df5d9bfa2"}]},{"name":"route53-private","children":[{"name":"README.md","path":"prod/us-east-1/prod/networking/route53-private/README.md","sha":"76e78055a77188ea00f1719af3be966e6a6fcd2f"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/networking/route53-private/ref-arch-v1-to-service-catalog-migration.patch","sha":"2f4aa635e9dc05ed210054d26025dfe581999b17"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/networking/route53-private/terragrunt.hcl","sha":"17a655e19676a3f89d54fcf5a75dd81d8fd47f81"}]}]},{"name":"services","children":[{"name":"ecs-cluster","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/ecs-cluster/README.md","sha":"0e194f4435bdab9410947e62d80f1473e9bbafbe"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/ecs-cluster/ref-arch-v1-to-service-catalog-migration.patch","sha":"d18e0f1dd2622a19b7041118cb38ddc2fcccfe6e"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/ecs-cluster/terragrunt.hcl","sha":"1701e29cd84a55f708d3b471236f4d48c7a851db"}]},{"name":"eks-cluster","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/eks-cluster/README.md","sha":"79144f6ec5f25817820094bcb382703cd7a53b7a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/eks-cluster/ref-arch-v1-to-service-catalog-migration.patch","sha":"e987758dc5e659c1c0aa30c249f2ae93d6b59e53"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/eks-cluster/terragrunt.hcl","sha":"96c79456dc54a4b5a2a3d1cb307d37f25cbd457b"}]},{"name":"eks-core-services","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/eks-core-services/README.md","sha":"acc48049ccb695680c483211dc825f770b20548c"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/eks-core-services/ref-arch-v1-to-service-catalog-migration.patch","sha":"0b037d280c33f12dfa6b2a8458da958880fcd8e9"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/eks-core-services/terragrunt.hcl","sha":"3648787c2b324d6c0acfea5fad468b17ea55669d"}]},{"name":"k8s-applications-namespace","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/k8s-applications-namespace/README.md","sha":"5075164405a6fc2a578749fb6066b850764ba1d0"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/k8s-applications-namespace/ref-arch-v1-to-service-catalog-migration.patch","sha":"6572e2134cfa7283547e3db3e43aa585f57e8c1b"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/k8s-applications-namespace/terragrunt.hcl","sha":"fb4d57deac0f95221368f53101346adf03164c32"}]},{"name":"k8s-sample-app-backend-multi-account-acme","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/k8s-sample-app-backend-multi-account-acme/README.md","sha":"0a650d0dfc6522490c6839e087123e9c5c6502f6"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/k8s-sample-app-backend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"72ff12980ff30c2c6a707b755b37b8215e5cee7f"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/k8s-sample-app-backend-multi-account-acme/terragrunt.hcl","sha":"c9c211b973db435a0dfbba5a56c847c4670a35ec"}]},{"name":"k8s-sample-app-frontend-multi-account-acme","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/k8s-sample-app-frontend-multi-account-acme/README.md","sha":"df97cddaa61b759bc537fe0747a7d73370270b78"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/k8s-sample-app-frontend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"63e285e68f93c61a44c3038cd9197672a69efe7c"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/k8s-sample-app-frontend-multi-account-acme/terragrunt.hcl","sha":"d44b75c4cbe59c345dacf0ad3876e9a409118916"}]},{"name":"sample-app-backend-multi-account-acme-asg","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/sample-app-backend-multi-account-acme-asg/README.md","sha":"71aaf40198e9cf1c1196a6a986bf34f42bbf5d13"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/sample-app-backend-multi-account-acme-asg/ref-arch-v1-to-service-catalog-migration.patch","sha":"f61eeeab23cdcac4047bb7ab031532b1a7ff976f"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/sample-app-backend-multi-account-acme-asg/terragrunt.hcl","sha":"c89f91b7e53f8aace41c9d19956aa8cedd90ca10"}]},{"name":"sample-app-backend-multi-account-acme","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/sample-app-backend-multi-account-acme/README.md","sha":"f39f98aa30dbffd02fedd6e5643fb19ba929fbfc"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/sample-app-backend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"265a44ee72b984789cd9f1ce5a6fa43226901936"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/sample-app-backend-multi-account-acme/terragrunt.hcl","sha":"60a8246ebb388d8d92c397871ff6c775692e7627"}]},{"name":"sample-app-beanstalk","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/sample-app-beanstalk/README.md","sha":"508996a61053bb2e94db379981dad22f207cdda4"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/sample-app-beanstalk/terragrunt.hcl","sha":"c0a041ec99ef238c50843f9bdd175a109c86314d"}]},{"name":"sample-app-frontend-multi-account-acme-asg","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/sample-app-frontend-multi-account-acme-asg/README.md","sha":"679f1b2ed3584ca8f5ceaf7091ef061d4073134b"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/sample-app-frontend-multi-account-acme-asg/ref-arch-v1-to-service-catalog-migration.patch","sha":"691444d1f2f8ba40eddcbcc7bf92581c3954e964"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/sample-app-frontend-multi-account-acme-asg/terragrunt.hcl","sha":"264da6545b4b564c1c202b8ddc2e3b8faa161cb8"}]},{"name":"sample-app-frontend-multi-account-acme","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/sample-app-frontend-multi-account-acme/README.md","sha":"34ba1031c3b9b0e4a033ea6f673ce3923673b791"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/services/sample-app-frontend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"433133b835b2907f6d3ed6c79c2e4447ce47c9b5"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/sample-app-frontend-multi-account-acme/terragrunt.hcl","sha":"493b846028079c1d8267401dd0494f1a10b9bb64"}]},{"name":"static-website","children":[{"name":"README.md","path":"prod/us-east-1/prod/services/static-website/README.md","sha":"bd02d2c0be6895e1154a84f183684889e0c9549a"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/services/static-website/terragrunt.hcl","sha":"eb6061f959426b1a8d1e0206d9611bbbaaefc359"}]}]},{"name":"vpc","children":[{"name":"README.md","path":"prod/us-east-1/prod/vpc/README.md","sha":"aac908617b4536d03ad2ccf0a5ad7475cdcd0a7a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"prod/us-east-1/prod/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"2ebecffab0d872845105e9b94989f31c23b1ac61"},{"name":"terragrunt.hcl","path":"prod/us-east-1/prod/vpc/terragrunt.hcl","sha":"eb0187c4afb5a03c6b5f99b8fa2bbaaa7e633af2"}]}]},{"name":"region.yaml","path":"prod/us-east-1/region.yaml","sha":"d56afa3d82e6cea0d792e84748de56dafb0bad70"}]}]},{"name":"provider_k8s_helm_for_eks.template.hcl","path":"provider_k8s_helm_for_eks.template.hcl","sha":"5fca0b82c4d99313ad8dbdeda740f39c40c4bef9"},{"name":"security","children":[{"name":"_global","children":[{"name":"README.md","path":"security/_global/README.md","sha":"d1b8a96c00211751f079fa13cac1b3417d29bf09"},{"name":"cloudtrail","children":[{"name":"README.md","path":"security/_global/cloudtrail/README.md","sha":"a77d9e833ee0929d5e4f98c87a279599f088fd3d"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"security/_global/cloudtrail/ref-arch-v1-to-service-catalog-migration.patch","sha":"e58017d971551d5f2a75a135c83adcd88c9b2f30"},{"name":"terragrunt.hcl","path":"security/_global/cloudtrail/terragrunt.hcl","sha":"924572673bef0e501ff96f4ecc0ad494500799c6"}]},{"name":"iam-cross-account","children":[{"name":"README.md","path":"security/_global/iam-cross-account/README.md","sha":"bb294808e3bc3690be92762f50cbb6f3e7682a77"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"security/_global/iam-cross-account/ref-arch-v1-to-service-catalog-migration.patch","sha":"7cadfe5b89bb24fa5532092d798704ec5aa1eacc"},{"name":"terragrunt.hcl","path":"security/_global/iam-cross-account/terragrunt.hcl","sha":"bba33b568a81ce00096f60c267b3032b624abbce"}]},{"name":"iam-groups","children":[{"name":"README.md","path":"security/_global/iam-groups/README.md","sha":"3f48bf2b82e3e44f89abef6c4b54ff8c627b59cb"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"security/_global/iam-groups/ref-arch-v1-to-service-catalog-migration.patch","sha":"bd5ce28ec898b4de01dd3cdc0c35d36ad23d826e"},{"name":"terragrunt.hcl","path":"security/_global/iam-groups/terragrunt.hcl","sha":"ae4d0894d1e22b3aaa9a1296c7582b06705a1c1e"}]},{"name":"iam-user-password-policy","children":[{"name":"README.md","path":"security/_global/iam-user-password-policy/README.md","sha":"ae6a3037443840229494d72aad035820d8abb963"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"security/_global/iam-user-password-policy/ref-arch-v1-to-service-catalog-migration.patch","sha":"8f7295f484bc648ec9aa97937c2b9b1b55e26758"},{"name":"terragrunt.hcl","path":"security/_global/iam-user-password-policy/terragrunt.hcl","sha":"4b10c3886146130afb97457253b7d66fe648dd35"}]},{"name":"region.yaml","path":"security/_global/region.yaml","sha":"18b7823ed017b97431d58da7bcb9a4e31299272a"}]},{"name":"empty.yaml","path":"security/empty.yaml","sha":"5aa66daa40faeaef37eccb7b4b0fcc792233cd7b"},{"name":"terragrunt.hcl","path":"security/terragrunt.hcl","sha":"96fb1361dbb16afee0dece8200fbfdec0ad1b4e8"}]},{"name":"shared-services","children":[{"name":"_global","children":[{"name":"README.md","path":"shared-services/_global/README.md","sha":"d1b8a96c00211751f079fa13cac1b3417d29bf09"},{"name":"cloudtrail","children":[{"name":"README.md","path":"shared-services/_global/cloudtrail/README.md","sha":"a77d9e833ee0929d5e4f98c87a279599f088fd3d"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/_global/cloudtrail/ref-arch-v1-to-service-catalog-migration.patch","sha":"800f7f57bc42f906c9646a1954d710e961e0098e"},{"name":"terragrunt.hcl","path":"shared-services/_global/cloudtrail/terragrunt.hcl","sha":"a1294f90b09974353e89d5c16811c3a19e886214"}]},{"name":"iam-cross-account","children":[{"name":"README.md","path":"shared-services/_global/iam-cross-account/README.md","sha":"bb294808e3bc3690be92762f50cbb6f3e7682a77"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/_global/iam-cross-account/ref-arch-v1-to-service-catalog-migration.patch","sha":"7e7fe39fd24b94514ed69c328c38cf4f86b20eee"},{"name":"terragrunt.hcl","path":"shared-services/_global/iam-cross-account/terragrunt.hcl","sha":"59f0e658d1828465d3411b44301814e2d9e90b64"}]},{"name":"iam-user-password-policy","children":[{"name":"README.md","path":"shared-services/_global/iam-user-password-policy/README.md","sha":"ae6a3037443840229494d72aad035820d8abb963"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/_global/iam-user-password-policy/ref-arch-v1-to-service-catalog-migration.patch","sha":"080f8852097fcbad1994bba199c8eb36588f4467"},{"name":"terragrunt.hcl","path":"shared-services/_global/iam-user-password-policy/terragrunt.hcl","sha":"4b10c3886146130afb97457253b7d66fe648dd35"}]},{"name":"region.yaml","path":"shared-services/_global/region.yaml","sha":"18b7823ed017b97431d58da7bcb9a4e31299272a"},{"name":"route53-public","children":[{"name":"README.md","path":"shared-services/_global/route53-public/README.md","sha":"7f038b025378ca59904e756ae472b3f322b166ff"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/_global/route53-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"10dad722dc998b0942b9d5a327b9a2ae80e3becf"},{"name":"terragrunt.hcl","path":"shared-services/_global/route53-public/terragrunt.hcl","sha":"b624cf1133029af90114552d21b42cfe35a8d2a8"}]}]},{"name":"empty.yaml","path":"shared-services/empty.yaml","sha":"5aa66daa40faeaef37eccb7b4b0fcc792233cd7b"},{"name":"terragrunt.hcl","path":"shared-services/terragrunt.hcl","sha":"38c0f231aed3710c9b20cc81adfa469942fac90c"},{"name":"us-east-1","children":[{"name":"_global","children":[{"name":"README.md","path":"shared-services/us-east-1/_global/README.md","sha":"37b828b038945a50e2e571ef1e755c4f9170e7cf"},{"name":"ecr-repos","children":[{"name":"README.md","path":"shared-services/us-east-1/_global/ecr-repos/README.md","sha":"b085a00835429b252cfb4f5e475d21948661b084"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/us-east-1/_global/ecr-repos/ref-arch-v1-to-service-catalog-migration.patch","sha":"ae472fe7d2e3e818f15ea7d61861ee1f0a1887ad"},{"name":"terragrunt.hcl","path":"shared-services/us-east-1/_global/ecr-repos/terragrunt.hcl","sha":"c3ba56cd3cc4dcc3efc0990504cc3f329a262fc9"}]},{"name":"kms-master-key","children":[{"name":"README.md","path":"shared-services/us-east-1/_global/kms-master-key/README.md","sha":"df569147c68efc00b230d43a699d308a013409b2"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/us-east-1/_global/kms-master-key/ref-arch-v1-to-service-catalog-migration.patch","sha":"a1d657b5164c924d2553ef59b9a0efd5f0764ef4"},{"name":"terragrunt.hcl","path":"shared-services/us-east-1/_global/kms-master-key/terragrunt.hcl","sha":"94849c8432ab0da5b0df6f069d8ae88e4bd27778"}]},{"name":"sns-topics","children":[{"name":"README.md","path":"shared-services/us-east-1/_global/sns-topics/README.md","sha":"4402f2dd08bfb3e35616c65bbd74b5020f47a4ef"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/us-east-1/_global/sns-topics/ref-arch-v1-to-service-catalog-migration.patch","sha":"62c3bf054bfcb80ea1b0be2a5394553240475f30"},{"name":"terragrunt.hcl","path":"shared-services/us-east-1/_global/sns-topics/terragrunt.hcl","sha":"92322c844dbbbe2524a99a1ca89f982dea25fdaf"}]}]},{"name":"mgmt","children":[{"name":"README.md","path":"shared-services/us-east-1/mgmt/README.md","sha":"8a131a11632b97fec18a5e344d5c721fce24b652"},{"name":"env.yaml","path":"shared-services/us-east-1/mgmt/env.yaml","sha":"b514ab3187ebfb5bf467c632f27a21f5a9611bfc"},{"name":"jenkins","children":[{"name":"README.md","path":"shared-services/us-east-1/mgmt/jenkins/README.md","sha":"5c2dd42585a5baf4a624419fd2bb53b3dbd24291"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/us-east-1/mgmt/jenkins/ref-arch-v1-to-service-catalog-migration.patch","sha":"f6629c2cd25fb516e4a56eca8289226d8c7723c7"},{"name":"terragrunt.hcl","path":"shared-services/us-east-1/mgmt/jenkins/terragrunt.hcl","sha":"8beac9641e07d259bd4b30a92c9dd5f5ffbb8c4c"}]},{"name":"openvpn-server","children":[{"name":"README.md","path":"shared-services/us-east-1/mgmt/openvpn-server/README.md","sha":"6d320d06386a4de022b120f1b09c9e45b998e237"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/us-east-1/mgmt/openvpn-server/ref-arch-v1-to-service-catalog-migration.patch","sha":"e270694a0b65e8193059121f723f68d3635b114d"},{"name":"terragrunt.hcl","path":"shared-services/us-east-1/mgmt/openvpn-server/terragrunt.hcl","sha":"d95ce9779479e566bdf0d075ef225099b96e0914"}]},{"name":"vpc","children":[{"name":"README.md","path":"shared-services/us-east-1/mgmt/vpc/README.md","sha":"8ccd0ac3d106218c9d8161f1120feb95d3ca4467"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"shared-services/us-east-1/mgmt/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"7876cdf28616f11b1fdcd47ab5b92bfe3f0bb8b6"},{"name":"terragrunt.hcl","path":"shared-services/us-east-1/mgmt/vpc/terragrunt.hcl","sha":"bf4d926aa02fdb462a55500a30e96cec394237d5"}]}]},{"name":"region.yaml","path":"shared-services/us-east-1/region.yaml","sha":"d56afa3d82e6cea0d792e84748de56dafb0bad70"}]}]},{"name":"stage","children":[{"name":"_global","children":[{"name":"README.md","path":"stage/_global/README.md","sha":"d1b8a96c00211751f079fa13cac1b3417d29bf09"},{"name":"cloudtrail","children":[{"name":"README.md","path":"stage/_global/cloudtrail/README.md","sha":"a77d9e833ee0929d5e4f98c87a279599f088fd3d"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/_global/cloudtrail/ref-arch-v1-to-service-catalog-migration.patch","sha":"94794a6f0dbe39d8ce4f5259d28dde703894d713"},{"name":"terragrunt.hcl","path":"stage/_global/cloudtrail/terragrunt.hcl","sha":"a1294f90b09974353e89d5c16811c3a19e886214"}]},{"name":"iam-cross-account","children":[{"name":"README.md","path":"stage/_global/iam-cross-account/README.md","sha":"bb294808e3bc3690be92762f50cbb6f3e7682a77"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/_global/iam-cross-account/ref-arch-v1-to-service-catalog-migration.patch","sha":"c76a09f0a19c697fbd846a8a44df76e0a3653709"},{"name":"terragrunt.hcl","path":"stage/_global/iam-cross-account/terragrunt.hcl","sha":"b3ea33a23ebea4af915c9e63809ae2fc6fc929bd"}]},{"name":"iam-user-password-policy","children":[{"name":"README.md","path":"stage/_global/iam-user-password-policy/README.md","sha":"ae6a3037443840229494d72aad035820d8abb963"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/_global/iam-user-password-policy/ref-arch-v1-to-service-catalog-migration.patch","sha":"653ea018c14d3703745c16709f7bca73c28f9259"},{"name":"terragrunt.hcl","path":"stage/_global/iam-user-password-policy/terragrunt.hcl","sha":"4b10c3886146130afb97457253b7d66fe648dd35"}]},{"name":"region.yaml","path":"stage/_global/region.yaml","sha":"18b7823ed017b97431d58da7bcb9a4e31299272a"},{"name":"route53-public","children":[{"name":"README.md","path":"stage/_global/route53-public/README.md","sha":"7f038b025378ca59904e756ae472b3f322b166ff"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/_global/route53-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"4ae2a034e397842fbb6cc090db44f3fa42036c2a"},{"name":"terragrunt.hcl","path":"stage/_global/route53-public/terragrunt.hcl","sha":"b624cf1133029af90114552d21b42cfe35a8d2a8"}]}]},{"name":"empty.yaml","path":"stage/empty.yaml","sha":"5aa66daa40faeaef37eccb7b4b0fcc792233cd7b"},{"name":"terragrunt.hcl","path":"stage/terragrunt.hcl","sha":"a70fbc8c50abcf1a9e4c47632175353e564af54b"},{"name":"us-east-1","children":[{"name":"_global","children":[{"name":"README.md","path":"stage/us-east-1/_global/README.md","sha":"37b828b038945a50e2e571ef1e755c4f9170e7cf"},{"name":"kms-master-key","children":[{"name":"README.md","path":"stage/us-east-1/_global/kms-master-key/README.md","sha":"df569147c68efc00b230d43a699d308a013409b2"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/_global/kms-master-key/ref-arch-v1-to-service-catalog-migration.patch","sha":"32c62c18289af326c2c804444b00bba99d504895"},{"name":"terragrunt.hcl","path":"stage/us-east-1/_global/kms-master-key/terragrunt.hcl","sha":"3aba2c0aba7849d1a738c4442a02a9ef3cd5db65"}]},{"name":"sns-topics","children":[{"name":"README.md","path":"stage/us-east-1/_global/sns-topics/README.md","sha":"4402f2dd08bfb3e35616c65bbd74b5020f47a4ef"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/_global/sns-topics/ref-arch-v1-to-service-catalog-migration.patch","sha":"c71bb4ac050ad9a9bc39cb43be8c2b16f615cf65"},{"name":"terragrunt.hcl","path":"stage/us-east-1/_global/sns-topics/terragrunt.hcl","sha":"92322c844dbbbe2524a99a1ca89f982dea25fdaf"}]}]},{"name":"mgmt","children":[{"name":"README.md","path":"stage/us-east-1/mgmt/README.md","sha":"8a131a11632b97fec18a5e344d5c721fce24b652"},{"name":"env.yaml","path":"stage/us-east-1/mgmt/env.yaml","sha":"b514ab3187ebfb5bf467c632f27a21f5a9611bfc"},{"name":"openvpn-server","children":[{"name":"README.md","path":"stage/us-east-1/mgmt/openvpn-server/README.md","sha":"6d320d06386a4de022b120f1b09c9e45b998e237"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/mgmt/openvpn-server/ref-arch-v1-to-service-catalog-migration.patch","sha":"d0cb73b2b03bcb8d8c3f65928933c050ab70d021"},{"name":"terragrunt.hcl","path":"stage/us-east-1/mgmt/openvpn-server/terragrunt.hcl","sha":"ad4dbc8b0e137511e031b96e6f0d30b04e18e126"}]},{"name":"vpc","children":[{"name":"README.md","path":"stage/us-east-1/mgmt/vpc/README.md","sha":"8ccd0ac3d106218c9d8161f1120feb95d3ca4467"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/mgmt/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"cd9d99e077df9e55c9d69ae801fcb4c680074793"},{"name":"terragrunt.hcl","path":"stage/us-east-1/mgmt/vpc/terragrunt.hcl","sha":"c99d85482d6efe5380b56a71bfefddff6c0dbb56"}]}]},{"name":"region.yaml","path":"stage/us-east-1/region.yaml","sha":"d56afa3d82e6cea0d792e84748de56dafb0bad70"},{"name":"stage","children":[{"name":"README.md","path":"stage/us-east-1/stage/README.md","sha":"b24ba21bf01baf19ff84a2de457697a757d905c5"},{"name":"cloudwatch-dashboard","children":[{"name":"README.md","path":"stage/us-east-1/stage/cloudwatch-dashboard/README.md","sha":"7262ff3d7e6476bca9a882234bc2624499ab3ee1"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/cloudwatch-dashboard/ref-arch-v1-to-service-catalog-migration.patch","sha":"cdab9b7494e254741ee58e353ac9cb27332fe7ea"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/cloudwatch-dashboard/terragrunt.hcl","sha":"5a958b8776502f8a3a70f1d81dcc10d86f50d146"}]},{"name":"data-stores","children":[{"name":"elk-single-cluster","children":[{"name":"README.md","path":"stage/us-east-1/stage/data-stores/elk-single-cluster/README.md","sha":"9a1cb70a6f6b1b3ac81b2c7c5b17d902328db1e0"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/data-stores/elk-single-cluster/terragrunt.hcl","sha":"47a6b969c6ceafa491fe99043b21f47cbe159c8a"}]},{"name":"kafka","children":[{"name":"README.md","path":"stage/us-east-1/stage/data-stores/kafka/README.md","sha":"8bfe6579bd97e0148c3baa24e1215abce8cf312b"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/data-stores/kafka/terragrunt.hcl","sha":"41d9cdb6f3ca2943fbbf2c2a76b01b2d822e87ef"}]},{"name":"mysql","children":[{"name":"README.md","path":"stage/us-east-1/stage/data-stores/mysql/README.md","sha":"8e852d5e3b3f35b1ef7b22205f8a304bd80db37a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/data-stores/mysql/ref-arch-v1-to-service-catalog-migration.patch","sha":"6cb28479e9fec8fe41db1255f42b9a1df7459dfc"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/data-stores/mysql/terragrunt.hcl","sha":"7b1436ede30aa86ac3c51b9bfffeea79bd5a5a3e"}]},{"name":"redis","children":[{"name":"README.md","path":"stage/us-east-1/stage/data-stores/redis/README.md","sha":"8a700f27903c016e919c0ba0f0aa1da63918bc94"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/data-stores/redis/ref-arch-v1-to-service-catalog-migration.patch","sha":"c0be3a039cc7436ae3f894db8777c543b42a8680"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/data-stores/redis/terragrunt.hcl","sha":"7e2dfe72fc4a80511f81bd9d3956f57828d48826"}]},{"name":"zookeeper","children":[{"name":"README.md","path":"stage/us-east-1/stage/data-stores/zookeeper/README.md","sha":"451ce7cb440aa724bf4dc8a35726e2bda7e071a2"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/data-stores/zookeeper/terragrunt.hcl","sha":"8d21c97eea210f4701e6ea2edfc48b9ba7de4832"}]}]},{"name":"env.yaml","path":"stage/us-east-1/stage/env.yaml","sha":"5767506e27e978f52524dadbbd8fb9f8ad115599"},{"name":"lambda","children":[{"name":"long-running-scheduled","children":[{"name":"README.md","path":"stage/us-east-1/stage/lambda/long-running-scheduled/README.md","sha":"af7b8b9950d620577e1db104d0140a478e5f46fd"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/lambda/long-running-scheduled/terragrunt.hcl","sha":"053338f0710fc20a53e04bb6ce1c091d91caf652"}]},{"name":"s3-image-processing","children":[{"name":"README.md","path":"stage/us-east-1/stage/lambda/s3-image-processing/README.md","sha":"236ef4197db71e6e121e3ca7182e556fa9ecaa60"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/lambda/s3-image-processing/terragrunt.hcl","sha":"e01d28cf1faf58bf283f024eaa5d4b059e8e796a"}]}]},{"name":"networking","children":[{"name":"alb-internal","children":[{"name":"README.md","path":"stage/us-east-1/stage/networking/alb-internal/README.md","sha":"3906021fe4c6782e90d668369720c34d12eec145"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/networking/alb-internal/ref-arch-v1-to-service-catalog-migration.patch","sha":"473787b63cf285938e9ccccc58709de4ce84751a"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/networking/alb-internal/terragrunt.hcl","sha":"a77fed2b4eea01cdc49bca2b8fc880102ef75edb"}]},{"name":"alb-public","children":[{"name":"README.md","path":"stage/us-east-1/stage/networking/alb-public/README.md","sha":"3906021fe4c6782e90d668369720c34d12eec145"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/networking/alb-public/ref-arch-v1-to-service-catalog-migration.patch","sha":"1a0eea39e341eaa80353d83a696028c99caa4b78"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/networking/alb-public/terragrunt.hcl","sha":"af7f6af35b84f84f233fb87f898848ab937e08be"}]},{"name":"route53-private","children":[{"name":"README.md","path":"stage/us-east-1/stage/networking/route53-private/README.md","sha":"76e78055a77188ea00f1719af3be966e6a6fcd2f"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/networking/route53-private/ref-arch-v1-to-service-catalog-migration.patch","sha":"00bb0538403316a675283f016e764134ab3e2bbb"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/networking/route53-private/terragrunt.hcl","sha":"17a655e19676a3f89d54fcf5a75dd81d8fd47f81"}]}]},{"name":"services","children":[{"name":"ecs-cluster","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/ecs-cluster/README.md","sha":"0e194f4435bdab9410947e62d80f1473e9bbafbe"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/ecs-cluster/ref-arch-v1-to-service-catalog-migration.patch","sha":"a6ce4afa26d4965affe913be4634eede04c44336"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/ecs-cluster/terragrunt.hcl","sha":"ddf47726f6198a70294a01331734ac0a5c33e6b9"}]},{"name":"eks-cluster","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/eks-cluster/README.md","sha":"30c1dad28317275d28f32e5769a002280a76860f"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/eks-cluster/ref-arch-v1-to-service-catalog-migration.patch","sha":"032906eebb4273b9850d7cd7ec84dcea46dd4e15"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/eks-cluster/terragrunt.hcl","sha":"922e21c4be9748d4c996a295909d3f9f8cd467b4"}]},{"name":"eks-core-services","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/eks-core-services/README.md","sha":"7018ff2c2afdb225b49f17c5ca7ebaa7a9d85dca"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/eks-core-services/ref-arch-v1-to-service-catalog-migration.patch","sha":"158ce83ecef50e84b92a717071ca4a745d94bf73"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/eks-core-services/terragrunt.hcl","sha":"3648787c2b324d6c0acfea5fad468b17ea55669d"}]},{"name":"k8s-applications-namespace","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/k8s-applications-namespace/README.md","sha":"4c8b75ab3d046b6f1ef9228d8cab74b8d129c21c"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/k8s-applications-namespace/ref-arch-v1-to-service-catalog-migration.patch","sha":"731e9a7e3744e2e7e201663ebd02b8836d26b23a"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/k8s-applications-namespace/terragrunt.hcl","sha":"fb4d57deac0f95221368f53101346adf03164c32"}]},{"name":"k8s-sample-app-backend-multi-account-acme","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/k8s-sample-app-backend-multi-account-acme/README.md","sha":"092aed97d7311203dd555d97dabce81462e3d502"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/k8s-sample-app-backend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"b7819226abdfaf3671467222bd6c72d5d5d7241e"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/k8s-sample-app-backend-multi-account-acme/terragrunt.hcl","sha":"58f9d709c4728622438fdc4b1887958c3e9fcbed"}]},{"name":"k8s-sample-app-frontend-multi-account-acme","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/k8s-sample-app-frontend-multi-account-acme/README.md","sha":"4ef74117461c908221d461f2942bc9ee32dc27d0"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/k8s-sample-app-frontend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"d6d9376ab59c05229ae8a2231b6224ace5c0e91b"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/k8s-sample-app-frontend-multi-account-acme/terragrunt.hcl","sha":"bda6e4b12e81ce8a0a20653bc61d2eeda2ec23c1"}]},{"name":"sample-app-backend-multi-account-acme-asg","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/sample-app-backend-multi-account-acme-asg/README.md","sha":"71aaf40198e9cf1c1196a6a986bf34f42bbf5d13"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/sample-app-backend-multi-account-acme-asg/ref-arch-v1-to-service-catalog-migration.patch","sha":"12e36306d3ef30864b2bc2eb0c7939769bf9564d"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/sample-app-backend-multi-account-acme-asg/terragrunt.hcl","sha":"ddeb00d5f0d07976d4ea26e0f4e0b500fb48e38f"}]},{"name":"sample-app-backend-multi-account-acme","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/sample-app-backend-multi-account-acme/README.md","sha":"f39f98aa30dbffd02fedd6e5643fb19ba929fbfc"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/sample-app-backend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"501c91d776709789d772032a6fd63912b0e95a93"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/sample-app-backend-multi-account-acme/terragrunt.hcl","sha":"a7e6eb546357d1745ec45234c411579fd00d524d"}]},{"name":"sample-app-beanstalk","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/sample-app-beanstalk/README.md","sha":"ca82bac8a71d434fbd3bface3210ab8cc84c8790"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/sample-app-beanstalk/terragrunt.hcl","sha":"384bb161d96ed1e2aadd745435cd4bceee4427d6"}]},{"name":"sample-app-frontend-multi-account-acme-asg","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme-asg/README.md","sha":"679f1b2ed3584ca8f5ceaf7091ef061d4073134b"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme-asg/ref-arch-v1-to-service-catalog-migration.patch","sha":"6c3e06d006c6b8d49fed1aeb9024d4d7ea8e4774"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme-asg/terragrunt.hcl","sha":"e481d0bdb38eb4db66825429b702fac577debd95"}]},{"name":"sample-app-frontend-multi-account-acme","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme/README.md","sha":"34ba1031c3b9b0e4a033ea6f673ce3923673b791"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme/ref-arch-v1-to-service-catalog-migration.patch","sha":"5f8525b4fa0142438078f1fdda7c4c019ca74ff4"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme/terragrunt.hcl","sha":"6a9239c16832c5876bf29ace4c5039f214837bd8"}]},{"name":"static-website","children":[{"name":"README.md","path":"stage/us-east-1/stage/services/static-website/README.md","sha":"bd02d2c0be6895e1154a84f183684889e0c9549a"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/services/static-website/terragrunt.hcl","sha":"f49e8451f349e69499610f47d641a17d98c32eca"}]}]},{"name":"vpc","children":[{"name":"README.md","path":"stage/us-east-1/stage/vpc/README.md","sha":"aac908617b4536d03ad2ccf0a5ad7475cdcd0a7a"},{"name":"ref-arch-v1-to-service-catalog-migration.patch","path":"stage/us-east-1/stage/vpc/ref-arch-v1-to-service-catalog-migration.patch","sha":"2a93ffd3e95950d7624c08a3e73e3a62c5d9544f"},{"name":"terragrunt.hcl","path":"stage/us-east-1/stage/vpc/terragrunt.hcl","sha":"0c7b338972729dc7e4bdc1b7dd2526b2cbe744cb"}]}]}]}]},{"name":"terragrunt_service_catalog.hcl","path":"terragrunt_service_catalog.hcl","sha":"bf133e079ad244faf5f4d34208dfe89ed220a9e8"}]},"detailsContent":"<h1 class=\"preview__body--title\" id=\"how-to-deploy-a-docker-service\">How To Deploy A Docker Service</h1><div class=\"preview__body--border\"></div><p>This guide walks you through deploying a dockerized app to the EKS cluster running in your Reference Architecture in AWS.</p>\n<ul>\n<li><a href=\"#the-app\" class=\"preview__body--description--blue\">The App</a></li>\n<li><a href=\"#dockerizing\" class=\"preview__body--description--blue\">Dockerizing</a></li>\n<li><a href=\"#publishing-your-docker-image\" class=\"preview__body--description--blue\">Publishing your docker image</a></li>\n<li><a href=\"#deploying-to-a-cluster\" class=\"preview__body--description--blue\">Deploying to a cluster</a>\n<ul>\n<li><a href=\"#service-configuration\" class=\"preview__body--description--blue\">Service Configuration</a></li>\n<li><a href=\"#ingress-configuration\" class=\"preview__body--description--blue\">Ingress Configuration</a></li>\n<li><a href=\"#deploying-your-configuration\" class=\"preview__body--description--blue\">Deploying your configuration</a></li>\n<li><a href=\"#monitoring-your-deployment-progress\" class=\"preview__body--description--blue\">Monitoring your deployment progress</a></li>\n</ul>\n</li>\n<li><a href=\"#debugging-errors\" class=\"preview__body--description--blue\">Debugging errors</a>\n<ul>\n<li><a href=\"#using-kubectl\" class=\"preview__body--description--blue\">Using kubectl</a></li>\n<li><a href=\"#cloudwatch-logs\" class=\"preview__body--description--blue\">CloudWatch Logs</a></li>\n</ul>\n</li>\n</ul>\n<h2 class=\"preview__body--subtitle\" id=\"the-app\">The App</h2>\n<p>Let's say you have an app that you want to deploy. For this guide, we'll use a simple Node.js app as an example, but the same principles can be applied to any app:</p>\n<pre><span class=\"hljs-keyword\">const</span> express = <span class=\"hljs-built_in\">require</span>(<span class=\"hljs-string\">'express'</span>);\n\n<span class=\"hljs-comment\">// Constants</span>\n<span class=\"hljs-keyword\">const</span> PORT = <span class=\"hljs-number\">8080</span>;\n<span class=\"hljs-keyword\">const</span> HOST = <span class=\"hljs-string\">'0.0.0.0'</span>;\n\n<span class=\"hljs-comment\">// App</span>\n<span class=\"hljs-keyword\">const</span> app = express();\napp.get(<span class=\"hljs-string\">'/simple-web-app'</span>, <span class=\"hljs-function\">(<span class=\"hljs-params\">req, res</span>) =></span> {\n res.send(<span class=\"hljs-string\">'Hello world\\n'</span>);\n});\n\napp.listen(PORT, HOST);\n<span class=\"hljs-built_in\">console</span>.log(<span class=\"hljs-string\">`Running on http://<span class=\"hljs-subst\">${HOST}</span>:<span class=\"hljs-subst\">${PORT}</span>`</span>);\n</pre>\n<p>That's it! It's a classic express "Hello World" starter app that listens for requests on port <code>8080</code>. For this example\nwalkthrough, save this file as <code>server.js</code>.</p>\n<p>Since we need to pull in the dependencies to run this app, we will also need a corresponding <code>package.json</code>:</p>\n<pre>{\n <span class=\"hljs-attr\">\"name\"</span>: <span class=\"hljs-string\">\"docker_web_app\"</span>,\n <span class=\"hljs-attr\">\"version\"</span>: <span class=\"hljs-string\">\"1.0.0\"</span>,\n <span class=\"hljs-attr\">\"main\"</span>: <span class=\"hljs-string\">\"server.js\"</span>,\n <span class=\"hljs-attr\">\"scripts\"</span>: {\n <span class=\"hljs-attr\">\"start\"</span>: <span class=\"hljs-string\">\"node server.js\"</span>\n },\n <span class=\"hljs-attr\">\"dependencies\"</span>: {\n <span class=\"hljs-attr\">\"express\"</span>: <span class=\"hljs-string\">\"^4.16.1\"</span>\n }\n}\n</pre>\n<h2 class=\"preview__body--subtitle\" id=\"dockerizing\">Dockerizing</h2>\n<p>In order to deploy the app on EKS, we need to dockerize the app. If you are not familiar with the basics of docker, we recommend you check out our "Crash Course on Docker and Packer" from the <a href=\"https://training.gruntwork.io/p/a-crash-course-on-docker-packer\" class=\"preview__body--description--blue\" target=\"_blank\">Gruntwork Training Library</a>.</p>\n<p>For this guide, we will use the following Dockerfile to package our app into a container.</p>\n<pre><span class=\"hljs-keyword\">FROM</span> node:<span class=\"hljs-number\">8</span>\n\n<span class=\"hljs-comment\"># Create app directory</span>\n<span class=\"hljs-keyword\">WORKDIR</span><span class=\"bash\"> /usr/app</span>\n\n<span class=\"hljs-keyword\">COPY</span><span class=\"bash\"> package*.json ./</span>\n\n<span class=\"hljs-keyword\">RUN</span><span class=\"bash\"> npm install</span>\n<span class=\"hljs-keyword\">COPY</span><span class=\"bash\"> . .</span>\n\n<span class=\"hljs-keyword\">EXPOSE</span> <span class=\"hljs-number\">8080</span>\n<span class=\"hljs-keyword\">CMD</span><span class=\"bash\"> [ <span class=\"hljs-string\">\"npm\"</span>, <span class=\"hljs-string\">\"start\"</span> ]</span>\n</pre>\n<p>The folder structure of our sample app looks like this:</p>\n<pre>├── <span class=\"hljs-selector-tag\">server</span><span class=\"hljs-selector-class\">.js</span>\n├── <span class=\"hljs-selector-tag\">Dockerfile</span>\n└── <span class=\"hljs-selector-tag\">package</span><span class=\"hljs-selector-class\">.json</span>\n</pre>\n<p>Your actual app will definitely be way more complicated than this but the main point to take from here, is that we need to ensure our docker image is configured to EXPOSE the port that our app is going to need for external communication. See <a href=\"https://docs.docker.com/samples/\" class=\"preview__body--description--blue\" target=\"_blank\">examples</a> of how to dockerize many popular app formats.</p>\n<p>To build this a docker image from the Dockerfile, run:</p>\n<pre>$ docker <span class=\"hljs-keyword\">build </span>-t simple-web-app:latest .\n</pre>\n<p>Now we can test our container to see if it is working:</p>\n<pre>$ docker <span class=\"hljs-keyword\">run</span> --<span class=\"hljs-keyword\">rm</span> -p 8080:8080 simple-web-<span class=\"hljs-keyword\">app</span>:latest\n</pre>\n<p>This starts the newly built container and links port <code>8080</code> on your machine to the container's port <code>8080</code>. You should\nsee output like below when you run this command:</p>\n<pre>> docker_web_app@<span class=\"hljs-number\">1.0</span>.<span class=\"hljs-number\">0</span> <span class=\"hljs-literal\">start</span> /usr/app\n> <span class=\"hljs-keyword\">node</span> <span class=\"hljs-title\">server</span>.js\n\nRunning on http://<span class=\"hljs-number\">0.0</span>.<span class=\"hljs-number\">0.0</span>:<span class=\"hljs-number\">8080</span>\n</pre>\n<p>You should now be able to hit the app by opening <code>localhost:8080</code> in your browser. Try it out to verify you get the\n"Hello world" message from the server.</p>\n<p>Some things to note when writing up your Dockerfile and building your app:</p>\n<ul>\n<li>Ensure your Dockerfile starts your app in the foreground so the container doesn't shutdown after app startup.</li>\n<li>Your app should log to stdout/stderr to aid in <a href=\"#debugging-errors\" class=\"preview__body--description--blue\">debugging</a> it after deployment to AWS</li>\n</ul>\n<h2 class=\"preview__body--subtitle\" id=\"publishing-your-docker-image\">Publishing your docker image</h2>\n<p>Once you've verified that you can build your app's docker image without any errors, the next step is to publish those images to an ECR repo. The ECR repos exists in your <code>shared-services</code> account.</p>\n<p>Go to this <a href=\"/repos/v0.0.1-20210527/infrastructure-live-multi-account-acme/shared-services/us-east-1/_global/ecr-repos/terragrunt.hcl\" class=\"preview__body--description--blue\">file</a> and add the desired repository name of your app to the <code>repo_names</code> list. For the purposes of our example, let's call ours <code>simple-web-app</code>. Next, <a href=\"/repos/v0.0.1-20210527/infrastructure-live-multi-account-acme/_docs/09-accounts-and-auth.md\" class=\"preview__body--description--blue\">authenticate</a> to the <code>shared-services</code> account and run the following command:</p>\n<pre>$ terragrunt <span class=\"hljs-built_in\">apply</span>\n</pre>\n<p>The command should create an ECR repo with the name you specified in the <code>shared-services</code> account. Each repo in ECR has a URL of the format <code><ACCOUNT_ID>.dkr.ecr.<REGION>.amazonaws.com/<REPO_NAME></code>. So for the <code>shared-services</code> account with ID 087285199408, an ECR repo in us-east-1, and an app called <code>simple-web-app</code>, you can publish your local docker image to the newly created repo as follows:</p>\n<pre>$ docker tag simple-web-app:latest <span class=\"hljs-number\">087285199408</span><span class=\"hljs-selector-class\">.dkr</span><span class=\"hljs-selector-class\">.ecr</span><span class=\"hljs-selector-class\">.us-east-1</span><span class=\"hljs-selector-class\">.amazonaws</span>.com/simple-web-app\n</pre>\n<p>Finally, authenticate your docker client with Amazon ECR</p>\n<pre><span class=\"hljs-string\">eval </span>$(<span class=\"hljs-string\">aws </span><span class=\"hljs-string\">ecr </span><span class=\"hljs-built_in\">get-login</span> <span class=\"hljs-built_in\">--region</span> <span class=\"hljs-string\">\"us-east-1\"</span> <span class=\"hljs-built_in\">--no-include-email</span> <span class=\"hljs-built_in\">--registry-ids</span> <span class=\"hljs-string\">\"087285199408\"</span>)\n</pre>\n<p>and push your newly tagged image to publish it:</p>\n<pre>$ docker push <span class=\"hljs-number\">087285199408</span><span class=\"hljs-selector-class\">.dkr</span><span class=\"hljs-selector-class\">.ecr</span><span class=\"hljs-selector-class\">.us-east-1</span><span class=\"hljs-selector-class\">.amazonaws</span>.com/simple-web-app\n</pre>\n<h2 class=\"preview__body--subtitle\" id=\"deploying-to-a-cluster\">Deploying to a cluster</h2>\n<p>Now that you have the docker image of your app published, the next step is to deploy it to your EKS Cluster that was set up as part of your reference architecture deployment.</p>\n<p>The first step is to create a folder with your app name in the <code>services</code> folder for each of your environments (i.e. dev, stage, prod) in <a href=\"/repos/v0.0.1-20210527/infrastructure-live-multi-account-acme\" class=\"preview__body--description--blue\">infrastructure-live</a>. For example, for the <code>stage</code> environment, we'd create a <code>simple-web-app</code> folder under <a href=\"/repos/v0.0.1-20210527/infrastructure-live-multi-account-acme/stage/us-east-1/stage/services\" class=\"preview__body--description--blue\">stage/us-east-1/stage/services</a>. Next, you can copy over the contents of the <a href=\"/repos/v0.0.1-20210527/infrastructure-live-multi-account-acme/stage/us-east-1/stage/services/sample-app-frontend-multi-account-acme\" class=\"preview__body--description--blue\">sample-app terragrunt.hcl</a> so we have something to start with.</p>\n<pre>$ cp -r ~<span class=\"hljs-regexp\">/source/i</span>nfrastructure-live-multi-account-acme<span class=\"hljs-regexp\">/stage/u</span>s-east-<span class=\"hljs-number\">1</span><span class=\"hljs-regexp\">/stage/</span>services<span class=\"hljs-regexp\">/sample-app-frontend-multi-account-acme ~/</span><span class=\"hljs-keyword\">source</span><span class=\"hljs-regexp\">/infrastructure-live-multi-account-acme/</span>stage<span class=\"hljs-regexp\">/us-east-1/</span>stage<span class=\"hljs-regexp\">/services/</span>simple-web-app\n</pre>\n<p>Still in the <code>simple-web-app</code> folder, open the <code>terragrunt.hcl</code> file and update the following parameters:</p>\n<h3 class=\"preview__body--subtitle\" id=\"service-configuration\">Service Configuration</h3>\n<ul>\n<li>Set <code>service_name</code> to your desired name. In our case we'll just set it to <code>simple-web-app-{env}</code>. Where <code>{env}</code> is the environment we're currently in.</li>\n<li>Set <code>image</code> to the repo url of the just published docker image. In our case, <code>087285199408.dkr.ecr.us-east-1.amazonaws.com/simple-web-app</code></li>\n<li>Set <code>desired_number_of_pods</code> to the number of tasks of your app you want EKS to spawn. Let's set ours to <code>2</code>.</li>\n<li>Set <code>container_port</code> to the port your container exposes. In our case, <code>8080</code>.</li>\n</ul>\n<h3 class=\"preview__body--subtitle\" id=\"ingress-configuration\">Ingress Configuration</h3>\n<p>When deployed, the actual containers are run as <code>Pods</code> on the EKS cluster, which are scheduled to the worker nodes.\nWithin the cluster, services can communicate with each other using the <code>Service</code> endpoints which are automatically\nprovisioned by the underlying terraform modules. However, these endpoints are not accessible outside of the cluster.</p>\n<p>You can use <code>Ingress</code> resources to expose your <code>Service</code> to be accessible outside of Kubernetes. <code>Ingress</code> resources\nmanage and configure AWS ALBs that eventually lead to the <code>Service</code> endpoint. These resources are configured by the\nmodule using the input variables with the prefix <code>ingress_</code> (e.g., <code>ingress_path</code>, <code>ingress_listener_protocol_ports</code>,\netc) and <code>domain_name</code>.</p>\n<p>For example, to expose an ALB that maps the path <code>/simple-web-app</code> to our <code>Service</code>, you can set the <code>ingress_path</code>\nvariable to:</p>\n<pre><span class=\"hljs-attr\">ingress_path</span> = <span class=\"hljs-string\">\"/simple-web-app\"</span>\n</pre>\n<p>This will create an <code>Ingress</code> resource for the <code>simple-web-app</code> that will map to an ALB in our environment. This ALB\nwill expose port <code>80</code> and forward any requests that hit the path <code>/simple-web-app</code> to our container on the port we\ndefined in <code>container_port</code>, which is <code>8080</code>.</p>\n<p>You can query the <code>Ingress</code> endpoint using <code>kubectl</code> once the app is deployed:</p>\n<pre>kubectl get ingresses \\\n -<span class=\"ruby\">l <span class=\"hljs-string\">\"app.kubernetes.io/name=simple-web-app,app.kubernetes.io/instance=simple-web-app\"</span> \\\n</span> -<span class=\"ruby\">o jsonpath \\\n</span> -<span class=\"ruby\">-template <span class=\"hljs-string\">'{.items[0].status.loadBalancer.ingress[0].hostname}'</span>\n</span></pre>\n<p>This will output the <code>Ingress</code> endpoint to the console. You should then be able to hit it to reach your deployed app -\ni.e. <code>http://$INGRESS_ENDPOINT/simple-web-app</code>.</p>\n<h4 id=\"route-53-domain-records\">Route 53 Domain Records</h4>\n<p>Your EKS cluster is deployed with <a href=\"https://github.com/kubernetes-incubator/external-dns\" class=\"preview__body--description--blue\" target=\"_blank\">external-dns</a> installed. This\nwill automatically map hostnames configured on the <code>Ingress</code> resource to existing Route 53 Hosted Zones to link the\ndomain name to the provisioned ALBs.</p>\n<p>For example, to make the <code>simple-web-app</code> available under the domain <code>simple-web-app.gruntwork.io</code>,\nyou can set the <code>domain_name</code> to be:</p>\n<pre><span class=\"hljs-attr\">ingress_path</span> = <span class=\"hljs-string\">\"/*\"</span>\n<span class=\"hljs-attr\">create_route53_entry</span> = <span class=\"hljs-literal\">true</span>\n<span class=\"hljs-attr\">domain_name</span> = <span class=\"hljs-string\">\"simple-web-app.gruntwork.io\"</span>\n</pre>\n<p>When applied, this will not only provision the ALB, but also create a new subdomain record for <code>simple-web-app</code> for the\ncorresponding Route 53 Hosted Zone for the domain <code>gruntwork.io</code>\nto map to the new ALB.</p>\n<h4 id=\"tls-configuration\">TLS configuration</h4>\n<p>The cluster will also autodiscover any ACM TLS certificates that support the chosen domain. For example, the Reference\nArchitecture comes with ACM TLS certificates for all subdomains of the domain names used for the sample app frontend in\neach environment. This means that if you use any subdomain on those host names for the Route 53 record, the\ncorresponding ACM certificates will be automatically associated with the ALB. This also works for private domain names\nas well, provided that you create the ACM certificates and Route 53 Hosted Zones.</p>\n<p>Note that for TLS to function properly, you need to set the <code>ingress_listener_ports</code> to accept HTTPS:</p>\n<pre><span class=\"hljs-attr\">ingress_listener_ports</span> = [\n {\n HTTPS = <span class=\"hljs-number\">443</span>\n }\n]\n</pre>\n<h3 class=\"preview__body--subtitle\" id=\"deploying-your-configuration\">Deploying your configuration</h3>\n<p>The above are the minimum set of configurations that you need to deploy the app. You can take a look\n<a href=\"/repos/infrastructure-modules-multi-account-acme/services/k8s-service/variables.tf\" class=\"preview__body--description--blue\">here</a>\nfor more options.</p>\n<p>Once you've verified that everything looks fine, run:</p>\n<pre>$ terragrunt <span class=\"hljs-built_in\">apply</span>\n</pre>\n<p>This will apply your configuration to the cluster and deploy your app.</p>\n<h3 class=\"preview__body--subtitle\" id=\"monitoring-your-deployment-progress\">Monitoring your deployment progress</h3>\n<p>Due to the asynchronous nature of Kubernetes deployments, a successful <code>terragrunt apply</code> does not always mean your app\nwas deployed successfully. There are several resources that need to rollout in Kubernetes before your application is\navailable:</p>\n<ul>\n<li>The <code>Pods</code> associated with the <code>Deployment</code>.</li>\n<li>The ALB that fulfills the <code>Ingress</code> endpoint (if applicable).</li>\n<li>The DNS record that maps to the <code>Ingress</code> endpoint (if applicable).</li>\n</ul>\n<p>Once <code>terragrunt apply</code> completes, you can use <code>kubectl</code> to monitor the status of the rollout.</p>\n<h4 id=\"monitoring-deployment-rollout\">Monitoring Deployment rollout</h4>\n<p><code>Deployment</code> resources define controllers in Kubernetes that ensure the state of the cluster matches the desired state\nas described in the manifest. This is handled asynchronously after the changes have been applied to the manifest\nconfiguration. You can use the <code>rollout status</code> command of <code>kubectl</code> to watch and wait for the rollout to complete:</p>\n<pre><span class=\"hljs-comment\"># First get the name of the deployment object</span>\nDEPLOYMENT_NAME=$(kubectl get deployments \\\n -l <span class=\"hljs-string\">\"app.kubernetes.io/name=simple-web-app,app.kubernetes.io/instance=simple-web-app\"</span> \\\n --all-namespaces \\\n -o jsonpath \\\n --template '{.items[<span class=\"hljs-number\">0</span>].metadata.name}')\n<span class=\"hljs-comment\"># Then, wait for the rollout to complete</span>\nkubectl rollout status deployment/<span class=\"hljs-string\">\"$DEPLOYMENT_NAME\"</span> -w\n</pre>\n<p>This will print out the status of the rollout in the context of how many <code>Pods</code> have been launched using the current\nconfiguration. The command will only finish if the rollout completes successfully.</p>\n<p>A completed rollout indicates that all the <code>Pods</code> associated with the <code>Deployment</code> has been successfully started, and\nthat they all reach the <code>Ready</code> status. This indicates that the <code>Pods</code> can start serving traffic (if they are network\nservices), or can begin running workloads (if they are backend task workers).</p>\n<h4 id=\"monitoring-ingress-endpoints\">Monitoring Ingress endpoints</h4>\n<p>A successful rollout for a <code>Deployment</code> indicates the <code>Pods</code> are ready to accept traffic, but it does not mean that all\nthe endpoints have been allocated. The endpoint to access the service is managed by the <code>Ingress</code> resource. The\n<code>Ingress</code> resource is then materialized into ALBs by the ALB Ingress controller that is deployed on to your EKS cluster.\nUnfortunately, since the endpoint is backed by an actual Load Balancer in the cloud, it takes time for it to be\nprovisioned after the resource is created.</p>\n<p>You can use <code>kubergrunt</code> to monitor and wait for the <code>Ingress</code> endpoint to be provisioned, similar to the <code>Deployment</code>.\nIn order to monitor the <code>Ingress</code> endpoint, we need to know two things:</p>\n<ul>\n<li>The name of the <code>Ingress</code> resource. The <code>Ingress</code> resource is named by combining the <code>helm</code> release name and the\napplication name. Our module uses the application name for both, so in this case will be named\n<code>simple-web-app-simple-web-app</code>.</li>\n<li>The <code>Namespace</code> where the <code>Ingress</code> resource is deployed. For this example, we used the <code>applications</code> <code>Namespace</code> to\ndeploy our app.</li>\n</ul>\n<pre><span class=\"hljs-attribute\">INGRESS_NAME</span>=simple-web-app-simple-web-app\n<span class=\"hljs-attribute\">INGRESS_NAMESPACE</span>=applications\nkubergrunt k8s wait-for-ingress \\\n --namespace <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$INGRESS_NAMESPACE</span>\"</span> \\\n --ingress-name <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$INGRESS_NAME</span>\"</span>\n</pre>\n<p>This command will continuously monitor the <code>Ingress</code> resource until the ALB is provisioned and the endpoint is updated\non the resource. Note that this command will time out after 5 minutes. You can configure the timeout settings using the\n<code>--max-retries</code> and <code>--sleep-between-retries</code> CLI args.</p>\n<p>If the command successfully completes, then the <code>Ingress</code> endpoint is provisioned and attached to the resource. You can\nquery the endpoint by looking up the <code>Ingress</code> resource:</p>\n<pre><span class=\"hljs-attribute\">kubectl</span> describe ingress <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$INGRESS_NAME</span>\"</span> -n <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$INGRESS_NAMESPACE</span>\"</span>\n</pre>\n<p>This will list out the endpoints and attached host rules of the <code>Ingress</code> resource. If you used a path based <code>Ingress</code>\nconfiguration without hosts, you should be able to hit the endpoint directly to access the service.</p>\n<p>For host based <code>Ingress</code> configuration, the Route 53 DNS records need to be updated to point to the <code>Ingress</code> endpoint,\nso that the routing works. The EKS cluster in the reference architecture is deployed with the <code>external-dns</code>\napplication, which will automatically update the records. In this setup, you should be able to hit the hostname to\naccess the service without having to do anything else.</p>\n<h5 id=\"searching-for-the-ingress-resource\">Searching for the Ingress Resource</h5>\n<p>If you happen to not know the name or <code>Namespace</code> of the <code>Ingress</code> resource, you can look it up using <code>kubectl</code>. There\nare multiple approaches to filter down the resources. For example, you can start by listing out all <code>Ingress</code> resources\nin the cluster:</p>\n<pre>kubectl <span class=\"hljs-keyword\">get</span> ingresses <span class=\"hljs-comment\">--all-namespaces</span>\n</pre>\n<p>Then, narrow down your search by using the list of names and <code>Namespaces</code> as a clue. You can get more information about\na particular <code>Ingress</code> resource given its name and <code>Namespace</code>:</p>\n<pre><span class=\"hljs-attribute\">kubectl</span> describe ingress <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$INGRESS_NAME</span>\"</span> -n <span class=\"hljs-string\">\"<span class=\"hljs-variable\">$INGRESS_NAMESPACE</span>\"</span>\n</pre>\n<p>You can also use labels to search for the <code>Ingress</code> resource. For example, if you know the application name that you\ndeployed, you can search for all <code>Ingress</code> resources that are labeled with that application name:</p>\n<pre>kubectl <span class=\"hljs-keyword\">get</span> ingresses \\\n -l <span class=\"hljs-string\">\"app.kubernetes.io/name=simple-web-app\"</span> \\\n <span class=\"hljs-comment\">--all-namespaces</span>\n</pre>\n<h2 class=\"preview__body--subtitle\" id=\"debugging-errors\">Debugging errors</h2>\n<p>Sometimes, things don't go as planned. And when that happens, it's always beneficial to know how to locate the\nsource of the problem. There are two places you can look for information about a failed Pod.</p>\n<h3 class=\"preview__body--subtitle\" id=\"using-kubectl\">Using kubectl</h3>\n<p>By now you should be familiar with the <code>kubectl</code> CLI, and how powerful it is. You can use <code>kubectl</code> to investigate\nproblems with your <code>Pods</code>.</p>\n<p>The first step is to obtain the metadata and status of the <code>Pods</code>. To lookup information about a <code>Pod</code>, retrieve them\nusing <code>kubectl</code>:</p>\n<pre>kubectl <span class=\"hljs-keyword\">get</span> pods \\\n -l <span class=\"hljs-string\">\"app.kubernetes.io/name=simple-web-app,app.kubernetes.io/instance=simple-web-app\"</span> \\\n <span class=\"hljs-comment\">--all-namespaces</span>\n</pre>\n<p>This will list out all the associated <code>Pods</code> with the deployment you just made. Note that this will show you a minimal\nset of information about the <code>Pod</code>. However, this is a useful way to quickly scan the scope of the damage:</p>\n<ul>\n<li>How many <code>Pods</code> are available? Are all of them failing or just a small few?</li>\n<li>Are the <code>Pods</code> in a crash loop? Have they booted up successfully?</li>\n<li>Are the <code>Pods</code> passing health checks?</li>\n</ul>\n<p>Once you can locate your failing <code>Pods</code>, you can dig deeper by using <code>describe pod</code> to get more information about a\nsingle <code>Pod</code>. To do this, you will first need to obtain the <code>Namespace</code> and name for the <code>Pod</code>. This information should\nbe available in the previous command. Using that information, you can run:</p>\n<pre><span class=\"hljs-attribute\">kubectl</span> describe pod <span class=\"hljs-variable\">$POD_NAME</span> -n <span class=\"hljs-variable\">$POD_NAMESPACE</span>\n</pre>\n<p>to output the detailed information. This includes the event logs, which indicate additional information about any\nfailures that has happened to the <code>Pod</code>.</p>\n<p>Most cluster level issues (e.g if there is not enough capacity to schedule the <code>Pod</code>) can be triaged with this\ninformation. However, if there are issues booting up the <code>Pod</code> or if the problems lie in your application code, you will\nneed to dig into the logs.</p>\n<h3 class=\"preview__body--subtitle\" id=\"cloud-watch-logs\">CloudWatch Logs</h3>\n<p>By default, all the container logs from a <code>Pod</code> (<code>stdout</code> and <code>stderr</code>) are sent to CloudWatch Logs. This is ideal for\ndebugging situations where the container starts successfully but the service doesn't work as expected. Let's assume our\n<code>simple-web-app</code> containers started successfully (which they did!) but for some reason our requests to those containers\nare timing out or returning wrong content.</p>\n<ol>\n<li>\n<p>Go to the "Logs" section of the <a href=\"https://console.aws.amazon.com/cloudwatch/\" class=\"preview__body--description--blue\" target=\"_blank\">Cloudwatch Management Console</a> and look for the name of the EKS cluster in the table.</p>\n</li>\n<li>\n<p>Clicking it should take you to a new page that displays a list of entries. Each of these correspond to a <code>Pod</code> in the\ncluster, and contain the <code>Pod</code> name. Look for the one that corresponds to the failing <code>Pod</code> and click it.</p>\n</li>\n<li>\n<p>You should be presented with a real-time log stream of the container. If your app logs to STDOUT, its logs will show\nup here. You can export the logs and analyze it in your preferred tool or use <a href=\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html\" class=\"preview__body--description--blue\" target=\"_blank\">CloudWatch Log\nInsights</a> to query the logs directly\nin the AWS web console.</p>\n</li>\n</ol>\n<h2 class=\"preview__body--subtitle\" id=\"next-steps\">Next steps</h2>\n<p>Next up, you'll learn how to <a href=\"/repos/v0.0.1-20210527/infrastructure-live-multi-account-acme/_docs/12-migration.md\" class=\"preview__body--description--blue\">migrate your apps to the Reference Architecture</a>.</p>\n","repoName":"infrastructure-live-multi-account-acme","repoRef":"v0.0.1-20210527","serviceDescriptor":{"serviceName":"Multi-account Reference Architecture","serviceRepoName":"infrastructure-live-multi-account-acme","serviceRepoOrg":"gruntwork-io","cloudProviders":["aws"],"description":"End-to-end tech stack designed to deploy into multiple AWS accounts. Includes VPCs, EKS, ALBs, CI / CD, monitoring, alerting, VPN, DNS, and more.","imageUrl":"grunt.png","licenseType":"subscriber","technologies":["Terraform","Go","Bash","Python"],"compliance":[],"tags":[""]},"serviceCategoryName":"Reference Architecture","fileName":"11-deploying-a-docker-service.md","filePath":"/_docs/11-deploying-a-docker-service.md","title":"Repo Browser: Multi-account Reference Architecture","description":"Browse the repos in the Gruntwork Infrastructure as Code Library."}