Repository: getmoto/moto
Pull request #9066 (2025-07-16 15:30:43)

Reduce size of the Docker image
This takes a few steps to reduce the size of the generated Docker image, making it faster to load for developers and CI machines.

The arm64 image was 792 MB before I started this work and the result is a 523 MB image, so a reduction of 269 MB.

I have broken the steps taken into individual commits to make it easier to review. Each commit message mentions the size reduction the change gives.

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/getmoto/moto/pull/9066?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 92.88%. Comparing base [(`a9ecdd1`)](https://app.codecov.io/gh/getmoto/moto/commit/a9ecdd1f7646f4efc21226f9b48e36a601210247?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto) to head [(`23d94d9`)](https://app.codecov.io/gh/getmoto/moto/commit/23d94d9d29f07f4e08aa377b503595210ba6132b?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##           master    #9066      +/-   ##
==========================================
- Coverage   92.88%   92.88%   -0.01%     
==========================================
  Files        1287     1287              
  Lines      113742   113742              
==========================================
- Hits       105645   105644       -1     
- Misses       8097     8098       +1     
```

| [Flag](https://app.codecov.io/gh/getmoto/moto/pull/9066/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto) | Coverage Δ | |
|---|---|---|
| [servertests](https://app.codecov.io/gh/getmoto/moto/pull/9066/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto) | `28.59% <ø> (ø)` | |
| [unittests](https://app.codecov.io/gh/getmoto/moto/pull/9066/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto) | `92.85% <ø> (-0.01%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/getmoto/moto/pull/9066?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=getmoto).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>

Patch:
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..92b58ab2d
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,7 @@
+# Ignore everything by default
+*
+
+!README.md
+!moto/
+!setup.cfg
+!setup.py
diff --git a/Dockerfile b/Dockerfile
index 6b545ef72..d0d3feb50 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,16 +1,14 @@
-FROM python:3.11-slim
+FROM python:3.13-alpine
 
 ADD . /moto/
 ENV PYTHONUNBUFFERED 1
 
 WORKDIR /moto/
 RUN  pip3 --no-cache-dir install --upgrade pip setuptools && \
-     pip3 --no-cache-dir install ".[server]"
+     pip3 --no-cache-dir install --editable ".[server]"
 
 # Install cURL
-RUN  apt-get update && \
-     apt-get install -y curl && \
-     rm -rf /var/lib/apt/lists/*
+RUN  apk add --no-cache curl
 
 ENTRYPOINT ["/usr/local/bin/moto_server", "-H", "0.0.0.0"]
 
diff --git a/moto/elasticbeanstalk/exceptions.py b/moto/elasticbeanstalk/exceptions.py
index e3a8c2d78..f1cff2987 100644
--- a/moto/elasticbeanstalk/exceptions.py
+++ b/moto/elasticbeanstalk/exceptions.py
@@ -1,43 +1,13 @@
-from typing import Any
+from moto.core.exceptions import ServiceException
 
-from moto.core.exceptions import RESTError
 
-EXCEPTION_RESPONSE = """<?xml version="1.0"?>
-<ErrorResponse xmlns="http://elasticache.amazonaws.com/doc/2015-02-02/">
-  <Error>
-    <Type>Sender</Type>
-    <Code>{{ error_type }}</Code>
-    <Message>{{ message }}</Message>
-  </Error>
-  <{{ request_id_tag }}>30c0dedb-92b1-4e2b-9be4-1188e3ed86ab</{{ request_id_tag }}>
-</ErrorResponse>"""
+class ElasticBeanstalkException(ServiceException):
+    pass
 
 
-class ElasticBeanstalkException(RESTError):
-    code = 400
-    extended_templates = {"ecerror": EXCEPTION_RESPONSE}
-    env = RESTError.extended_environment(extended_templates)
+class InvalidParameterValueError(ServiceException):
+    code = "InvalidParameterValue"
 
-    def __init__(self, code: str, message: str, **kwargs: Any):
-        kwargs.setdefault("template", "ecerror")
-        super().__init__(code, message)
 
-
-class InvalidParameterValueError(RESTError):
-    def __init__(self, message: str):
-        super().__init__("InvalidParameterValue", message)
-
-
-class ResourceNotFoundException(RESTError):
-    def __init__(self, message: str):
-        super().__init__("ResourceNotFoundException", message)
-
-
-class ApplicationNotFound(ElasticBeanstalkException):
-    code = 404
-
-    def __init__(self, application_name: str):
-        super().__init__(
-            "ApplicationNotFound",
-            message=f"Elastic Beanstalk application {application_name} not found.",
-        )
+class ResourceNotFoundException(ServiceException):
+    code = "ResourceNotFoundException"
diff --git a/moto/elasticbeanstalk/models.py b/moto/elasticbeanstalk/models.py
index 13fcb2cde..74aa13b8f 100644
--- a/moto/elasticbeanstalk/models.py
+++ b/moto/elasticbeanstalk/models.py
@@ -5,17 +5,16 @@ from moto.core.base_backend import BackendDict, BaseBackend
 from moto.core.common_models import BaseModel
 
 from .exceptions import (
-    ApplicationNotFound,
     InvalidParameterValueError,
     ResourceNotFoundException,
 )
 from .utils import make_arn
 
 
-class FakeEnvironment(BaseModel):
+class Environment(BaseModel):
     def __init__(
         self,
-        application: "FakeApplication",
+        application: "Application",
         environment_name: str,
         solution_stack_name: str,
         tags: Dict[str, str],
@@ -47,7 +46,7 @@ class FakeEnvironment(BaseModel):
         return self.application.region
 
 
-class FakeApplication(BaseModel):
+class Application(BaseModel):
     def __init__(
         self,
         backend: "EBBackend",
@@ -55,7 +54,7 @@ class FakeApplication(BaseModel):
     ):
         self.backend = weakref.proxy(backend)  # weakref to break cycles
         self.application_name = application_name
-        self.environments: Dict[str, FakeEnvironment] = dict()
+        self.environments: Dict[str, Environment] = dict()
         self.account_id = self.backend.account_id
         self.region = self.backend.region_name
         self.arn = make_arn(
@@ -64,11 +63,11 @@ class FakeApplication(BaseModel):
 
     def create_environment(
         self, environment_name: str, solution_stack_name: str, tags: Dict[str, str]
-    ) -> FakeEnvironment:
+    ) -> Environment:
         if environment_name in self.environments:
             raise InvalidParameterValueError(message="")
 
-        env = FakeEnvironment(
+        env = Environment(
             application=self,
             environment_name=environment_name,
             solution_stack_name=solution_stack_name,
@@ -82,29 +81,29 @@ class FakeApplication(BaseModel):
 class EBBackend(BaseBackend):
     def __init__(self, region_name: str, account_id: str):
         super().__init__(region_name, account_id)
-        self.applications: Dict[str, FakeApplication] = dict()
+        self.applications: Dict[str, Application] = dict()
 
-    def create_application(self, application_name: str) -> FakeApplication:
+    def create_application(self, application_name: str) -> Application:
         if application_name in self.applications:
             raise InvalidParameterValueError(
                 f"Application {application_name} already exists."
             )
-        new_app = FakeApplication(backend=self, application_name=application_name)
+        new_app = Application(backend=self, application_name=application_name)
         self.applications[application_name] = new_app
         return new_app
 
     def create_environment(
         self,
-        app: FakeApplication,
+        app: Application,
         environment_name: str,
         stack_name: str,
         tags: Dict[str, str],
-    ) -> FakeEnvironment:
+    ) -> Environment:
         return app.create_environment(
             environment_name=environment_name, solution_stack_name=stack_name, tags=tags
         )
 
-    def describe_environments(self) -> List[FakeEnvironment]:
+    def describe_environments(self) -> List[Environment]:
         envs = []
         for app in self.applications.values():
             for env in app.environments.values():
@@ -140,7 +139,7 @@ class EBBackend(BaseBackend):
             )
         return res.tags
 
-    def _find_environment_by_arn(self, arn: str) -> FakeEnvironment:
+    def _find_environment_by_arn(self, arn: str) -> Environment:
         for app in self.applications.keys():
             for env in self.applications[app].environments.values():
                 if env.environment_arn == arn:
@@ -151,11 +150,8 @@ class EBBackend(BaseBackend):
         self,
         application_name: str,
     ) -> None:
-        if application_name:
-            if application_name in self.applications:
-                self.applications.pop(application_name)
-            else:
-                raise ApplicationNotFound(application_name)
+        if application_name in self.applications:
+            self.applications.pop(application_name)
 
 
 eb_backends = BackendDict(EBBackend, "elasticbeanstalk")
diff --git a/moto/elasticbeanstalk/responses.py b/moto/elasticbeanstalk/responses.py
index 422f14b02..28b02c948 100644
--- a/moto/elasticbeanstalk/responses.py
+++ b/moto/elasticbeanstalk/responses.py
@@ -1,9 +1,229 @@
-from moto.core.responses import BaseResponse
+from moto.core.responses import ActionResult, BaseResponse, EmptyResult
 from moto.core.utils import tags_from_query_string
 
 from .exceptions import InvalidParameterValueError
 from .models import EBBackend, eb_backends
 
+# AWS Solution Stack Details as of 2025-07-13
+SOLUTION_STACK_DETAILS = [
+    {
+        "SolutionStackName": "64bit Windows Server 2019 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server Core 2019 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server 2025 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server Core 2016 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server Core 2025 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server 2022 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server 2016 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Windows Server Core 2022 v2.19.2 running IIS 10.0",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2017.03 v2.5.4 running Java 8",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v5.7.0 running Tomcat 9 Corretto 17",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v5.7.0 running Tomcat 11 Corretto 17",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v5.7.0 running Tomcat 10 Corretto 21",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v5.7.0 running Tomcat 11 Corretto 21",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v5.7.0 running Tomcat 10 Corretto 17",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v5.7.0 running Tomcat 9 Corretto 11",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Python 3.11",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.7.0 running PHP 8.2",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.7.0 running PHP 8.4",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Python 3.9",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Python 3.12",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Ruby 3.3",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Ruby 3.4",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Python 3.13",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.7.0 running PHP 8.3",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Ruby 3.2",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v6.6.0 running Node.js 22",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.7.0 running PHP 8.1",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v6.6.0 running Node.js 20",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Corretto 17",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v3.5.0 running .NET 9",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v6.6.0 running Node.js 18",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Corretto 8",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v3.5.0 running .NET 8",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Corretto 11",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Docker",
+        "PermittedFileTypes": [],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.2.0 running ECS",
+        "PermittedFileTypes": [],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.4.0 running Go 1",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2023 v4.6.0 running Corretto 21",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v4.9.0 running Tomcat 9 Corretto 11",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v2.11.0 running .NET Core",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.9.0 running Corretto 11",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.9.0 running Corretto 8",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.13.0 running Go 1",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v5.11.0 running Node.js 18",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.5.0 running ECS",
+        "PermittedFileTypes": [],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.9.0 running Corretto 17",
+        "PermittedFileTypes": ["jar", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.10.0 running PHP 8.1",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v4.9.0 running Tomcat 9 Corretto 8",
+        "PermittedFileTypes": ["war", "zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v4.2.0 running Docker",
+        "PermittedFileTypes": [],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v3.3.14 running Python 3.8",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v5.0.2 running Node.js 12",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v5.0.2 running Node.js 10",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2 v0.1.0 running Node.js 12 (BETA)",
+        "PermittedFileTypes": ["zip"],
+    },
+    {
+        "SolutionStackName": "64bit Amazon Linux 2018.03 v2.6.33 running Packer 1.0.3",
+        "PermittedFileTypes": [],
+    },
+]
+
 
 class EBResponse(BaseResponse):
     def __init__(self) -> None:
@@ -16,23 +236,20 @@ class EBResponse(BaseResponse):
         """
         return eb_backends[self.current_account][self.region]
 
-    def create_application(self) -> str:
+    def create_application(self) -> ActionResult:
         app = self.elasticbeanstalk_backend.create_application(
             application_name=self._get_param("ApplicationName")
         )
 
-        template = self.response_template(EB_CREATE_APPLICATION)
-        return template.render(
-            region_name=self.elasticbeanstalk_backend.region_name, application=app
-        )
+        result = {"Application": app}
+        return ActionResult(result)
 
-    def describe_applications(self) -> str:
-        template = self.response_template(EB_DESCRIBE_APPLICATIONS)
-        return template.render(
-            applications=self.elasticbeanstalk_backend.applications.values()
-        )
+    def describe_applications(self) -> ActionResult:
+        applications = self.elasticbeanstalk_backend.applications.values()
+        result = {"Applications": applications}
+        return ActionResult(result)
 
-    def create_environment(self) -> str:
+    def create_environment(self) -> ActionResult:
         application_name = self._get_param("ApplicationName")
         try:
             app = self.elasticbeanstalk_backend.applications[application_name]
@@ -49,21 +266,25 @@ class EBResponse(BaseResponse):
             tags=tags,
         )
 
-        template = self.response_template(EB_CREATE_ENVIRONMENT)
-        return template.render(
-            environment=env, region=self.elasticbeanstalk_backend.region_name
-        )
+        result = env
+        return ActionResult(result)
 
-    def describe_environments(self) -> str:
+    def describe_environments(self) -> ActionResult:
         envs = self.elasticbeanstalk_backend.describe_environments()
 
-        template = self.response_template(EB_DESCRIBE_ENVIRONMENTS)
-        return template.render(environments=envs)
+        result = {"Environments": envs}
+        return ActionResult(result)
 
-    def list_available_solution_stacks(self) -> str:
-        return EB_LIST_AVAILABLE_SOLUTION_STACKS
+    def list_available_solution_stacks(self) -> ActionResult:
+        solution_stacks = {
+            "SolutionStacks": [
+                stack["SolutionStackName"] for stack in SOLUTION_STACK_DETAILS
+            ],
+            "SolutionStackDetails": SOLUTION_STACK_DETAILS,
+        }
+        return ActionResult(solution_stacks)
 
-    def update_tags_for_resource(self) -> str:
+    def update_tags_for_resource(self) -> ActionResult:
         resource_arn = self._get_param("ResourceArn")
         tags_to_add = tags_from_query_string(
             self.querystring, prefix="TagsToAdd.member"
@@ -72,1336 +293,20 @@ class EBResponse(BaseResponse):
         self.elasticbeanstalk_backend.update_tags_for_resource(
             resource_arn, tags_to_add, tags_to_remove
         )
+        return EmptyResult()
 
-        return EB_UPDATE_TAGS_FOR_RESOURCE
-
-    def list_tags_for_resource(self) -> str:
+    def list_tags_for_resource(self) -> ActionResult:
         resource_arn = self._get_param("ResourceArn")
         tags = self.elasticbeanstalk_backend.list_tags_for_resource(resource_arn)
+        result = {
+            "ResourceArn": resource_arn,
+            "ResourceTags": [{"Key": k, "Value": v} for k, v in tags.items()],
+        }
+        return ActionResult(result)
 
-        template = self.response_template(EB_LIST_TAGS_FOR_RESOURCE)
-        return template.render(tags=tags, arn=resource_arn)
-
-    def delete_application(self) -> str:
+    def delete_application(self) -> ActionResult:
         application_name = self._get_param("ApplicationName")
         self.elasticbeanstalk_backend.delete_application(
             application_name=application_name,
         )
-        return DELETE_APPLICATION_TEMPLATE
-
-
-EB_CREATE_APPLICATION = """
-<CreateApplicationResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <CreateApplicationResult>
-    <Application>
-      <ConfigurationTemplates/>
-      <DateCreated>2019-09-03T13:08:29.049Z</DateCreated>
-      <ResourceLifecycleConfig>
-        <VersionLifecycleConfig>
-          <MaxAgeRule>
-            <DeleteSourceFromS3>false</DeleteSourceFromS3>
-            <MaxAgeInDays>180</MaxAgeInDays>
-            <Enabled>false</Enabled>
-          </MaxAgeRule>
-          <MaxCountRule>
-            <DeleteSourceFromS3>false</DeleteSourceFromS3>
-            <MaxCount>200</MaxCount>
-            <Enabled>false</Enabled>
-          </MaxCountRule>
-        </VersionLifecycleConfig>
-      </ResourceLifecycleConfig>
-      <ApplicationArn>{{ application.arn }}</ApplicationArn>
-      <ApplicationName>{{ application.application_name }}</ApplicationName>
-      <DateUpdated>2019-09-03T13:08:29.049Z</DateUpdated>
-    </Application>
-  </CreateApplicationResult>
-  <ResponseMetadata>
-    <RequestId>1b6173c8-13aa-4b0a-99e9-eb36a1fb2778</RequestId>
-  </ResponseMetadata>
-</CreateApplicationResponse>
-"""
-
-EB_DESCRIBE_APPLICATIONS = """
-<DescribeApplicationsResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <DescribeApplicationsResult>
-    <Applications>
-      {% for application in applications %}
-      <member>
-        <ConfigurationTemplates/>
-        <DateCreated>2019-09-03T13:08:29.049Z</DateCreated>
-        <ResourceLifecycleConfig>
-          <VersionLifecycleConfig>
-            <MaxAgeRule>
-              <MaxAgeInDays>180</MaxAgeInDays>
-              <DeleteSourceFromS3>false</DeleteSourceFromS3>
-              <Enabled>false</Enabled>
-            </MaxAgeRule>
-            <MaxCountRule>
-              <DeleteSourceFromS3>false</DeleteSourceFromS3>
-              <MaxCount>200</MaxCount>
-              <Enabled>false</Enabled>
-            </MaxCountRule>
-          </VersionLifecycleConfig>
-        </ResourceLifecycleConfig>
-        <ApplicationArn>{{ application.arn }}</ApplicationArn>
-        <ApplicationName>{{ application.application_name }}</ApplicationName>
-        <DateUpdated>2019-09-03T13:08:29.049Z</DateUpdated>
-      </member>
-      {% endfor %}
-    </Applications>
-  </DescribeApplicationsResult>
-  <ResponseMetadata>
-    <RequestId>015a05eb-282e-4b76-bd18-663fdfaf42e4</RequestId>
-  </ResponseMetadata>
-</DescribeApplicationsResponse>
-"""
-
-DELETE_APPLICATION_TEMPLATE = """
-<DeleteApplicationResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <ResponseMetadata>
-    <RequestId>015a05eb-282e-4b76-bd18-663fdfaf42e4</RequestId>
-  </ResponseMetadata>
-</DeleteApplicationResponse>
-"""
-
-EB_CREATE_ENVIRONMENT = """
-<CreateEnvironmentResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <CreateEnvironmentResult>
-    <SolutionStackName>{{ environment.solution_stack_name }}</SolutionStackName>
-    <Health>Grey</Health>
-    <EnvironmentArn>{{ environment.environment_arn }}</EnvironmentArn>
-    <DateUpdated>2019-09-04T09:41:24.222Z</DateUpdated>
-    <DateCreated>2019-09-04T09:41:24.222Z</DateCreated>
-    <EnvironmentId>{{ environment_id }}</EnvironmentId>
-    <PlatformArn>{{ environment.platform_arn }}</PlatformArn>
-    <Tier>
-      <Name>WebServer</Name>
-      <Type>Standard</Type>
-      <Version>1.0</Version>
-    </Tier>
-    <EnvironmentName>{{ environment.environment_name }}</EnvironmentName>
-    <ApplicationName>{{ environment.application_name }}</ApplicationName>
-    <Status>Launching</Status>
-  </CreateEnvironmentResult>
-  <ResponseMetadata>
-    <RequestId>18dc8158-f5d7-4d5a-82ef-07fcaadf81c6</RequestId>
-  </ResponseMetadata>
-</CreateEnvironmentResponse>
-"""
-
-EB_DESCRIBE_ENVIRONMENTS = """
-<DescribeEnvironmentsResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <DescribeEnvironmentsResult>
-    <Environments>
-      {% for env in environments %}
-      <member>
-        <SolutionStackName>{{ env.solution_stack_name }}</SolutionStackName>
-        <Health>Grey</Health>
-        <EnvironmentArn>{{ env.environment_arn }}</EnvironmentArn>
-        <MinCapacityEnabled>false</MinCapacityEnabled>
-        <DateUpdated>2019-08-30T09:35:10.913Z</DateUpdated>
-        <AbortableOperationInProgress>false</AbortableOperationInProgress>
-        <Alerts/>
-        <DateCreated>2019-08-22T07:02:47.332Z</DateCreated>
-        <EnvironmentId>{{ env.environment_id }}</EnvironmentId>
-        <VersionLabel>1</VersionLabel>
-        <PlatformArn>{{ env.platform_arn }}</PlatformArn>
-        <Tier>
-          <Name>WebServer</Name>
-          <Type>Standard</Type>
-          <Version>1.0</Version>
-        </Tier>
-        <HealthStatus>No Data</HealthStatus>
-        <EnvironmentName>{{ env.environment_name }}</EnvironmentName>
-        <EndpointURL></EndpointURL>
-        <CNAME></CNAME>
-        <EnvironmentLinks/>
-        <ApplicationName>{{ env.application_name }}</ApplicationName>
-        <Status>Ready</Status>
-      </member>
-      {% endfor %}
-    </Environments>
-  </DescribeEnvironmentsResult>
-  <ResponseMetadata>
-    <RequestId>dd56b215-01a0-40b2-bd1e-57589c39424f</RequestId>
-  </ResponseMetadata>
-</DescribeEnvironmentsResponse>
-"""
-
-# Current list as of 2019-09-04
-EB_LIST_AVAILABLE_SOLUTION_STACKS = """
-<ListAvailableSolutionStacksResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <ListAvailableSolutionStacksResult>
-    <SolutionStacks>
-      <member>64bit Amazon Linux 2018.03 v4.10.1 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v4.9.2 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v4.8.0 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v4.6.0 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v4.5.3 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v4.5.1 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v4.5.0 running Node.js</member>
-      <member>64bit Amazon Linux 2017.09 v4.4.6 running Node.js</member>
-      <member>64bit Amazon Linux 2017.09 v4.4.5 running Node.js</member>
-      <member>64bit Amazon Linux 2017.09 v4.4.4 running Node.js</member>
-      <member>64bit Amazon Linux 2017.09 v4.4.2 running Node.js</member>
-      <member>64bit Amazon Linux 2017.09 v4.4.0 running Node.js</member>
-      <member>64bit Amazon Linux 2017.03 v4.3.0 running Node.js</member>
-      <member>64bit Amazon Linux 2017.03 v4.2.2 running Node.js</member>
-      <member>64bit Amazon Linux 2017.03 v4.2.1 running Node.js</member>
-      <member>64bit Amazon Linux 2017.03 v4.2.0 running Node.js</member>
-      <member>64bit Amazon Linux 2017.03 v4.1.1 running Node.js</member>
-      <member>64bit Amazon Linux 2017.03 v4.1.0 running Node.js</member>
-      <member>64bit Amazon Linux 2016.09 v4.0.1 running Node.js</member>
-      <member>64bit Amazon Linux 2016.09 v4.0.0 running Node.js</member>
-      <member>64bit Amazon Linux 2016.09 v3.3.1 running Node.js</member>
-      <member>64bit Amazon Linux 2016.09 v3.1.0 running Node.js</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.14 running PHP 5.4</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.14 running PHP 5.5</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.14 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.14 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.14 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.14 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.12 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.7 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.6 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.6 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.5 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.4 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.3 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.2 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.1 running PHP 7.2</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.0 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.1 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.1 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.1 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.0 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.0 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.6 running PHP 5.4</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.6 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.6 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.5 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running PHP 5.4</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running PHP 5.5</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.3 running PHP 5.4</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.3 running PHP 5.5</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.3 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.3 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.3 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.2 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.2 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.1 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.0 running PHP 5.4</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.0 running PHP 5.5</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.0 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.0 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.0 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2017.03 v2.5.0 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.03 v2.5.0 running PHP 7.1</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.4 running PHP 5.5</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.4 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.4 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.3 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.2 running PHP 5.4</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.2 running PHP 5.5</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.2 running PHP 5.6</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.2 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.1 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.0 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2016.09 v2.3.2 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2016.09 v2.3.1 running PHP 7.0</member>
-      <member>64bit Amazon Linux 2018.03 v2.9.1 running Python 3.6</member>
-      <member>64bit Amazon Linux 2018.03 v2.9.1 running Python 3.4</member>
-      <member>64bit Amazon Linux 2018.03 v2.9.1 running Python</member>
-      <member>64bit Amazon Linux 2018.03 v2.9.1 running Python 2.7</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.5 running Python 3.6</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.1 running Python 3.6</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.0 running Python 3.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running Python 3.6</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.1 running Python 3.6</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.0 running Python 3.4</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.6 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.5 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.4 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.3 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.2 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.1 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.0 (Puma)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.6 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.5 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.4 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.3 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.2 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.1 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.0 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 1.9.3</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.0 running Ruby 2.5 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.4 running Ruby 2.3 (Puma)</member>
-      <member>64bit Amazon Linux 2017.03 v2.4.4 running Ruby 2.3 (Passenger Standalone)</member>
-      <member>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 8.5 Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 8 Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 7 Java 7</member>
-      <member>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 7 Java 6</member>
-      <member>64bit Amazon Linux 2018.03 v3.1.1 running Tomcat 8.5 Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.6.5 running Tomcat 8 Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.6.2 running Tomcat 8 Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.6.1 running Tomcat 8 Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.6.0 running Tomcat 8 Java 8</member>
-      <member>64bit Amazon Linux 2016.09 v2.5.4 running Tomcat 8 Java 8</member>
-      <member>64bit Amazon Linux 2016.03 v2.1.0 running Tomcat 8 Java 8</member>
-      <member>64bit Windows Server Core 2016 v2.2.1 running IIS 10.0</member>
-      <member>64bit Windows Server 2016 v2.2.1 running IIS 10.0</member>
-      <member>64bit Windows Server Core 2012 R2 v2.2.1 running IIS 8.5</member>
-      <member>64bit Windows Server 2012 R2 v2.2.1 running IIS 8.5</member>
-      <member>64bit Windows Server Core 2016 v1.2.0 running IIS 10.0</member>
-      <member>64bit Windows Server 2016 v1.2.0 running IIS 10.0</member>
-      <member>64bit Windows Server Core 2012 R2 v1.2.0 running IIS 8.5</member>
-      <member>64bit Windows Server 2012 R2 v1.2.0 running IIS 8.5</member>
-      <member>64bit Windows Server 2012 v1.2.0 running IIS 8</member>
-      <member>64bit Windows Server 2008 R2 v1.2.0 running IIS 7.5</member>
-      <member>64bit Windows Server Core 2012 R2 running IIS 8.5</member>
-      <member>64bit Windows Server 2012 R2 running IIS 8.5</member>
-      <member>64bit Windows Server 2012 running IIS 8</member>
-      <member>64bit Windows Server 2008 R2 running IIS 7.5</member>
-      <member>64bit Amazon Linux 2018.03 v2.12.16 running Docker 18.06.1-ce</member>
-      <member>64bit Amazon Linux 2016.09 v2.5.2 running Docker 1.12.6</member>
-      <member>64bit Amazon Linux 2018.03 v2.15.2 running Multi-container Docker 18.06.1-ce (Generic)</member>
-      <member>64bit Debian jessie v2.12.16 running Go 1.4 (Preconfigured - Docker)</member>
-      <member>64bit Debian jessie v2.12.16 running Go 1.3 (Preconfigured - Docker)</member>
-      <member>64bit Debian jessie v2.12.16 running Python 3.4 (Preconfigured - Docker)</member>
-      <member>64bit Debian jessie v2.10.0 running Python 3.4 (Preconfigured - Docker)</member>
-      <member>64bit Amazon Linux 2018.03 v2.9.1 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.9.1 running Java 7</member>
-      <member>64bit Amazon Linux 2018.03 v2.8.0 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.6 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.5 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.4 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.2 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.7.1 running Java 8</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.8 running Java 8</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.5 running Java 8</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.4 running Java 8</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.3 running Java 8</member>
-      <member>64bit Amazon Linux 2017.09 v2.6.0 running Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.5.4 running Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.5.3 running Java 8</member>
-      <member>64bit Amazon Linux 2017.03 v2.5.2 running Java 8</member>
-      <member>64bit Amazon Linux 2016.09 v2.4.4 running Java 8</member>
-      <member>64bit Amazon Linux 2018.03 v2.12.1 running Go 1.12.7</member>
-      <member>64bit Amazon Linux 2018.03 v2.6.14 running Packer 1.0.3</member>
-      <member>64bit Amazon Linux 2018.03 v2.12.16 running GlassFish 5.0 Java 8 (Preconfigured - Docker)</member>
-    </SolutionStacks>
-    <SolutionStackDetails>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.10.1 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.9.2 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.8.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.6.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.5.3 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.5.1 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v4.5.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v4.4.6 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v4.4.5 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v4.4.4 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v4.4.2 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v4.4.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v4.3.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v4.2.2 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v4.2.1 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v4.2.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v4.1.1 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v4.1.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v4.0.1 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v4.0.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v3.3.1 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v3.1.0 running Node.js</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.14 running PHP 5.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.14 running PHP 5.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.14 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.14 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.14 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.14 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.12 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.7 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.6 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.6 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.5 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.4 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.3 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.2 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.1 running PHP 7.2</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.0 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.1 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.1 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.1 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.0 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.0 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.6 running PHP 5.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.6 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.6 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.5 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running PHP 5.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running PHP 5.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.3 running PHP 5.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.3 running PHP 5.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.3 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.3 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.3 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.2 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.2 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.1 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.0 running PHP 5.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.0 running PHP 5.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.0 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.0 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.0 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.5.0 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.5.0 running PHP 7.1</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.4 running PHP 5.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.4 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.4 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.3 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.2 running PHP 5.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.2 running PHP 5.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.2 running PHP 5.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.2 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.1 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.0 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v2.3.2 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v2.3.1 running PHP 7.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.9.1 running Python 3.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.9.1 running Python 3.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.9.1 running Python</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.9.1 running Python 2.7</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.5 running Python 3.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.1 running Python 3.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.0 running Python 3.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running Python 3.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.1 running Python 3.6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.0 running Python 3.4</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.6 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.5 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.4 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.3 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.2 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.1 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.0 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.6 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.5 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.4 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.3 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.2 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.1 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 2.0 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.10.1 running Ruby 1.9.3</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.0 running Ruby 2.5 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.4 running Ruby 2.3 (Puma)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.4.4 running Ruby 2.3 (Passenger Standalone)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 8.5 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 7 Java 7</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v3.2.1 running Tomcat 7 Java 6</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v3.1.1 running Tomcat 8.5 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.6.5 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.6.2 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.6.1 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.6.0 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v2.5.4 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.03 v2.1.0 running Tomcat 8 Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>war</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server Core 2016 v2.2.1 running IIS 10.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2016 v2.2.1 running IIS 10.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server Core 2012 R2 v2.2.1 running IIS 8.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2012 R2 v2.2.1 running IIS 8.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server Core 2016 v1.2.0 running IIS 10.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2016 v1.2.0 running IIS 10.0</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server Core 2012 R2 v1.2.0 running IIS 8.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2012 R2 v1.2.0 running IIS 8.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2012 v1.2.0 running IIS 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2008 R2 v1.2.0 running IIS 7.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server Core 2012 R2 running IIS 8.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2012 R2 running IIS 8.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2012 running IIS 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Windows Server 2008 R2 running IIS 7.5</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.12.16 running Docker 18.06.1-ce</SolutionStackName>
-        <PermittedFileTypes/>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v2.5.2 running Docker 1.12.6</SolutionStackName>
-        <PermittedFileTypes/>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.15.2 running Multi-container Docker 18.06.1-ce (Generic)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-          <member>json</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Debian jessie v2.12.16 running Go 1.4 (Preconfigured - Docker)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Debian jessie v2.12.16 running Go 1.3 (Preconfigured - Docker)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Debian jessie v2.12.16 running Python 3.4 (Preconfigured - Docker)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Debian jessie v2.10.0 running Python 3.4 (Preconfigured - Docker)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.9.1 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.9.1 running Java 7</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.8.0 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.6 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.5 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.4 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.2 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.7.1 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.8 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.5 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.4 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.3 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.09 v2.6.0 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.5.4 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.5.3 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2017.03 v2.5.2 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2016.09 v2.4.4 running Java 8</SolutionStackName>
-        <PermittedFileTypes>
-          <member>jar</member>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.12.1 running Go 1.12.7</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.6.14 running Packer 1.0.3</SolutionStackName>
-        <PermittedFileTypes/>
-      </member>
-      <member>
-        <SolutionStackName>64bit Amazon Linux 2018.03 v2.12.16 running GlassFish 5.0 Java 8 (Preconfigured - Docker)</SolutionStackName>
-        <PermittedFileTypes>
-          <member>zip</member>
-        </PermittedFileTypes>
-      </member>
-    </SolutionStackDetails>
-  </ListAvailableSolutionStacksResult>
-  <ResponseMetadata>
-    <RequestId>bd6bd2b2-9983-4845-b53b-fe53e8a5e1e7</RequestId>
-  </ResponseMetadata>
-</ListAvailableSolutionStacksResponse>
-"""
-
-EB_UPDATE_TAGS_FOR_RESOURCE = """
-<UpdateTagsForResourceResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <ResponseMetadata>
-    <RequestId>f355d788-e67e-440f-b915-99e35254ffee</RequestId>
-  </ResponseMetadata>
-</UpdateTagsForResourceResponse>
-"""
-
-EB_LIST_TAGS_FOR_RESOURCE = """
-<ListTagsForResourceResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-  <ListTagsForResourceResult>
-    <ResourceTags>
-      {% for key, value in tags.items() %}
-      <member>
-        <Key>{{ key }}</Key>
-        <Value>{{ value }}</Value>
-      </member>
-      {% endfor %}
-    </ResourceTags>
-    <ResourceArn>{{ arn }}</ResourceArn>
-  </ListTagsForResourceResult>
-  <ResponseMetadata>
-    <RequestId>178e410f-3b57-456f-a64c-a3b6a16da9ab</RequestId>
-  </ResponseMetadata>
-</ListTagsForResourceResponse>
-"""
+        return EmptyResult()
diff --git a/moto/rds/exceptions.py b/moto/rds/exceptions.py
index fc27a352e..c946abfdd 100644
--- a/moto/rds/exceptions.py
+++ b/moto/rds/exceptions.py
@@ -37,6 +37,14 @@ class DBSecurityGroupNotFoundError(RDSClientError):
         )
 
 
+class DBShardGroupAlreadyExistsError(RDSClientError):
+    def __init__(self, shard_group_identifier: str):
+        super().__init__(
+            "DBShardGroupAlreadyExistsFault",
+            f"DB Shard Group {shard_group_identifier} already exists.",
+        )
+
+
 class DBSubnetGroupNotFoundError(RDSClientError):
     def __init__(self, subnet_group_name: str):
         super().__init__(
@@ -149,6 +157,14 @@ class DBSnapshotAlreadyExistsError(RDSClientError):
         )
 
 
+class DBShardGroupNotFoundFault(RDSClientError):
+    def __init__(self, db_shard_group_identifier: str):
+        super().__init__(
+            "DBShardGroupNotFoundFault",
+            f"DBShardGroup {db_shard_group_identifier} not found.",
+        )
+
+
 class InvalidParameterValue(RDSClientError):
     def __init__(self, message: str):
         super().__init__("InvalidParameterValue", message)
diff --git a/moto/rds/models.py b/moto/rds/models.py
index 2f43f8ff2..f19612423 100644
--- a/moto/rds/models.py
+++ b/moto/rds/models.py
@@ -53,6 +53,8 @@ from .exceptions import (
     DBProxyNotFoundFault,
     DBProxyQuotaExceededFault,
     DBSecurityGroupNotFoundError,
+    DBShardGroupAlreadyExistsError,
+    DBShardGroupNotFoundFault,
     DBSnapshotAlreadyExistsError,
     DBSnapshotNotFoundFault,
     DBSubnetGroupNotFoundError,
@@ -2208,6 +2210,47 @@ class DBInstanceAutomatedBackup:
         return status
 
 
+class DBShardGroup(RDSBaseModel):
+    resource_type = "shard-group"
+
+    SUPPORTED_FILTERS = {
+        "db-shard-group-id": FilterDef(
+            ["db_shard_group_identifier"],
+            "DB Shard Group Identifier",
+        ),
+        "db-cluster-id": FilterDef(
+            ["db_cluster_identifier"],
+            "DB Cluster Identifier",
+        ),
+    }
+
+    def __init__(
+        self,
+        backend: RDSBackend,
+        db_shard_group_identifier: str,
+        db_cluster_identifier: str,
+        max_acu: float,
+        compute_redundancy: Optional[int] = None,
+        min_acu: Optional[float] = None,
+        publicly_accessible: Optional[bool] = None,
+        tags: Optional[List[Dict[str, str]]] = None,
+    ):
+        super().__init__(backend)
+        self.db_shard_group_identifier = db_shard_group_identifier
+        self.db_cluster_identifier = db_cluster_identifier
+        self.compute_redundancy = compute_redundancy
+        self.max_acu = max_acu
+        self.min_acu = min_acu
+        self.status = "available"
+        self.db_shard_group_resource_id = (
+            f"shard-group-{self.db_shard_group_identifier}"
+        )
+        self.endpoint = f"{self.db_cluster_identifier}.{self.region}.rds.amazonaws.com"
+        self.db_shard_group_arn = f"arn:aws:rds:{self.region}:{self.account_id}:shard-group:{self.db_shard_group_identifier}"
+        self.publicly_accessible = publicly_accessible
+        self.tags = tags or []
+
+
 class RDSBackend(BaseBackend):
     def __init__(self, region_name: str, account_id: str):
         super().__init__(region_name, account_id)
@@ -2232,6 +2275,7 @@ class RDSBackend(BaseBackend):
         ] = CaseInsensitiveDict()
         self.option_groups: MutableMapping[str, OptionGroup] = CaseInsensitiveDict()
         self.security_groups: Dict[str, DBSecurityGroup] = {}
+        self.shard_groups: Dict[str, DBShardGroup] = {}
         self.subnet_groups: MutableMapping[str, DBSubnetGroup] = CaseInsensitiveDict()
         self._db_cluster_options: Optional[List[Dict[str, Any]]] = None
         self.db_proxies: Dict[str, DBProxy] = OrderedDict()
@@ -2244,6 +2288,7 @@ class RDSBackend(BaseBackend):
             DBParameterGroup: self.db_parameter_groups,
             DBProxy: self.db_proxies,
             DBSecurityGroup: self.security_groups,
+            DBShardGroup: self.shard_groups,
             DBSnapshot: self.database_snapshots,
             DBSubnetGroup: self.subnet_groups,
             EventSubscription: self.event_subscriptions,
@@ -4073,6 +4118,50 @@ class RDSBackend(BaseBackend):
         bg_deployment.deletion_time = utcnow()
         return bg_deployment
 
+    def create_db_shard_group(self, kwargs: Dict[str, Any]) -> DBShardGroup:
+        db_shard_group = DBShardGroup(self, **kwargs)
+
+        # Validate
+        db_shard_group_identifier = kwargs["db_shard_group_identifier"]
+        db_cluster_identifier = kwargs["db_cluster_identifier"]
+        compute_redundancy = kwargs.get("compute_redundancy")
+        max_acu = kwargs["max_acu"]
+        min_acu = kwargs.get("min_acu")
+
+        if db_shard_group_identifier in self.shard_groups:
+            raise DBShardGroupAlreadyExistsError(db_shard_group_identifier)
+
+        if db_cluster_identifier not in self.clusters:
+            raise DBClusterNotFoundError(db_cluster_identifier)
+
+        if compute_redundancy not in (None, 0, 1, 2):
+            raise InvalidParameterValue(
+                f"Invalid ComputeRedundancy value: '{compute_redundancy}'. "
+                "Valid values are 0 (no standby), 1 (1 standby AZ), 2 (2 standby AZs)."
+            )
+
+        if "min_acu" in kwargs and min_acu >= max_acu:
+            raise InvalidParameterValue("min_acu cannot be larger than max_acu")
+
+        self.shard_groups[db_shard_group.db_shard_group_identifier] = db_shard_group
+        return db_shard_group
+
+    def describe_db_shard_groups(
+        self,
+        db_shard_group_identifier: Optional[str],
+        filters: Optional[Dict[str, List[str]]],
+    ) -> List[DBShardGroup]:
+        shard_groups = self.shard_groups
+        if db_shard_group_identifier:
+            filters = merge_filters(
+                filters, {"db-shard-group-id": [db_shard_group_identifier]}
+            )
+        if filters:
+            shard_groups = self._filter_resources(shard_groups, filters, DBShardGroup)
+        if db_shard_group_identifier and not shard_groups:
+            raise DBShardGroupNotFoundFault(db_shard_group_identifier)
+        return list(shard_groups.values())
+
     def _is_cluster(self, arn: str) -> bool:
         return arn.split(":")[-2] == "cluster"
 
diff --git a/moto/rds/responses.py b/moto/rds/responses.py
index af70c00a0..6dff3dc1f 100644
--- a/moto/rds/responses.py
+++ b/moto/rds/responses.py
@@ -129,6 +129,21 @@ class RDSResponse(BaseResponse):
         result = {"DBSnapshot": snapshot}
         return ActionResult(result)
 
+    def create_db_shard_group(self) -> ActionResult:
+        kwargs = self.parameters
+        db_shard_group = self.backend.create_db_shard_group(kwargs)
+        return ActionResult(db_shard_group)
+
+    def describe_db_shard_groups(self) -> ActionResult:
+        db_shard_group_identifier = self.parameters.get("DBShardGroupIdentifier", None)
+        filters = self.parameters.get("Filters", [])
+        filter_dict = {f["Name"]: f["Values"] for f in filters}
+        shard_groups = self.backend.describe_db_shard_groups(
+            db_shard_group_identifier, filter_dict
+        )
+        result = {"DBShardGroups": shard_groups, "Marker": None}
+        return ActionResult(result)
+
     def copy_db_snapshot(self) -> ActionResult:
         target_snapshot_identifier = self.parameters.get("TargetDBSnapshotIdentifier")
         self.backend.validate_db_snapshot_identifier(
diff --git a/moto/sdb/exceptions.py b/moto/sdb/exceptions.py
index ef4b88796..3e255dcb8 100644
--- a/moto/sdb/exceptions.py
+++ b/moto/sdb/exceptions.py
@@ -1,49 +1,21 @@
 """Exceptions raised by the sdb service."""
 
-from typing import Any
+from moto.core.exceptions import ServiceException
 
-from moto.core.exceptions import RESTError
 
-SDB_ERROR = """<?xml version="1.0"?>
-<Response>
-    <Errors>
-        <Error>
-            <Code>{{ error_type }}</Code>
-            <Message>{{ message }}</Message>
-            <BoxUsage>0.0055590278</BoxUsage>
-        </Error>
-    </Errors>
-    <RequestID>ba3a8c86-dc37-0a45-ef44-c6cf7876a62f</RequestID>
-</Response>"""
+class SDBError(ServiceException):
+    box_usage = 0.0055590278
 
 
-class InvalidParameterError(RESTError):
-    code = 400
-    extended_templates = {"sdb_error": SDB_ERROR}
-    env = RESTError.extended_environment(extended_templates)
-
-    def __init__(self, **kwargs: Any):
-        kwargs.setdefault("template", "sdb_error")
-        kwargs["error_type"] = "InvalidParameterValue"
-        super().__init__(**kwargs)
+class InvalidParameterError(SDBError):
+    code = "InvalidParameterValue"
 
 
 class InvalidDomainName(InvalidParameterError):
-    code = 400
-
     def __init__(self, domain_name: str):
-        super().__init__(
-            message=f"Value ({domain_name}) for parameter DomainName is invalid. "
-        )
-
+        super().__init__(f"Value ({domain_name}) for parameter DomainName is invalid. ")
 
-class UnknownDomainName(RESTError):
-    code = 400
-    extended_templates = {"sdb_error": SDB_ERROR}
-    env = RESTError.extended_environment(extended_templates)
 
-    def __init__(self, **kwargs: Any):
-        kwargs.setdefault("template", "sdb_error")
-        kwargs["error_type"] = "NoSuchDomain"
-        kwargs["message"] = "The specified domain does not exist."
-        super().__init__(**kwargs)
+class UnknownDomainName(SDBError):
+    code = "NoSuchDomain"
+    message = "The specified domain does not exist."
diff --git a/moto/sdb/responses.py b/moto/sdb/responses.py
index 1009ef63e..3f118680c 100644
--- a/moto/sdb/responses.py
+++ b/moto/sdb/responses.py
@@ -1,4 +1,4 @@
-from moto.core.responses import BaseResponse
+from moto.core.responses import ActionResult, BaseResponse, EmptyResult
 
 from .models import SimpleDBBackend, sdb_backends
 
@@ -11,24 +11,22 @@ class SimpleDBResponse(BaseResponse):
     def sdb_backend(self) -> SimpleDBBackend:
         return sdb_backends[self.current_account][self.region]
 
-    def create_domain(self) -> str:
+    def create_domain(self) -> ActionResult:
         domain_name = self._get_param("DomainName")
         self.sdb_backend.create_domain(domain_name=domain_name)
-        template = self.response_template(CREATE_DOMAIN_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    def delete_domain(self) -> str:
+    def delete_domain(self) -> ActionResult:
         domain_name = self._get_param("DomainName")
         self.sdb_backend.delete_domain(domain_name=domain_name)
-        template = self.response_template(DELETE_DOMAIN_TEMPLATE)
-        return template.render()
+        return EmptyResult()
 
-    def list_domains(self) -> str:
+    def list_domains(self) -> ActionResult:
         domain_names = self.sdb_backend.list_domains()
-        template = self.response_template(LIST_DOMAINS_TEMPLATE)
-        return template.render(domain_names=domain_names, next_token=None)
+        result = {"DomainNames": domain_names}
+        return ActionResult(result)
 
-    def get_attributes(self) -> str:
+    def get_attributes(self) -> ActionResult:
         domain_name = self._get_param("DomainName")
         item_name = self._get_param("ItemName")
         attribute_names = self._get_multi_param("AttributeName.")
@@ -37,58 +35,14 @@ class SimpleDBResponse(BaseResponse):
             item_name=item_name,
             attribute_names=attribute_names,
         )
-        template = self.response_template(GET_ATTRIBUTES_TEMPLATE)
-        return template.render(attributes=attributes)
+        result = {"Attributes": attributes}
+        return ActionResult(result)
 
-    def put_attributes(self) -> str:
+    def put_attributes(self) -> ActionResult:
         domain_name = self._get_param("DomainName")
         item_name = self._get_param("ItemName")
         attributes = self._get_list_prefix("Attribute")
         self.sdb_backend.put_attributes(
             domain_name=domain_name, item_name=item_name, attributes=attributes
         )
-        template = self.response_template(PUT_ATTRIBUTES_TEMPLATE)
-        return template.render()
-
-
-CREATE_DOMAIN_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
-<CreateDomainResult  xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"></CreateDomainResult>
-"""
-
-
-LIST_DOMAINS_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
-<ListDomainsResponse  xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
-    <ListDomainsResult>
-        {% for name in domain_names %}
-            <DomainName>{{ name }}</DomainName>
-        {% endfor %}
-        <NextToken>{{ next_token }}</NextToken>
-    </ListDomainsResult>
-</ListDomainsResponse>
-"""
-
-DELETE_DOMAIN_TEMPLATE = """<?xml version="1.0"?>
-<DeleteDomainResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
-  <ResponseMetadata>
-    <RequestId>64d9c3ac-ef19-2e3d-7a03-9ea46205eb71</RequestId>
-    <BoxUsage>0.0055590278</BoxUsage>
-  </ResponseMetadata>
-</DeleteDomainResponse>"""
-
-PUT_ATTRIBUTES_TEMPLATE = """<?xml version="1.0" encoding="UTF-8"?>
-<PutAttributesResult xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"></PutAttributesResult>
-"""
-
-GET_ATTRIBUTES_TEMPLATE = """<GetAttributesResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
-  <ResponseMetadata>
-    <RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
-  </ResponseMetadata>
-  <GetAttributesResult>
-{% for attribute in attributes %}
-      <Attribute>
-        <Name>{{ attribute["name"] }}</Name>
-        <Value>{{ attribute["value"] }}</Value>
-      </Attribute>
-{% endfor %}
-  </GetAttributesResult>
-</GetAttributesResponse>"""
+        return EmptyResult()


Test patch:
diff --git a/.github/workflows/tests_sdk_sagemaker.yml b/.github/workflows/tests_sdk_sagemaker.yml
index 1802c3250..348146dd1 100644
--- a/.github/workflows/tests_sdk_sagemaker.yml
+++ b/.github/workflows/tests_sdk_sagemaker.yml
@@ -19,11 +19,12 @@ jobs:
     - name: Install dependencies
       run: |
         pip install boto3 pytest sagemaker
-        # Test fails with this particular version of sagemaker_core
+        # Multiple versions of sagemaker_core failing with the following:
         # E       pydantic_core._pydantic_core.ValidationError: 1 validation error for TrainingJob.create
         # E       session
         # E         Input should be a valid dictionary or instance of Session [type=model_type, input_value=Session(region_name='us-east-1'), input_type=Session]
-        pip install sagemaker_core!=1.0.42
+        # Pin to last known working release.
+        pip install sagemaker_core==1.0.41
     - name: Run tests
       run: |
         mkdir ~/.aws
diff --git a/tests/test_elasticbeanstalk/test_elasticbeanstalk.py b/tests/test_elasticbeanstalk/test_elasticbeanstalk.py
index 3d2a0c863..0879d706f 100644
--- a/tests/test_elasticbeanstalk/test_elasticbeanstalk.py
+++ b/tests/test_elasticbeanstalk/test_elasticbeanstalk.py
@@ -55,14 +55,8 @@ def test_delete_unknown_application():
     unknown_application_name = "myapp1"
 
     conn.create_application(ApplicationName=application_name)
-    with pytest.raises(ClientError) as exc:
-        conn.delete_application(ApplicationName=unknown_application_name)
-    err = exc.value.response["Error"]
-    assert err["Code"] == "ApplicationNotFound"
-    assert (
-        err["Message"]
-        == f"Elastic Beanstalk application {unknown_application_name} not found."
-    )
+    resp = conn.delete_application(ApplicationName=unknown_application_name)
+    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
 
 
 @mock_aws
@@ -160,3 +154,5 @@ def test_list_available_solution_stacks():
     stacks = conn.list_available_solution_stacks()
     assert len(stacks["SolutionStacks"]) > 0
     assert len(stacks["SolutionStacks"]) == len(stacks["SolutionStackDetails"])
+    assert "SolutionStackName" in stacks["SolutionStackDetails"][0]
+    assert "PermittedFileTypes" in stacks["SolutionStackDetails"][0]
diff --git a/tests/test_elasticbeanstalk/test_server.py b/tests/test_elasticbeanstalk/test_server.py
index 315276fc8..8504de7bd 100644
--- a/tests/test_elasticbeanstalk/test_server.py
+++ b/tests/test_elasticbeanstalk/test_server.py
@@ -12,4 +12,4 @@ def test_elasticbeanstalk_describe():
     resp = test_client.post("/", data=data, headers=headers)
 
     assert resp.status_code == 200
-    assert "<Applications></Applications>" in str(resp.data)
+    assert "<DescribeApplicationsResult><Applications" in str(resp.data)
diff --git a/tests/test_rds/test_db_shard_group.py b/tests/test_rds/test_db_shard_group.py
new file mode 100644
index 000000000..49dac9673
--- /dev/null
+++ b/tests/test_rds/test_db_shard_group.py
@@ -0,0 +1,210 @@
+import boto3
+import pytest
+from botocore.exceptions import ClientError
+
+from moto import mock_aws
+from moto.core import DEFAULT_ACCOUNT_ID
+
+
+@pytest.fixture(name="client")
+@mock_aws
+def get_rds_client():
+    return boto3.client("rds", region_name="us-east-2")
+
+
+@mock_aws
+def test_create_db_shard_group(client):
+    client.create_db_cluster(
+        DBClusterIdentifier="test_db_cluster_identifier",
+        Engine="aurora-postgresql",
+        MasterUsername="admin",
+        MasterUserPassword="root-password",
+    )
+    shard_group = client.create_db_shard_group(
+        DBShardGroupIdentifier="shardgroup1",
+        DBClusterIdentifier="test_db_cluster_identifier",
+        MaxACU=100,
+        MinACU=50,
+        PubliclyAccessible=True,
+        Tags=[{"Key": "Environment", "Value": "Test"}],
+    )
+    assert shard_group["DBShardGroupIdentifier"] == "shardgroup1"
+    assert shard_group["DBClusterIdentifier"] == "test_db_cluster_identifier"
+    assert (
+        shard_group["DBShardGroupArn"]
+        == f"arn:aws:rds:us-east-2:{DEFAULT_ACCOUNT_ID}:shard-group:shardgroup1"
+    )
+
+
+@mock_aws
+def test_create_db_shard_group_duplicate(client):
+    client.create_db_cluster(
+        DBClusterIdentifier="test_db_cluster_identifier",
+        Engine="aurora-postgresql",
+        MasterUsername="admin",
+        MasterUserPassword="root-password",
+    )
+
+    client.create_db_shard_group(
+        DBShardGroupIdentifier="shardgroup1",
+        DBClusterIdentifier="test_db_cluster_identifier",
+        MaxACU=100,
+        MinACU=50,
+        PubliclyAccessible=True,
+        Tags=[{"Key": "Environment", "Value": "Test"}],
+    )
+
+    with pytest.raises(ClientError) as ex:
+        client.create_db_shard_group(
+            DBShardGroupIdentifier="shardgroup1",
+            DBClusterIdentifier="test_db_cluster_identifier",
+            MaxACU=100,
+            MinACU=50,
+            PubliclyAccessible=True,
+            Tags=[{"Key": "Environment", "Value": "Test"}],
+        )
+    err = ex.value.response["Error"]
+    assert err["Code"] == "DBShardGroupAlreadyExists"
+    assert err["Message"] == "DB Shard Group shardgroup1 already exists."
+
+
+@mock_aws
+def test_shard_group_cluster_not_found(client):
+    with pytest.raises(ClientError) as ex:
+        client.create_db_shard_group(
+            DBShardGroupIdentifier="shardgroup1",
+            DBClusterIdentifier="test_db_cluster_identifier",
+            MaxACU=100,
+            MinACU=50,
+            PubliclyAccessible=True,
+            Tags=[{"Key": "Environment", "Value": "Test"}],
+        )
+    err = ex.value.response["Error"]
+    assert err["Code"] == "DBClusterNotFoundFault"
+    assert err["Message"] == "DBCluster test_db_cluster_identifier not found."
+
+
+@mock_aws
+def test_shard_group_cluster_invalid_compute_redundancy(client):
+    client.create_db_cluster(
+        DBClusterIdentifier="test_db_cluster_identifier",
+        Engine="aurora-postgresql",
+        MasterUsername="admin",
+        MasterUserPassword="root-password",
+    )
+    with pytest.raises(ClientError) as ex:
+        client.create_db_shard_group(
+            DBShardGroupIdentifier="shardgroup1",
+            DBClusterIdentifier="test_db_cluster_identifier",
+            ComputeRedundancy=3,
+            MaxACU=100,
+            MinACU=50,
+            PubliclyAccessible=True,
+            Tags=[{"Key": "Environment", "Value": "Test"}],
+        )
+    err = ex.value.response["Error"]
+    assert err["Code"] == "InvalidParameterValue"
+    assert (
+        err["Message"]
+        == "Invalid ComputeRedundancy value: '3'. Valid values are 0 (no standby), 1 (1 standby AZ), 2 (2 standby AZs)."
+    )
+
+
+@mock_aws
+def test_shard_group_cluster_invalid_max_min_acu(client):
+    client.create_db_cluster(
+        DBClusterIdentifier="test_db_cluster_identifier",
+        Engine="aurora-postgresql",
+        MasterUsername="admin",
+        MasterUserPassword="root-password",
+    )
+    with pytest.raises(ClientError) as ex:
+        client.create_db_shard_group(
+            DBShardGroupIdentifier="shardgroup1",
+            DBClusterIdentifier="test_db_cluster_identifier",
+            ComputeRedundancy=1,
+            MaxACU=0,
+            MinACU=100,
+            PubliclyAccessible=True,
+            Tags=[{"Key": "Environment", "Value": "Test"}],
+        )
+    err = ex.value.response["Error"]
+    assert err["Code"] == "InvalidParameterValue"
+    assert err["Message"] == "min_acu cannot be larger than max_acu"
+
+
+@mock_aws
+def test_describe_db_shard_group_initial(client):
+    shard_groups = client.describe_db_shard_groups()
+    assert len(shard_groups["DBShardGroups"]) == 0
+
+
+@mock_aws
+def test_describe_db_shard_group_non_existent(client):
+    shard_groups = client.describe_db_shard_groups()
+    assert len(shard_groups["DBShardGroups"]) == 0
+    with pytest.raises(ClientError) as ex:
+        client.describe_db_shard_groups(DBShardGroupIdentifier="shardgroup1")
+    err = ex.value.response["Error"]
+    assert err["Code"] == "DBShardGroupNotFound"
+    assert err["Message"] == "DBShardGroup shardgroup1 not found."
+
+
+@mock_aws
+def test_describe_db_shard_group_after_creation(client):
+    client.create_db_cluster(
+        DBClusterIdentifier="test_db_cluster_identifier",
+        Engine="aurora-postgresql",
+        MasterUsername="admin",
+        MasterUserPassword="root-password",
+    )
+
+    client.create_db_shard_group(
+        DBShardGroupIdentifier="shardgroup1",
+        DBClusterIdentifier="test_db_cluster_identifier",
+        MaxACU=100,
+        MinACU=50,
+        PubliclyAccessible=True,
+        Tags=[{"Key": "Environment", "Value": "Test"}],
+    )
+
+    shard_groups = client.describe_db_shard_groups(
+        DBShardGroupIdentifier="shardgroup1"
+    )["DBShardGroups"]
+    assert len(shard_groups) == 1
+    assert shard_groups[0]["DBShardGroupIdentifier"] == "shardgroup1"
+    assert shard_groups[0]["DBClusterIdentifier"] == "test_db_cluster_identifier"
+    assert (
+        shard_groups[0]["DBShardGroupArn"]
+        == f"arn:aws:rds:us-east-2:{DEFAULT_ACCOUNT_ID}:shard-group:shardgroup1"
+    )
+
+
+@mock_aws
+def test_describe_db_shard_group_filter_by_cluster_id(client):
+    client.create_db_cluster(
+        DBClusterIdentifier="test_db_cluster_identifier",
+        Engine="aurora-postgresql",
+        MasterUsername="admin",
+        MasterUserPassword="root-password",
+    )
+    client.create_db_shard_group(
+        DBShardGroupIdentifier="shardgroup1",
+        DBClusterIdentifier="test_db_cluster_identifier",
+        MaxACU=100,
+        MinACU=50,
+        PubliclyAccessible=True,
+        Tags=[{"Key": "Environment", "Value": "Test"}],
+    )
+
+    shard_groups = client.describe_db_shard_groups(
+        DBShardGroupIdentifier="shardgroup1"
+    )["DBShardGroups"]
+
+    assert len(shard_groups) == 1
+    assert shard_groups[0]["DBShardGroupIdentifier"] == "shardgroup1"
+    assert shard_groups[0]["DBClusterIdentifier"] == "test_db_cluster_identifier"
+    assert (
+        shard_groups[0]["DBShardGroupArn"]
+        == f"arn:aws:rds:us-east-2:{DEFAULT_ACCOUNT_ID}:shard-group:shardgroup1"
+    )