Repository: aws/serverless-application-model

Issue:
Feature Request: AWS SAM does not support Description property for AWS::Serverless::Api
**Description:**
This is not a bug or an issue. It is more like a feature request.

I noticed while creating an API today that AWS SAM does not support a `Description` property for `AWS::Serverless::Api` resource.

Can this property be added to AWS SAM? We have many APIs created and currently, it's not easy to tell their usage. So, being able to set the `Description` property would be a very nice ability to have.

**Expected result:**

`AWS::Serverless::Api` has a `Description` property where we set a custom description:

```
MyApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: "MyApi"
      StageName: "v1"
      Description: "This is my API"
```

Thank you



Discussion:
codecov-commenter: # [Codecov](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=h1) Report
> Merging [#1719](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=desc) into [develop](https://codecov.io/gh/aws/serverless-application-model/commit/1ba4e567901bf53f104f853fcdfae5fad7a2bda9?el=desc) will **increase** coverage by `0.00%`.
> The diff coverage is `100.00%`.

[![Impacted file tree graph](https://codecov.io/gh/aws/serverless-application-model/pull/1719/graphs/tree.svg?width=650&height=150&src=pr&token=9qv2cdbX38)](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=tree)

```diff
@@           Coverage Diff            @@
##           develop    #1719   +/-   ##
========================================
  Coverage    94.15%   94.15%           
========================================
  Files           86       86           
  Lines         5439     5445    +6     
  Branches      1087     1089    +2     
========================================
+ Hits          5121     5127    +6     
  Misses         147      147           
  Partials       171      171           
```


| [Impacted Files](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [samtranslator/model/sam\_resources.py](https://codecov.io/gh/aws/serverless-application-model/pull/1719/diff?src=pr&el=tree#diff-c2FtdHJhbnNsYXRvci9tb2RlbC9zYW1fcmVzb3VyY2VzLnB5) | `93.37% <ø> (ø)` | |
| [samtranslator/model/api/api\_generator.py](https://codecov.io/gh/aws/serverless-application-model/pull/1719/diff?src=pr&el=tree#diff-c2FtdHJhbnNsYXRvci9tb2RlbC9hcGkvYXBpX2dlbmVyYXRvci5weQ==) | `94.94% <100.00%> (+0.03%)` | :arrow_up: |
| [samtranslator/model/api/http\_api\_generator.py](https://codecov.io/gh/aws/serverless-application-model/pull/1719/diff?src=pr&el=tree#diff-c2FtdHJhbnNsYXRvci9tb2RlbC9hcGkvaHR0cF9hcGlfZ2VuZXJhdG9yLnB5) | `91.69% <100.00%> (+0.09%)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=footer). Last update [1ba4e56...b506a5d](https://codecov.io/gh/aws/serverless-application-model/pull/1719?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

hawflau: Hey @gruebel it looks good to me!
It's just there are conflicting files that need to be resolved. If you don't mind, I can help resolve these conflicts
gruebel: @hawflau no problem, I accidentally rebased against the master branch 🙈 , but now I fixed it 😄 

Patch:
diff --git a/docs/cloudformation_compatibility.rst b/docs/cloudformation_compatibility.rst
index 50b97361..5cac0920 100644
--- a/docs/cloudformation_compatibility.rst
+++ b/docs/cloudformation_compatibility.rst
@@ -108,6 +108,16 @@ StartingPosition         All
 BatchSize                All
 ======================== ================================== ========================
 
+MQ
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+======================== ================================== ========================
+     Property Name        Intrinsic(s) Supported            Reasons
+======================== ================================== ========================
+Broker                          All
+Queues                          All
+SourceAccessConfigurations      All
+======================== ================================== ========================
+
 MSK
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ======================== ================================== ========================
diff --git a/docs/internals/generated_resources.rst b/docs/internals/generated_resources.rst
index 760d52a1..3d03cd14 100644
--- a/docs/internals/generated_resources.rst
+++ b/docs/internals/generated_resources.rst
@@ -326,6 +326,36 @@ AWS::Lambda::Permission            MyFunction\ **MyTrigger**\ Permission
 AWS::Lambda::EventSourceMapping    MyFunction\ **MyTrigger** 
 ================================== ================================
 
+MQ
+^^^^^^^
+
+Example:
+
+.. code:: yaml
+
+  MyFunction:
+    Type: AWS::Serverless::Function
+    Properties:
+      ...
+      Events:
+        MyTrigger:
+          Type: MQ
+          Properties:
+            Broker: arn:aws:mq:us-east-2:123456789012:broker:MyBroker:b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9
+            SourceAccessConfigurations:
+              Type: BASIC_AUTH
+              URI: arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c
+      ...
+
+Additional generated resources:
+
+================================== ================================
+CloudFormation Resource Type       Logical ID
+================================== ================================
+AWS::Lambda::Permission            MyFunction\ **MyTrigger**\ Permission
+AWS::Lambda::EventSourceMapping    MyFunction\ **MyTrigger**
+================================== ================================
+
 MSK
 ^^^^^^^
 
diff --git a/samtranslator/__init__.py b/samtranslator/__init__.py
index 6e63f100..c347ac29 100644
--- a/samtranslator/__init__.py
+++ b/samtranslator/__init__.py
@@ -1,1 +1,1 @@
-__version__ = "1.28.1"
+__version__ = "1.29.0"
diff --git a/samtranslator/model/api/api_generator.py b/samtranslator/model/api/api_generator.py
index 0cdd780f..4ae7c9df 100644
--- a/samtranslator/model/api/api_generator.py
+++ b/samtranslator/model/api/api_generator.py
@@ -85,6 +85,7 @@ class ApiGenerator(object):
         open_api_version=None,
         models=None,
         domain=None,
+        description=None,
     ):
         """Constructs an API Generator class that generates API Gateway resources
 
@@ -104,6 +105,7 @@ class ApiGenerator(object):
         :param resource_attributes: Resource attributes to add to API resources
         :param passthrough_resource_attributes: Attributes such as `Condition` that are added to derived resources
         :param models: Model definitions to be used by API methods
+        :param description: Description of the API Gateway resource
         """
         self.logical_id = logical_id
         self.cache_cluster_enabled = cache_cluster_enabled
@@ -131,6 +133,7 @@ class ApiGenerator(object):
         self.remove_extra_stage = open_api_version
         self.models = models
         self.domain = domain
+        self.description = description
 
     def _construct_rest_api(self):
         """Constructs and returns the ApiGateway RestApi.
@@ -181,6 +184,9 @@ class ApiGenerator(object):
         if self.name:
             rest_api.Name = self.name
 
+        if self.description:
+            rest_api.Description = self.description
+
         return rest_api
 
     def _construct_body_s3_dict(self):
diff --git a/samtranslator/model/api/http_api_generator.py b/samtranslator/model/api/http_api_generator.py
index 6f251fef..3500766e 100644
--- a/samtranslator/model/api/http_api_generator.py
+++ b/samtranslator/model/api/http_api_generator.py
@@ -48,6 +48,7 @@ class HttpApiGenerator(object):
         passthrough_resource_attributes=None,
         domain=None,
         fail_on_warnings=False,
+        description=None,
         disable_execute_api_endpoint=False,
     ):
         """Constructs an API Generator class that generates API Gateway resources
@@ -63,6 +64,7 @@ class HttpApiGenerator(object):
         :param access_log_settings: Whether to send access logs and where for Stage
         :param resource_attributes: Resource attributes to add to API resources
         :param passthrough_resource_attributes: Attributes such as `Condition` that are added to derived resources
+        :param description: Description of the API Gateway resource
         """
         self.logical_id = logical_id
         self.stage_variables = stage_variables
@@ -82,6 +84,7 @@ class HttpApiGenerator(object):
         self.passthrough_resource_attributes = passthrough_resource_attributes
         self.domain = domain
         self.fail_on_warnings = fail_on_warnings
+        self.description = description
         self.disable_execute_api_endpoint = disable_execute_api_endpoint
 
     def _construct_http_api(self):
@@ -121,6 +124,9 @@ class HttpApiGenerator(object):
                 "add a 'HttpApi' event to an 'AWS::Serverless::Function'.",
             )
 
+        if self.description:
+            http_api.Description = self.description
+
         return http_api
 
     def _add_cors(self):
diff --git a/samtranslator/model/eventsources/pull.py b/samtranslator/model/eventsources/pull.py
index f629b56c..7ead5756 100644
--- a/samtranslator/model/eventsources/pull.py
+++ b/samtranslator/model/eventsources/pull.py
@@ -10,7 +10,7 @@ from samtranslator.model.iam import IAMRolePolicies
 class PullEventSource(ResourceMacro):
     """Base class for pull event sources for SAM Functions.
 
-    The pull events are Kinesis Streams, DynamoDB Streams, Kafka Streams and SQS Queues. All of these correspond to an
+    The pull events are Kinesis Streams, DynamoDB Streams, Kafka Topics, ActiveMQ Queues and SQS Queues. All of these correspond to an
     EventSourceMapping in Lambda, and require that the execution role be given to Kinesis Streams, DynamoDB
     Streams, or SQS Queues, respectively.
 
@@ -31,6 +31,9 @@ class PullEventSource(ResourceMacro):
         "DestinationConfig": PropertyType(False, is_type(dict)),
         "ParallelizationFactor": PropertyType(False, is_type(int)),
         "Topics": PropertyType(False, is_type(list)),
+        "Broker": PropertyType(False, is_str()),
+        "Queues": PropertyType(False, is_type(list)),
+        "SourceAccessConfigurations": PropertyType(False, is_type(list)),
     }
 
     def get_policy_arn(self):
@@ -60,16 +63,17 @@ class PullEventSource(ResourceMacro):
         except NotImplementedError:
             function_name_or_arn = function.get_runtime_attr("arn")
 
-        if not self.Stream and not self.Queue:
+        if not self.Stream and not self.Queue and not self.Broker:
             raise InvalidEventException(
-                self.relative_id, "No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) provided."
+                self.relative_id,
+                "No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided.",
             )
 
         if self.Stream and not self.StartingPosition:
             raise InvalidEventException(self.relative_id, "StartingPosition is required for Kinesis, DynamoDB and MSK.")
 
         lambda_eventsourcemapping.FunctionName = function_name_or_arn
-        lambda_eventsourcemapping.EventSourceArn = self.Stream or self.Queue
+        lambda_eventsourcemapping.EventSourceArn = self.Stream or self.Queue or self.Broker
         lambda_eventsourcemapping.StartingPosition = self.StartingPosition
         lambda_eventsourcemapping.BatchSize = self.BatchSize
         lambda_eventsourcemapping.Enabled = self.Enabled
@@ -79,6 +83,8 @@ class PullEventSource(ResourceMacro):
         lambda_eventsourcemapping.MaximumRecordAgeInSeconds = self.MaximumRecordAgeInSeconds
         lambda_eventsourcemapping.ParallelizationFactor = self.ParallelizationFactor
         lambda_eventsourcemapping.Topics = self.Topics
+        lambda_eventsourcemapping.Queues = self.Queues
+        lambda_eventsourcemapping.SourceAccessConfigurations = self.SourceAccessConfigurations
 
         destination_config_policy = None
         if self.DestinationConfig:
@@ -170,3 +176,12 @@ class MSK(PullEventSource):
 
     def get_policy_arn(self):
         return ArnGenerator.generate_aws_managed_policy_arn("service-role/AWSLambdaMSKExecutionRole")
+
+
+class MQ(PullEventSource):
+    """MQ event source."""
+
+    resource_type = "MQ"
+
+    def get_policy_arn(self):
+        return ArnGenerator.generate_aws_managed_policy_arn("service-role/AWSLambdaAMQExecutionRole")
diff --git a/samtranslator/model/lambda_.py b/samtranslator/model/lambda_.py
index 45db5452..0cb75661 100644
--- a/samtranslator/model/lambda_.py
+++ b/samtranslator/model/lambda_.py
@@ -70,6 +70,8 @@ class LambdaEventSourceMapping(Resource):
         "ParallelizationFactor": PropertyType(False, is_type(int)),
         "StartingPosition": PropertyType(False, is_str()),
         "Topics": PropertyType(False, is_type(list)),
+        "Queues": PropertyType(False, is_type(list)),
+        "SourceAccessConfigurations": PropertyType(False, is_type(list)),
     }
 
     runtime_attrs = {"name": lambda self: ref(self.logical_id)}
diff --git a/samtranslator/model/sam_resources.py b/samtranslator/model/sam_resources.py
index 957d0338..007a3ded 100644
--- a/samtranslator/model/sam_resources.py
+++ b/samtranslator/model/sam_resources.py
@@ -734,6 +734,7 @@ class SamApi(SamResourceMacro):
         "OpenApiVersion": PropertyType(False, is_str()),
         "Models": PropertyType(False, is_type(dict)),
         "Domain": PropertyType(False, is_type(dict)),
+        "Description": PropertyType(False, is_str()),
     }
 
     referable_properties = {
@@ -787,6 +788,7 @@ class SamApi(SamResourceMacro):
             open_api_version=self.OpenApiVersion,
             models=self.Models,
             domain=self.Domain,
+            description=self.Description,
         )
 
         (
@@ -837,6 +839,7 @@ class SamHttpApi(SamResourceMacro):
         "RouteSettings": PropertyType(False, is_type(dict)),
         "Domain": PropertyType(False, is_type(dict)),
         "FailOnWarnings": PropertyType(False, is_type(bool)),
+        "Description": PropertyType(False, is_str()),
         "DisableExecuteApiEndpoint": PropertyType(False, is_type(bool)),
     }
 
@@ -877,6 +880,7 @@ class SamHttpApi(SamResourceMacro):
             passthrough_resource_attributes=self.get_passthrough_resource_attributes(),
             domain=self.Domain,
             fail_on_warnings=self.FailOnWarnings,
+            description=self.Description,
             disable_execute_api_endpoint=self.DisableExecuteApiEndpoint,
         )
 
diff --git a/samtranslator/validator/sam_schema/schema.json b/samtranslator/validator/sam_schema/schema.json
index 19699aca..bff1d9ea 100644
--- a/samtranslator/validator/sam_schema/schema.json
+++ b/samtranslator/validator/sam_schema/schema.json
@@ -55,6 +55,9 @@
                 }
               ]
             },
+            "Description": {
+              "type": "string"
+            },
             "Name": {
               "type": "string"
             },
@@ -477,6 +480,9 @@
             {
               "$ref": "#/definitions/AWS::Serverless::Function.MSKEvent"
             },
+            {
+              "$ref": "#/definitions/AWS::Serverless::Function.MQEvent"
+            },
             {
               "$ref": "#/definitions/AWS::Serverless::Function.SQSEvent"
             },
@@ -609,6 +615,26 @@
       ],
       "type": "object"
     },
+    "AWS::Serverless::Function.MQEvent": {
+      "additionalProperties": false,
+      "properties": {
+        "Broker": {
+          "type": "string"
+        },
+        "Queues": {
+          "type": "array"
+        },
+        "SourceAccessConfigurations": {
+          "type": "array"
+        }
+      },
+      "required": [
+        "Broker",
+        "Queues",
+        "SourceAccessConfigurations"
+      ],
+      "type": "object"
+    },
 
     "AWS::Serverless::Function.SQSEvent": {
       "additionalProperties": false,
diff --git a/versions/2016-10-31.md b/versions/2016-10-31.md
index 0ccaefa7..b1aeddf6 100644
--- a/versions/2016-10-31.md
+++ b/versions/2016-10-31.md
@@ -245,6 +245,7 @@ TracingEnabled | `boolean` | Indicates whether active tracing with X-Ray is enab
 Models | `List of JSON or YAML objects` | JSON schemas that describes the models to be used by API methods.
 Domain | [Domain Configuration Object](#domain-configuration-object) | Configuration settings for custom domains on API. Must contain `DomainName` and `CertificateArn`
 OpenApiVersion | `string` | Version of OpenApi to use. This can either be `'2.0'` for the swagger spec or one of the OpenApi 3.0 versions, like `'3.0.1'`. Setting this property to any valid value will also remove the stage `Stage` that SAM creates.
+Description | `string` | A description of the REST API resource.
 
 ##### Return values
 
@@ -287,6 +288,7 @@ RouteSettings | [RouteSettings](https://docs.aws.amazon.com/AWSCloudFormation/la
 Domain | [Domain Configuration Object](#domain-configuration-object) | Configuration settings for custom domains on API. Must contain `DomainName` and `CertificateArn`
 StageVariables | Map of `string` to `string` | A map that defines the stage variables for a Stage. Variable names can have alphanumeric and underscore characters, and the values must match [A-Za-z0-9-._~:/?#&=,]+.
 FailOnWarnings | `boolean` | Specifies whether to rollback the API creation (true) or not (false) when a warning is encountered. The default value is false.
+Description | `string` | A description of the HTTP API resource.
 
 ##### Return values
 


Test patch:
diff --git a/tests/model/test_sam_resources.py b/tests/model/test_sam_resources.py
index d42d844a..8d1fa83f 100644
--- a/tests/model/test_sam_resources.py
+++ b/tests/model/test_sam_resources.py
@@ -4,13 +4,13 @@ import pytest
 
 from samtranslator.intrinsics.resolver import IntrinsicsResolver
 from samtranslator.model import InvalidResourceException
+from samtranslator.model.apigatewayv2 import ApiGatewayV2HttpApi
 from samtranslator.model.lambda_ import LambdaFunction, LambdaVersion
 from samtranslator.model.apigateway import ApiGatewayRestApi
 from samtranslator.model.apigateway import ApiGatewayDeployment
 from samtranslator.model.apigateway import ApiGatewayStage
 from samtranslator.model.iam import IAMRole
-from samtranslator.model.sam_resources import SamFunction
-from samtranslator.model.sam_resources import SamApi
+from samtranslator.model.sam_resources import SamFunction, SamApi, SamHttpApi
 
 
 class TestCodeUri(TestCase):
@@ -188,3 +188,55 @@ class TestApiTags(TestCase):
 
         self.assertEqual(deployment.__len__(), 1)
         self.assertEqual(deployment[0].Tags, [{"Key": "MyKey", "Value": "MyValue"}])
+
+
+class TestApiDescription(TestCase):
+    kwargs = {
+        "intrinsics_resolver": IntrinsicsResolver({}),
+        "event_resources": [],
+        "managed_policy_map": {"foo": "bar"},
+    }
+
+    @patch("boto3.session.Session.region_name", "eu-central-1")
+    def test_with_no_description(self):
+        sam_api = SamApi("foo")
+
+        resources = sam_api.to_cloudformation(**self.kwargs)
+        rest_api = [x for x in resources if isinstance(x, ApiGatewayRestApi)]
+        self.assertEqual(rest_api[0].Description, None)
+
+    @patch("boto3.session.Session.region_name", "eu-central-1")
+    def test_with_description(self):
+        sam_api = SamApi("foo")
+        sam_api.Description = "my description"
+
+        resources = sam_api.to_cloudformation(**self.kwargs)
+        rest_api = [x for x in resources if isinstance(x, ApiGatewayRestApi)]
+        self.assertEqual(rest_api[0].Description, "my description")
+
+
+class TestHttpApiDescription(TestCase):
+    kwargs = {
+        "intrinsics_resolver": IntrinsicsResolver({}),
+        "event_resources": [],
+        "managed_policy_map": {"foo": "bar"},
+    }
+
+    @patch("boto3.session.Session.region_name", "eu-central-1")
+    def test_with_no_description(self):
+        sam_http_api = SamHttpApi("foo")
+        sam_http_api.DefinitionUri = "s3://foobar/foo.zip"
+
+        resources = sam_http_api.to_cloudformation(**self.kwargs)
+        rest_api = [x for x in resources if isinstance(x, ApiGatewayV2HttpApi)]
+        self.assertEqual(rest_api[0].Description, None)
+
+    @patch("boto3.session.Session.region_name", "eu-central-1")
+    def test_with_description(self):
+        sam_http_api = SamHttpApi("foo")
+        sam_http_api.DefinitionUri = "s3://foobar/foo.zip"
+        sam_http_api.Description = "my description"
+
+        resources = sam_http_api.to_cloudformation(**self.kwargs)
+        rest_api = [x for x in resources if isinstance(x, ApiGatewayV2HttpApi)]
+        self.assertEqual(rest_api[0].Description, "my description")
diff --git a/tests/translator/input/amq.yaml b/tests/translator/input/amq.yaml
new file mode 100644
index 00000000..00d28b84
--- /dev/null
+++ b/tests/translator/input/amq.yaml
@@ -0,0 +1,17 @@
+Resources:
+  MQFunction:
+    Type: 'AWS::Serverless::Function'
+    Properties:
+      CodeUri: s3://sam-demo-bucket/queues.zip
+      Handler: queue.mq_handler
+      Runtime: python2.7
+      Events:
+        MyMQQueue:
+          Type: MQ
+          Properties:
+            Broker: arn:aws:mq:us-east-2:123456789012:broker:MyBroker:b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9
+            Queues:
+              - "Queue1"
+            SourceAccessConfigurations:
+              - Type: BASIC_AUTH
+                URI: arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c
\ No newline at end of file
diff --git a/tests/translator/input/api_description.yaml b/tests/translator/input/api_description.yaml
new file mode 100644
index 00000000..c660e785
--- /dev/null
+++ b/tests/translator/input/api_description.yaml
@@ -0,0 +1,21 @@
+Resources:
+  Function:
+    Type: AWS::Serverless::Function
+    Properties:
+      CodeUri: s3://sam-demo-bucket/member_portal.zip
+      Handler: index.gethtml
+      Runtime: nodejs12.x
+      Events:
+        GetHtml:
+          Type: Api
+          Properties:
+            RestApiId: Api
+            Path: /
+            Method: get
+
+  Api:
+    Type: AWS::Serverless::Api
+    Properties:
+      StageName: Prod
+      DefinitionUri: s3://sam-demo-bucket/webpage_swagger.json
+      Description: my description
diff --git a/tests/translator/input/error_missing_broker.yaml b/tests/translator/input/error_missing_broker.yaml
new file mode 100644
index 00000000..143b2ca2
--- /dev/null
+++ b/tests/translator/input/error_missing_broker.yaml
@@ -0,0 +1,16 @@
+Resources:
+  MQFunction:
+    Type: 'AWS::Serverless::Function'
+    Properties:
+      CodeUri: s3://sam-demo-bucket/queues.zip
+      Handler: queue.mq_handler
+      Runtime: python2.7
+      Events:
+        MyMQQueue:
+          Type: MQ
+          Properties:
+            Queues:
+              - "Queue1"
+            SourceAccessConfigurations:
+              - Type: BASIC_AUTH
+                URI: arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c
\ No newline at end of file
diff --git a/tests/translator/input/http_api_description.yaml b/tests/translator/input/http_api_description.yaml
new file mode 100644
index 00000000..6dec788b
--- /dev/null
+++ b/tests/translator/input/http_api_description.yaml
@@ -0,0 +1,18 @@
+Resources:
+  HttpApi:
+    Type: AWS::Serverless::HttpApi
+    Properties:
+      DefinitionUri: s3://bucket/key
+      Description: my description
+
+  Function:
+    Type: AWS::Serverless::Function
+    Properties:
+      Runtime: python3.7
+      Handler: index.handler
+      CodeUri: s3://bucket/key
+      Events:
+        Api:
+          Type: HttpApi
+          Properties:
+            ApiId: HttpApi
diff --git a/tests/translator/output/amq.json b/tests/translator/output/amq.json
new file mode 100644
index 00000000..796785ad
--- /dev/null
+++ b/tests/translator/output/amq.json
@@ -0,0 +1,70 @@
+{
+  "Resources": {
+    "MQFunction": {
+      "Type": "AWS::Lambda::Function",
+      "Properties": {
+        "Code": {
+          "S3Bucket": "sam-demo-bucket",
+          "S3Key": "queues.zip"
+        },
+        "Handler": "queue.mq_handler",
+        "Role": {
+          "Fn::GetAtt": [
+            "MQFunctionRole",
+            "Arn"
+          ]
+        },
+        "Runtime": "python2.7",
+        "Tags": [{
+          "Value": "SAM",
+          "Key": "lambda:createdBy"
+        }]
+      }
+    },
+    "MQFunctionMyMQQueue": {
+      "Type": "AWS::Lambda::EventSourceMapping",
+      "Properties": {
+        "EventSourceArn": "arn:aws:mq:us-east-2:123456789012:broker:MyBroker:b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9",
+        "FunctionName": {
+          "Ref": "MQFunction"
+        },
+        "Queues": ["Queue1"],
+        "SourceAccessConfigurations": [
+          {
+            "Type": "BASIC_AUTH",
+            "URI": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c"
+          }
+        ]
+      }
+    },
+    "MQFunctionRole": {
+      "Type": "AWS::IAM::Role",
+      "Properties": {
+        "ManagedPolicyArns": [
+          "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+          "arn:aws:iam::aws:policy/service-role/AWSLambdaAMQExecutionRole"
+        ],
+        "Tags": [
+          {
+            "Value": "SAM",
+            "Key": "lambda:createdBy"
+          }
+        ],
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17",
+          "Statement": [{
+            "Action": [
+              "sts:AssumeRole"
+            ],
+            "Effect": "Allow",
+            "Principal": {
+              "Service": [
+                "lambda.amazonaws.com"
+              ]
+            }
+          }]
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/translator/output/api_description.json b/tests/translator/output/api_description.json
new file mode 100644
index 00000000..31cf8ed0
--- /dev/null
+++ b/tests/translator/output/api_description.json
@@ -0,0 +1,108 @@
+{
+  "Resources": {
+    "FunctionRole": {
+      "Type": "AWS::IAM::Role", 
+      "Properties": {
+        "ManagedPolicyArns": [
+          "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+        ],
+        "Tags": [
+          {
+            "Value": "SAM",
+            "Key": "lambda:createdBy"
+          }
+        ],
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17", 
+          "Statement": [
+            {
+              "Action": [
+                "sts:AssumeRole"
+              ], 
+              "Effect": "Allow", 
+              "Principal": {
+                "Service": [
+                  "lambda.amazonaws.com"
+                ]
+              }
+            }
+          ]
+        }
+      }
+    }, 
+    "ApiProdStage": {
+      "Type": "AWS::ApiGateway::Stage", 
+      "Properties": {
+        "DeploymentId": {
+          "Ref": "ApiDeploymentf117c932f7"
+        }, 
+        "RestApiId": {
+          "Ref": "Api"
+        }, 
+        "StageName": "Prod"
+      }
+    }, 
+    "FunctionGetHtmlPermissionProd": {
+      "Type": "AWS::Lambda::Permission", 
+      "Properties": {
+        "Action": "lambda:InvokeFunction", 
+        "Principal": "apigateway.amazonaws.com", 
+        "FunctionName": {
+          "Ref": "Function"
+        }, 
+        "SourceArn": {
+          "Fn::Sub": [
+            "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", 
+            {
+              "__Stage__": "*",
+              "__ApiId__": "Api"
+            }
+          ]
+        }
+      }
+    },
+    "ApiDeploymentf117c932f7": {
+      "Type": "AWS::ApiGateway::Deployment", 
+      "Properties": {
+        "RestApiId": {
+          "Ref": "Api"
+        }, 
+        "Description": "RestApi deployment id: f117c932f75cfa87d23dfed64e9430d0081ef289", 
+        "StageName": "Stage"
+      }
+    }, 
+    "Api": {
+      "Type": "AWS::ApiGateway::RestApi", 
+      "Properties": {
+        "BodyS3Location": {
+          "Bucket": "sam-demo-bucket", 
+          "Key": "webpage_swagger.json"
+        },
+        "Description": "my description"
+      }
+    }, 
+    "Function": {
+      "Type": "AWS::Lambda::Function", 
+      "Properties": {
+        "Code": {
+          "S3Bucket": "sam-demo-bucket", 
+          "S3Key": "member_portal.zip"
+        }, 
+        "Handler": "index.gethtml", 
+        "Role": {
+          "Fn::GetAtt": [
+            "FunctionRole",
+            "Arn"
+          ]
+        }, 
+        "Runtime": "nodejs12.x",
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }
+  }
+}
diff --git a/tests/translator/output/aws-cn/amq.json b/tests/translator/output/aws-cn/amq.json
new file mode 100644
index 00000000..b7526766
--- /dev/null
+++ b/tests/translator/output/aws-cn/amq.json
@@ -0,0 +1,70 @@
+{
+  "Resources": {
+    "MQFunction": {
+      "Type": "AWS::Lambda::Function",
+      "Properties": {
+        "Code": {
+          "S3Bucket": "sam-demo-bucket",
+          "S3Key": "queues.zip"
+        },
+        "Handler": "queue.mq_handler",
+        "Role": {
+          "Fn::GetAtt": [
+            "MQFunctionRole",
+            "Arn"
+          ]
+        },
+        "Runtime": "python2.7",
+        "Tags": [{
+          "Value": "SAM",
+          "Key": "lambda:createdBy"
+        }]
+      }
+    },
+    "MQFunctionMyMQQueue": {
+      "Type": "AWS::Lambda::EventSourceMapping",
+      "Properties": {
+        "EventSourceArn": "arn:aws:mq:us-east-2:123456789012:broker:MyBroker:b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9",
+        "FunctionName": {
+          "Ref": "MQFunction"
+        },
+        "Queues": ["Queue1"],
+        "SourceAccessConfigurations": [
+          {
+            "Type": "BASIC_AUTH",
+            "URI": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c"
+          }
+        ]
+      }
+    },
+    "MQFunctionRole": {
+      "Type": "AWS::IAM::Role",
+      "Properties": {
+        "ManagedPolicyArns": [
+          "arn:aws-cn:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+          "arn:aws-cn:iam::aws:policy/service-role/AWSLambdaAMQExecutionRole"
+        ],
+        "Tags": [
+          {
+            "Value": "SAM",
+            "Key": "lambda:createdBy"
+          }
+        ],
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17",
+          "Statement": [{
+            "Action": [
+              "sts:AssumeRole"
+            ],
+            "Effect": "Allow",
+            "Principal": {
+              "Service": [
+                "lambda.amazonaws.com"
+              ]
+            }
+          }]
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/translator/output/aws-cn/api_description.json b/tests/translator/output/aws-cn/api_description.json
new file mode 100644
index 00000000..f5277b61
--- /dev/null
+++ b/tests/translator/output/aws-cn/api_description.json
@@ -0,0 +1,116 @@
+{
+  "Resources": {
+    "FunctionRole": {
+      "Type": "AWS::IAM::Role", 
+      "Properties": {
+        "ManagedPolicyArns": [
+          "arn:aws-cn:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+        ],
+        "Tags": [
+          {
+            "Value": "SAM",
+            "Key": "lambda:createdBy"
+          }
+        ],
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17", 
+          "Statement": [
+            {
+              "Action": [
+                "sts:AssumeRole"
+              ], 
+              "Effect": "Allow", 
+              "Principal": {
+                "Service": [
+                  "lambda.amazonaws.com"
+                ]
+              }
+            }
+          ]
+        }
+      }
+    }, 
+    "ApiProdStage": {
+      "Type": "AWS::ApiGateway::Stage", 
+      "Properties": {
+        "DeploymentId": {
+          "Ref": "ApiDeploymentf117c932f7"
+        }, 
+        "RestApiId": {
+          "Ref": "Api"
+        }, 
+        "StageName": "Prod"
+      }
+    }, 
+    "FunctionGetHtmlPermissionProd": {
+      "Type": "AWS::Lambda::Permission", 
+      "Properties": {
+        "Action": "lambda:InvokeFunction", 
+        "Principal": "apigateway.amazonaws.com", 
+        "FunctionName": {
+          "Ref": "Function"
+        }, 
+        "SourceArn": {
+          "Fn::Sub": [
+            "arn:aws-cn:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/",
+            {
+              "__Stage__": "*",
+              "__ApiId__": "Api"
+            }
+          ]
+        }
+      }
+    },
+    "ApiDeploymentf117c932f7": {
+      "Type": "AWS::ApiGateway::Deployment", 
+      "Properties": {
+        "RestApiId": {
+          "Ref": "Api"
+        }, 
+        "Description": "RestApi deployment id: f117c932f75cfa87d23dfed64e9430d0081ef289", 
+        "StageName": "Stage"
+      }
+    }, 
+    "Api": {
+      "Type": "AWS::ApiGateway::RestApi", 
+      "Properties": {
+        "BodyS3Location": {
+          "Bucket": "sam-demo-bucket", 
+          "Key": "webpage_swagger.json"
+        },
+        "Description": "my description",
+        "EndpointConfiguration": {
+          "Types": [
+            "REGIONAL"
+          ]
+        },
+        "Parameters": {
+          "endpointConfigurationTypes": "REGIONAL"
+        }
+      }
+    }, 
+    "Function": {
+      "Type": "AWS::Lambda::Function", 
+      "Properties": {
+        "Code": {
+          "S3Bucket": "sam-demo-bucket", 
+          "S3Key": "member_portal.zip"
+        }, 
+        "Handler": "index.gethtml", 
+        "Role": {
+          "Fn::GetAtt": [
+            "FunctionRole",
+            "Arn"
+          ]
+        }, 
+        "Runtime": "nodejs12.x",
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }
+  }
+}
diff --git a/tests/translator/output/aws-cn/http_api_description.json b/tests/translator/output/aws-cn/http_api_description.json
new file mode 100644
index 00000000..0798fc4e
--- /dev/null
+++ b/tests/translator/output/aws-cn/http_api_description.json
@@ -0,0 +1,96 @@
+{
+  "Resources": {
+    "Function": {
+      "Type": "AWS::Lambda::Function", 
+      "Properties": {
+        "Handler": "index.handler", 
+        "Code": {
+          "S3Bucket": "bucket", 
+          "S3Key": "key"
+        }, 
+        "Role": {
+          "Fn::GetAtt": [
+            "FunctionRole", 
+            "Arn"
+          ]
+        }, 
+        "Runtime": "python3.7", 
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }, 
+    "FunctionApiPermission": {
+      "Type": "AWS::Lambda::Permission", 
+      "Properties": {
+        "Action": "lambda:InvokeFunction", 
+        "Principal": "apigateway.amazonaws.com", 
+        "FunctionName": {
+          "Ref": "Function"
+        }, 
+        "SourceArn": {
+          "Fn::Sub": [
+            "arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/*", 
+            {
+              "__Stage__": "*", 
+              "__ApiId__": "HttpApi"
+            }
+          ]
+        }
+      }
+    },
+    "FunctionRole": {
+      "Type": "AWS::IAM::Role", 
+      "Properties": {
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17", 
+          "Statement": [
+            {
+              "Action": [
+                "sts:AssumeRole"
+              ], 
+              "Effect": "Allow", 
+              "Principal": {
+                "Service": [
+                  "lambda.amazonaws.com"
+                ]
+              }
+            }
+          ]
+        }, 
+        "ManagedPolicyArns": [
+          "arn:aws-cn:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+        ], 
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }, 
+    "HttpApiApiGatewayDefaultStage": {
+      "Type": "AWS::ApiGatewayV2::Stage", 
+      "Properties": {
+        "AutoDeploy": true, 
+        "ApiId": {
+          "Ref": "HttpApi"
+        },
+        "StageName": "$default"
+      }
+    }, 
+    "HttpApi": {
+      "Type": "AWS::ApiGatewayV2::Api", 
+      "Properties": {
+        "BodyS3Location": {
+          "Bucket": "bucket",
+          "Key": "key"
+        },
+        "Description": "my description"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/translator/output/aws-us-gov/amq.json b/tests/translator/output/aws-us-gov/amq.json
new file mode 100644
index 00000000..5a42ee95
--- /dev/null
+++ b/tests/translator/output/aws-us-gov/amq.json
@@ -0,0 +1,70 @@
+{
+  "Resources": {
+    "MQFunction": {
+      "Type": "AWS::Lambda::Function",
+      "Properties": {
+        "Code": {
+          "S3Bucket": "sam-demo-bucket",
+          "S3Key": "queues.zip"
+        },
+        "Handler": "queue.mq_handler",
+        "Role": {
+          "Fn::GetAtt": [
+            "MQFunctionRole",
+            "Arn"
+          ]
+        },
+        "Runtime": "python2.7",
+        "Tags": [{
+          "Value": "SAM",
+          "Key": "lambda:createdBy"
+        }]
+      }
+    },
+    "MQFunctionMyMQQueue": {
+      "Type": "AWS::Lambda::EventSourceMapping",
+      "Properties": {
+        "EventSourceArn": "arn:aws:mq:us-east-2:123456789012:broker:MyBroker:b-1234a5b6-78cd-901e-2fgh-3i45j6k178l9",
+        "FunctionName": {
+          "Ref": "MQFunction"
+        },
+        "Queues": ["Queue1"],
+        "SourceAccessConfigurations": [
+          {
+            "Type": "BASIC_AUTH",
+            "URI": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c"
+          }
+        ]
+      }
+    },
+    "MQFunctionRole": {
+      "Type": "AWS::IAM::Role",
+      "Properties": {
+        "ManagedPolicyArns": [
+          "arn:aws-us-gov:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
+          "arn:aws-us-gov:iam::aws:policy/service-role/AWSLambdaAMQExecutionRole"
+        ],
+        "Tags": [
+          {
+            "Value": "SAM",
+            "Key": "lambda:createdBy"
+          }
+        ],
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17",
+          "Statement": [{
+            "Action": [
+              "sts:AssumeRole"
+            ],
+            "Effect": "Allow",
+            "Principal": {
+              "Service": [
+                "lambda.amazonaws.com"
+              ]
+            }
+          }]
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/tests/translator/output/aws-us-gov/api_description.json b/tests/translator/output/aws-us-gov/api_description.json
new file mode 100644
index 00000000..aef917ae
--- /dev/null
+++ b/tests/translator/output/aws-us-gov/api_description.json
@@ -0,0 +1,116 @@
+{
+  "Resources": {
+    "FunctionRole": {
+      "Type": "AWS::IAM::Role", 
+      "Properties": {
+        "ManagedPolicyArns": [
+          "arn:aws-us-gov:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+        ],
+        "Tags": [
+          {
+            "Value": "SAM",
+            "Key": "lambda:createdBy"
+          }
+        ],
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17", 
+          "Statement": [
+            {
+              "Action": [
+                "sts:AssumeRole"
+              ], 
+              "Effect": "Allow", 
+              "Principal": {
+                "Service": [
+                  "lambda.amazonaws.com"
+                ]
+              }
+            }
+          ]
+        }
+      }
+    }, 
+    "ApiProdStage": {
+      "Type": "AWS::ApiGateway::Stage", 
+      "Properties": {
+        "DeploymentId": {
+          "Ref": "ApiDeploymentf117c932f7"
+        }, 
+        "RestApiId": {
+          "Ref": "Api"
+        }, 
+        "StageName": "Prod"
+      }
+    }, 
+    "FunctionGetHtmlPermissionProd": {
+      "Type": "AWS::Lambda::Permission", 
+      "Properties": {
+        "Action": "lambda:InvokeFunction", 
+        "Principal": "apigateway.amazonaws.com", 
+        "FunctionName": {
+          "Ref": "Function"
+        }, 
+        "SourceArn": {
+          "Fn::Sub": [
+            "arn:aws-us-gov:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/",
+            {
+              "__Stage__": "*",
+              "__ApiId__": "Api"
+            }
+          ]
+        }
+      }
+    },
+    "ApiDeploymentf117c932f7": {
+      "Type": "AWS::ApiGateway::Deployment", 
+      "Properties": {
+        "RestApiId": {
+          "Ref": "Api"
+        }, 
+        "Description": "RestApi deployment id: f117c932f75cfa87d23dfed64e9430d0081ef289", 
+        "StageName": "Stage"
+      }
+    }, 
+    "Api": {
+      "Type": "AWS::ApiGateway::RestApi", 
+      "Properties": {
+        "BodyS3Location": {
+          "Bucket": "sam-demo-bucket", 
+          "Key": "webpage_swagger.json"
+        },
+        "Description": "my description",
+        "EndpointConfiguration": {
+          "Types": [
+            "REGIONAL"
+          ]
+        },
+        "Parameters": {
+          "endpointConfigurationTypes": "REGIONAL"
+        }
+      }
+    }, 
+    "Function": {
+      "Type": "AWS::Lambda::Function", 
+      "Properties": {
+        "Code": {
+          "S3Bucket": "sam-demo-bucket", 
+          "S3Key": "member_portal.zip"
+        }, 
+        "Handler": "index.gethtml", 
+        "Role": {
+          "Fn::GetAtt": [
+            "FunctionRole",
+            "Arn"
+          ]
+        }, 
+        "Runtime": "nodejs12.x",
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }
+  }
+}
diff --git a/tests/translator/output/aws-us-gov/http_api_description.json b/tests/translator/output/aws-us-gov/http_api_description.json
new file mode 100644
index 00000000..c7594a0e
--- /dev/null
+++ b/tests/translator/output/aws-us-gov/http_api_description.json
@@ -0,0 +1,96 @@
+{
+  "Resources": {
+    "Function": {
+      "Type": "AWS::Lambda::Function", 
+      "Properties": {
+        "Handler": "index.handler", 
+        "Code": {
+          "S3Bucket": "bucket", 
+          "S3Key": "key"
+        }, 
+        "Role": {
+          "Fn::GetAtt": [
+            "FunctionRole", 
+            "Arn"
+          ]
+        }, 
+        "Runtime": "python3.7", 
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }, 
+    "FunctionApiPermission": {
+      "Type": "AWS::Lambda::Permission", 
+      "Properties": {
+        "Action": "lambda:InvokeFunction", 
+        "Principal": "apigateway.amazonaws.com", 
+        "FunctionName": {
+          "Ref": "Function"
+        }, 
+        "SourceArn": {
+          "Fn::Sub": [
+            "arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/*", 
+            {
+              "__Stage__": "*", 
+              "__ApiId__": "HttpApi"
+            }
+          ]
+        }
+      }
+    },
+    "FunctionRole": {
+      "Type": "AWS::IAM::Role", 
+      "Properties": {
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17", 
+          "Statement": [
+            {
+              "Action": [
+                "sts:AssumeRole"
+              ], 
+              "Effect": "Allow", 
+              "Principal": {
+                "Service": [
+                  "lambda.amazonaws.com"
+                ]
+              }
+            }
+          ]
+        }, 
+        "ManagedPolicyArns": [
+          "arn:aws-us-gov:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+        ], 
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }, 
+    "HttpApiApiGatewayDefaultStage": {
+      "Type": "AWS::ApiGatewayV2::Stage", 
+      "Properties": {
+        "AutoDeploy": true, 
+        "ApiId": {
+          "Ref": "HttpApi"
+        },
+        "StageName": "$default"
+      }
+    }, 
+    "HttpApi": {
+      "Type": "AWS::ApiGatewayV2::Api", 
+      "Properties": {
+        "BodyS3Location": {
+          "Bucket": "bucket",
+          "Key": "key"
+        },
+        "Description": "my description"
+      }
+    }
+  }
+}
diff --git a/tests/translator/output/error_missing_broker.json b/tests/translator/output/error_missing_broker.json
new file mode 100644
index 00000000..136ac380
--- /dev/null
+++ b/tests/translator/output/error_missing_broker.json
@@ -0,0 +1,6 @@
+{
+  "errors": [{
+    "errorMessage": "Resource with id [MQFunction] is invalid. Event with id [MyMQQueue] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided."
+  }],
+  "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [MQFunction] is invalid. Event with id [MyMQQueue] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided."
+}
\ No newline at end of file
diff --git a/tests/translator/output/error_missing_queue.json b/tests/translator/output/error_missing_queue.json
index 561dfefc..4a7ba1f7 100644
--- a/tests/translator/output/error_missing_queue.json
+++ b/tests/translator/output/error_missing_queue.json
@@ -1,6 +1,6 @@
 {
   "errors": [{
-    "errorMessage": "Resource with id [SQSFunction] is invalid. Event with id [MySqsQueue] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) provided."
+    "errorMessage": "Resource with id [SQSFunction] is invalid. Event with id [MySqsQueue] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided."
   }],
-  "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [SQSFunction] is invalid. Event with id [MySqsQueue] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) provided."
+  "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [SQSFunction] is invalid. Event with id [MySqsQueue] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided."
 }
\ No newline at end of file
diff --git a/tests/translator/output/error_missing_stream.json b/tests/translator/output/error_missing_stream.json
index 3dd94a47..f85ff25e 100644
--- a/tests/translator/output/error_missing_stream.json
+++ b/tests/translator/output/error_missing_stream.json
@@ -1,6 +1,6 @@
 {
   "errors": [{
-    "errorMessage": "Resource with id [DynamoDBFunction] is invalid. Event with id [MyDDBStream] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) provided."
+    "errorMessage": "Resource with id [DynamoDBFunction] is invalid. Event with id [MyDDBStream] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided."
   }],
-  "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [DynamoDBFunction] is invalid. Event with id [MyDDBStream] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) provided."
+  "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [DynamoDBFunction] is invalid. Event with id [MyDDBStream] is invalid. No Queue (for SQS) or Stream (for Kinesis, DynamoDB or MSK) or Broker (for ActiveMQ) provided."
 }
\ No newline at end of file
diff --git a/tests/translator/output/http_api_description.json b/tests/translator/output/http_api_description.json
new file mode 100644
index 00000000..682ece8d
--- /dev/null
+++ b/tests/translator/output/http_api_description.json
@@ -0,0 +1,96 @@
+{
+  "Resources": {
+    "Function": {
+      "Type": "AWS::Lambda::Function", 
+      "Properties": {
+        "Handler": "index.handler", 
+        "Code": {
+          "S3Bucket": "bucket", 
+          "S3Key": "key"
+        }, 
+        "Role": {
+          "Fn::GetAtt": [
+            "FunctionRole", 
+            "Arn"
+          ]
+        }, 
+        "Runtime": "python3.7", 
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }, 
+    "FunctionApiPermission": {
+      "Type": "AWS::Lambda::Permission", 
+      "Properties": {
+        "Action": "lambda:InvokeFunction", 
+        "Principal": "apigateway.amazonaws.com", 
+        "FunctionName": {
+          "Ref": "Function"
+        }, 
+        "SourceArn": {
+          "Fn::Sub": [
+            "arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/*", 
+            {
+              "__Stage__": "*", 
+              "__ApiId__": "HttpApi"
+            }
+          ]
+        }
+      }
+    },
+    "FunctionRole": {
+      "Type": "AWS::IAM::Role", 
+      "Properties": {
+        "AssumeRolePolicyDocument": {
+          "Version": "2012-10-17", 
+          "Statement": [
+            {
+              "Action": [
+                "sts:AssumeRole"
+              ], 
+              "Effect": "Allow", 
+              "Principal": {
+                "Service": [
+                  "lambda.amazonaws.com"
+                ]
+              }
+            }
+          ]
+        }, 
+        "ManagedPolicyArns": [
+          "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
+        ], 
+        "Tags": [
+          {
+            "Value": "SAM", 
+            "Key": "lambda:createdBy"
+          }
+        ]
+      }
+    }, 
+    "HttpApiApiGatewayDefaultStage": {
+      "Type": "AWS::ApiGatewayV2::Stage", 
+      "Properties": {
+        "AutoDeploy": true, 
+        "ApiId": {
+          "Ref": "HttpApi"
+        },
+        "StageName": "$default"
+      }
+    }, 
+    "HttpApi": {
+      "Type": "AWS::ApiGatewayV2::Api", 
+      "Properties": {
+        "BodyS3Location": {
+          "Bucket": "bucket",
+          "Key": "key"
+        },
+        "Description": "my description"
+      }
+    }
+  }
+}
diff --git a/tests/translator/test_translator.py b/tests/translator/test_translator.py
index 92acc6c0..6d66f9f8 100644
--- a/tests/translator/test_translator.py
+++ b/tests/translator/test_translator.py
@@ -157,10 +157,12 @@ class TestTranslatorEndToEnd(TestCase):
                 "cloudwatchlog",
                 "streams",
                 "sqs",
+                "amq",
                 "simpletable",
                 "simpletable_with_sse",
                 "implicit_api",
                 "explicit_api",
+                "api_description",
                 "api_endpoint_configuration",
                 "api_endpoint_configuration_with_vpcendpoint",
                 "api_with_auth_all_maximum",
@@ -380,6 +382,7 @@ class TestTranslatorEndToEnd(TestCase):
                 "http_api_def_uri",
                 "explicit_http_api",
                 "http_api_with_cors",
+                "http_api_description",
                 "http_api_lambda_auth",
                 "http_api_lambda_auth_full",
             ],
@@ -607,6 +610,7 @@ class TestTranslatorEndToEnd(TestCase):
         "error_function_invalid_request_parameters",
         "error_invalid_logical_id",
         "error_layer_invalid_properties",
+        "error_missing_broker",
         "error_missing_queue",
         "error_missing_startingposition",
         "error_missing_stream",