internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: cloudtools/troposphere

Issue:
Cloudformation bugs in EMR_Cluster example
Great project!

I found 2 bugs with the EMR cloudformation template. 

More than happy to submit a PR with the corrections if considered. 

1. The reference to `EMR_AutoScaling_DefaultRole` fails template validation checks with the current configuration.

```
https://github.com/charlesgreen/troposphere/blob/master/examples/EMR_Cluster.py#L205

Bug:
AutoScalingRole=Ref(emr_autoscaling_role),

Correction:
AutoScalingRole=emr_autoscaling_role,
```

2. MasterInstanceGroup should not have an associated autoscaling group.

I receive an error and found the following in the AWS documentation. 
"Each instance group in a cluster, except the master instance group, can have its own scaling policy, which consists of scale-out and scale-in rules".

https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-automatic-scaling.html

```
https://github.com/charlesgreen/troposphere/blob/master/examples/EMR_Cluster.py#L214

# lines 214 to 220 should be deleted

AutoScalingPolicy=emr.AutoScalingPolicy(
    Constraints=emr.ScalingConstraints(
      MinCapacity="1",
      MaxCapacity="3"
    ),
  Rules=generate_rules("MasterAutoScalingPolicy")
)
```



Discussion:

Resolving patch:
diff --git a/examples/EMR_Cluster.py b/examples/EMR_Cluster.py
--- a/examples/EMR_Cluster.py
+++ b/examples/EMR_Cluster.py
@@ -202,7 +202,7 @@ def generate_rules(rules_name):
     ],
     JobFlowRole=Ref(emr_instance_profile),
     ServiceRole=Ref(emr_service_role),
-    AutoScalingRole=Ref(emr_autoscaling_role),
+    AutoScalingRole=emr_autoscaling_role,
     Instances=emr.JobFlowInstancesConfig(
         Ec2KeyName=Ref(keyname),
         Ec2SubnetId=Ref(subnet),


Test patch:
diff --git a/tests/examples_output/EMR_Cluster.template b/tests/examples_output/EMR_Cluster.template
--- a/tests/examples_output/EMR_Cluster.template
+++ b/tests/examples_output/EMR_Cluster.template
@@ -87,9 +87,7 @@
                         "Name": "Spark"
                     }
                 ],
-                "AutoScalingRole": {
-                    "Ref": "EMR_AutoScaling_DefaultRole"
-                },
+                "AutoScalingRole": "EMR_AutoScaling_DefaultRole",
                 "BootstrapActions": [
                     {
                         "Name": "Dummy bootstrap action",
Repository: cloudtools/troposphere

Issue:
Appsync ApiKey Expires needs to be an int
The expires prop on the appsync ApiKey class needs to be an int otherwise the decimal place causes cloudformation to throw a `Can not deserialize value of type java.lang.Long from String` error. 


Discussion:

Resolving patch:
diff --git a/troposphere/appsync.py b/troposphere/appsync.py
--- a/troposphere/appsync.py
+++ b/troposphere/appsync.py
@@ -4,7 +4,7 @@
 # See LICENSE file for full license.
 
 from . import AWSObject, AWSProperty
-from .validators import boolean
+from .validators import boolean, integer
 
 
 class ApiKey(AWSObject):
@@ -13,7 +13,7 @@ class ApiKey(AWSObject):
     props = {
         'ApiId': (basestring, True),
         'Description': (basestring, False),
-        'Expires': (float, False),
+        'Expires': (integer, False),
     }
 
 


Test patch:
Repository: cloudtools/troposphere

Issue:
Unsupported property CpuCredits used for EC2 Instances.
It looks like #1068 caused a breaking change to EC2 instances using `CreditSpecification` property, resulting in the following error when trying to deploy the generated templates:

```
unsupported property CpuCredits
```

It appears the change was implemented to correct an error when deploying LaunchTemplates, however the object type for [LaunchTemplate CreditSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-creditspecification.html) uses a different case than for [EC2 Instance CreditSpecification](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html).  Looks like separate classes will need to be defined for each use.


Discussion:

Resolving patch:
diff --git a/troposphere/ec2.py b/troposphere/ec2.py
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -147,7 +147,7 @@ class Placement(AWSProperty):
 
 class CreditSpecification(AWSProperty):
     props = {
-        'CpuCredits': (basestring, False),
+        'CPUCredits': (basestring, False),
     }
 
 
@@ -820,10 +820,16 @@ class InstanceMarketOptions(AWSProperty):
     }
 
 
+class LaunchTemplateCreditSpecification(AWSProperty):
+    props = {
+        'CpuCredits': (basestring, False),
+    }
+
+
 class LaunchTemplateData(AWSProperty):
     props = {
         'BlockDeviceMappings': ([BlockDeviceMapping], False),
-        'CreditSpecification': (CreditSpecification, False),
+        'CreditSpecification': (LaunchTemplateCreditSpecification, False),
         'DisableApiTermination': (boolean, False),
         'EbsOptimized': (boolean, False),
         'ElasticGpuSpecifications': ([ElasticGpuSpecification], False),


Test patch:
Repository: cloudtools/troposphere

Issue:
Prefix is optional for 
I assume `True` here means that `Prefix` is mandatory:

```py
class S3DestinationConfiguration(AWSProperty):
    props = {
        'BucketARN': (basestring, True),
        'BufferingHints': (BufferingHints, True),
        'CloudWatchLoggingOptions': (CloudWatchLoggingOptions, False),
        'CompressionFormat': (basestring, True),
        'EncryptionConfiguration': (EncryptionConfiguration, False),
        'Prefix': (basestring, True),
        'RoleARN': (basestring, True),
    }

class ExtendedS3DestinationConfiguration(AWSProperty):
    props = {
        'BucketARN': (basestring, True),
        'BufferingHints': (BufferingHints, True),
        'CloudWatchLoggingOptions': (CloudWatchLoggingOptions, False),
        'CompressionFormat': (basestring, True),
        'EncryptionConfiguration': (EncryptionConfiguration, False),
        'Prefix': (basestring, True),
        'ProcessingConfiguration': (ProcessingConfiguration, False),
        'RoleARN': (basestring, True),
        'S3BackupConfiguration': (S3DestinationConfiguration, False),
        'S3BackupMode': (s3_backup_mode_extended_s3_validator, False),
    }
```
However, [`Prefix` is optional](https://docs.aws.amazon.com/firehose/latest/APIReference/API_S3DestinationConfiguration.html).


Discussion:

Resolving patch:
diff --git a/troposphere/firehose.py b/troposphere/firehose.py
--- a/troposphere/firehose.py
+++ b/troposphere/firehose.py
@@ -88,7 +88,7 @@ class S3Configuration(AWSProperty):
         'CloudWatchLoggingOptions': (CloudWatchLoggingOptions, False),
         'CompressionFormat': (basestring, True),
         'EncryptionConfiguration': (EncryptionConfiguration, False),
-        'Prefix': (basestring, True),
+        'Prefix': (basestring, False),
         'RoleARN': (basestring, True)
     }
 
@@ -158,7 +158,7 @@ class S3DestinationConfiguration(AWSProperty):
         'CloudWatchLoggingOptions': (CloudWatchLoggingOptions, False),
         'CompressionFormat': (basestring, True),
         'EncryptionConfiguration': (EncryptionConfiguration, False),
-        'Prefix': (basestring, True),
+        'Prefix': (basestring, False),
         'RoleARN': (basestring, True),
     }
 
@@ -170,7 +170,7 @@ class ExtendedS3DestinationConfiguration(AWSProperty):
         'CloudWatchLoggingOptions': (CloudWatchLoggingOptions, False),
         'CompressionFormat': (basestring, True),
         'EncryptionConfiguration': (EncryptionConfiguration, False),
-        'Prefix': (basestring, True),
+        'Prefix': (basestring, False),
         'ProcessingConfiguration': (ProcessingConfiguration, False),
         'RoleARN': (basestring, True),
         'S3BackupConfiguration': (S3DestinationConfiguration, False),


Test patch:
Repository: cloudtools/troposphere

Issue:
Add support for DockerVolumeConfiguration in Volume property of AWS::ECS::TaskDefinition
See here for more details: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-dockervolumeconfiguration.html


Discussion:

Resolving patch:
diff --git a/troposphere/ecs.py b/troposphere/ecs.py
--- a/troposphere/ecs.py
+++ b/troposphere/ecs.py
@@ -49,6 +49,14 @@ def placement_constraint_validator(x):
     return x
 
 
+def scope_validator(x):
+    valid_values = ['shared', 'task']
+    if x not in valid_values:
+        raise ValueError("Scope type must be one of: %s" %
+                         ', '.join(valid_values))
+    return x
+
+
 class PlacementConstraint(AWSProperty):
     props = {
         'Type': (placement_constraint_validator, True),
@@ -238,8 +246,19 @@ class Host(AWSProperty):
     }
 
 
+class DockerVolumeConfiguration(AWSProperty):
+    props = {
+        'Autoprovision': (boolean, False),
+        'Driver': (basestring, False),
+        'DriverOpts': ([basestring], False),
+        'Labels': ([basestring], False),
+        'Scope': (scope_validator, False)
+    }
+
+
 class Volume(AWSProperty):
     props = {
+        'DockerVolumeConfiguration': (DockerVolumeConfiguration, False),
         'Name': (basestring, True),
         'Host': (Host, False),
     }


Test patch:
diff --git a/tests/test_ecs.py b/tests/test_ecs.py
--- a/tests/test_ecs.py
+++ b/tests/test_ecs.py
@@ -241,3 +241,37 @@ def test_allow_container_healthcheck(self):
         )
 
         container_definition.to_dict()
+
+    def test_docker_volume_configuration(self):
+        docker_volume_configuration = ecs.DockerVolumeConfiguration(
+            Autoprovision=True,
+            Scope="task"
+        )
+        task_definition = ecs.TaskDefinition(
+            "mytaskdef",
+            ContainerDefinitions=[
+                ecs.ContainerDefinition(
+                    Image="myimage",
+                    Memory="300",
+                    Name="mycontainer",
+                )
+            ],
+            Volumes=[
+                ecs.Volume(
+                    Name="my-vol",
+                    DockerVolumeConfiguration=docker_volume_configuration
+                ),
+            ],
+        )
+        task_definition.to_dict()
+
+
+class TestECSValidators(unittest.TestCase):
+
+    def test_scope_validator(self):
+        valid_values = ['shared', 'task']
+        for x in valid_values:
+            ecs.scope_validator(x)
+
+        with self.assertRaises(ValueError):
+            ecs.scope_validator("bad_scope")
Repository: cloudtools/troposphere

Issue:
Add Lambda Environment variable name validation
Lambda Env variables names are limited to `[a-zA-Z][a-zA-Z0-9_]+`. There is also a set of variable names that are reserved. Currently tropo does not validate the names. 

I can provide a PR for that soon.


Discussion:

Resolving patch:
diff --git a/troposphere/awslambda.py b/troposphere/awslambda.py
--- a/troposphere/awslambda.py
+++ b/troposphere/awslambda.py
@@ -1,7 +1,33 @@
+import re
 from . import AWSObject, AWSProperty, Join, Tags
 from .validators import positive_integer
 
 MEMORY_VALUES = [x for x in range(128, 3009, 64)]
+RESERVED_ENVIRONMENT_VARIABLES = [
+    'AWS_ACCESS_KEY',
+    'AWS_ACCESS_KEY_ID',
+    'AWS_DEFAULT_REGION',
+    'AWS_EXECUTION_ENV',
+    'AWS_LAMBDA_FUNCTION_MEMORY_SIZE',
+    'AWS_LAMBDA_FUNCTION_NAME',
+    'AWS_LAMBDA_FUNCTION_VERSION',
+    'AWS_LAMBDA_LOG_GROUP_NAME',
+    'AWS_LAMBDA_LOG_STREAM_NAME',
+    'AWS_REGION',
+    'AWS_SECRET_ACCESS_KEY',
+    'AWS_SECRET_KEY',
+    'AWS_SECURITY_TOKEN',
+    'AWS_SESSION_TOKEN',
+    'LAMBDA_RUNTIME_DIR',
+    'LAMBDA_TASK_ROOT',
+    'LANG',
+    'LD_LIBRARY_PATH',
+    'NODE_PATH',
+    'PATH',
+    'PYTHONPATH',
+    'TZ'
+]
+ENVIRONMENT_VARIABLES_NAME_PATTERN = r'[a-zA-Z][a-zA-Z0-9_]+'
 
 
 def validate_memory_size(memory_value):
@@ -16,6 +42,18 @@ def validate_memory_size(memory_value):
     return memory_value
 
 
+def validate_variables_name(variables):
+    for name in variables:
+        if name in RESERVED_ENVIRONMENT_VARIABLES:
+            raise ValueError("Lambda Function environment variables names"
+                             " can't be none of:\n %s" %
+                             ", ".join(RESERVED_ENVIRONMENT_VARIABLES))
+        elif not re.match(ENVIRONMENT_VARIABLES_NAME_PATTERN, name):
+            raise ValueError("Invalid environment variable name: %s" % name)
+
+    return variables
+
+
 class Code(AWSProperty):
     props = {
         'S3Bucket': (basestring, False),
@@ -120,7 +158,7 @@ class DeadLetterConfig(AWSProperty):
 class Environment(AWSProperty):
 
     props = {
-        'Variables': (dict, True),
+        'Variables': (validate_variables_name, True),
     }
 
 


Test patch:
diff --git a/tests/test_awslambda.py b/tests/test_awslambda.py
--- a/tests/test_awslambda.py
+++ b/tests/test_awslambda.py
@@ -1,6 +1,6 @@
 import unittest
 from troposphere import GetAtt, Template, Join, Ref
-from troposphere.awslambda import Code, Function
+from troposphere.awslambda import Code, Function, Environment
 
 
 class TestAWSLambda(unittest.TestCase):
@@ -65,6 +65,14 @@ def test_check_zip_file(self):
             with self.assertRaises(ValueError):
                 Code.check_zip_file(z)
 
+    def test_environment_variable_invalid_name(self):
+        for var in ['1', '2var', '_var', '/var']:
+            with self.assertRaises(ValueError) as context:
+                Environment(Variables={var: 'value'})
+
+            self.assertTrue('Invalid environment variable name: %s' % var
+                            in context.exception)
+
 
 if __name__ == '__main__':
     unittest.main()
Repository: cloudtools/troposphere

Issue:
EC2 SpotFleet unable to create
The release 2.3.4 introduced a bug in the file `troposphere/ec2.py`, class `SpotFleetRequestConfigData`:
- Both `LaunchTemplateConfigs` and `LaunchSpecifications` are set as required, but as per the cloudformation documentation they are conditional (you can only set one of them)

The `validate` function is correctly implementing the conditional logic but in the properties they should be set to false, not true.


Discussion:

Resolving patch:
diff --git a/troposphere/ec2.py b/troposphere/ec2.py
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -802,8 +802,8 @@ class SpotFleetRequestConfigData(AWSProperty):
         'ExcessCapacityTerminationPolicy': (basestring, False),
         'IamFleetRole': (basestring, True),
         'InstanceInterruptionBehavior': (basestring, False),
-        'LaunchSpecifications': ([LaunchSpecifications], True),
-        'LaunchTemplateConfigs': ([LaunchTemplateConfigs], True),
+        'LaunchSpecifications': ([LaunchSpecifications], False),
+        'LaunchTemplateConfigs': ([LaunchTemplateConfigs], False),
         'LoadBalancersConfig': (LoadBalancersConfig, False),
         'ReplaceUnhealthyInstances': (boolean, False),
         'SpotPrice': (basestring, False),


Test patch:
Repository: cloudtools/troposphere

Issue:
Add 'PermissionsBoundary' properties to AWS::IAM::Role and AWS::IAM::User
This property has been released on November 9 by AWS.
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/ReleaseHistory.html
```
PermissionsBoundary

    The ARN of the policy that is used to set the permissions boundary for the role. Minimum length of 20. Maximum length of 2048.

    Required: No

    Type: String

    Update requires: No interruption

```


Discussion:

Resolving patch:
diff --git a/troposphere/iam.py b/troposphere/iam.py
--- a/troposphere/iam.py
+++ b/troposphere/iam.py
@@ -79,6 +79,7 @@ class Role(AWSObject):
         'ManagedPolicyArns': ([basestring], False),
         'MaxSessionDuration': (integer, False),
         'Path': (iam_path, False),
+        'PermissionsBoundary': (basestring, False),
         'Policies': ([Policy], False),
         'RoleName': (iam_role_name, False),
     }
@@ -105,10 +106,11 @@ class User(AWSObject):
     resource_type = "AWS::IAM::User"
 
     props = {
-        'Path': (iam_path, False),
         'Groups': ([basestring], False),
-        'ManagedPolicyArns': ([basestring], False),
         'LoginProfile': (LoginProfile, False),
+        'ManagedPolicyArns': ([basestring], False),
+        'Path': (iam_path, False),
+        'PermissionsBoundary': (basestring, False),
         'Policies': ([Policy], False),
         'UserName': (iam_user_name, False),
     }


Test patch:
Repository: cloudtools/troposphere

Issue:
Add support for Aurora BacktrackWindow
Hello,

I would like to see support added for this property. I will submit a PR.

Thanks


Discussion:

Resolving patch:
diff --git a/troposphere/rds.py b/troposphere/rds.py
--- a/troposphere/rds.py
+++ b/troposphere/rds.py
@@ -6,7 +6,8 @@
 import re
 
 from . import AWSHelperFn, AWSObject, AWSProperty, Tags
-from .validators import boolean, network_port, integer, positive_integer
+from .validators import (boolean, network_port, integer, positive_integer,
+                         integer_range)
 
 # Taken from:
 # http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html
@@ -399,7 +400,7 @@ class DBCluster(AWSObject):
 
     props = {
         'AvailabilityZones': ([basestring], False),
-        'BacktrackWindow': (positive_integer, False),
+        'BacktrackWindow': (integer_range(0, 259200), False),
         'BackupRetentionPeriod': (validate_backup_retention_period, False),
         'DatabaseName': (basestring, False),
         'DBClusterIdentifier': (basestring, False),


Test patch:
Repository: cloudtools/troposphere

Issue:
EC2 SpotFleet wrong LoadBalancersConfig structure
SpotFleetRequestConfigData.LoadBalancersConfig have wrong structure.
There is missing ClassicLoadBalancersConfig class between LoadBalancersConfig and array of ClassicLoadBalancer.
It should be something like:
```
class ClassicLoadBalancersConfig(AWSProperty):
    props = {
        'ClassicLoadBalancers': ([ClassicLoadBalancer], True)
    }

class LoadBalancersConfig(AWSProperty):
    props = {
        'ClassicLoadBalancersConfig': (ClassicLoadBalancersConfig, False),
        'TargetGroupsConfig': (TargetGroupsConfig, False)
    }

```
So this section in the template should be 

```
"LoadBalancersConfig": {
  "ClassicLoadBalancersConfig": {
     "ClassicLoadBalancers": [
       { "Name": { "Ref": "MyElb" } }
     ]
   }
 }
```

Now its wrong
```
"LoadBalancersConfig": {
  "ClassicLoadBalancersConfig": [
    { "Name": { "Ref": "MyElb"  }  }
  ]
}
```



Discussion:

Resolving patch:
diff --git a/troposphere/ec2.py b/troposphere/ec2.py
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -782,6 +782,12 @@ class ClassicLoadBalancer(AWSProperty):
     }
 
 
+class ClassicLoadBalancersConfig(AWSProperty):
+    props = {
+        'ClassicLoadBalancers': ([ClassicLoadBalancer], True)
+    }
+
+
 class TargetGroup(AWSProperty):
     props = {
         'Arn': (basestring, True)
@@ -790,7 +796,7 @@ class TargetGroup(AWSProperty):
 
 class LoadBalancersConfig(AWSProperty):
     props = {
-        'ClassicLoadBalancersConfig': ([ClassicLoadBalancer], False),
+        'ClassicLoadBalancersConfig': ([ClassicLoadBalancersConfig], False),
         'TargetGroupsConfig': (TargetGroup, False)
     }
 


Test patch:
Repository: cloudtools/troposphere

Issue:
EC2 LaunchTemplateData InstanceType should not be required
According to cloudformation spec EC2 LaunchTemplateData InstanceType is not required.
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancetype



Discussion:

Resolving patch:
diff --git a/troposphere/ec2.py b/troposphere/ec2.py
--- a/troposphere/ec2.py
+++ b/troposphere/ec2.py
@@ -896,7 +896,7 @@ class LaunchTemplateData(AWSProperty):
         'ImageId': (basestring, True),
         'InstanceInitiatedShutdownBehavior': (basestring, False),
         'InstanceMarketOptions': (InstanceMarketOptions, False),
-        'InstanceType': (basestring, True),
+        'InstanceType': (basestring, False),
         'KernelId': (basestring, False),
         'KeyName': (basestring, False),
         'Monitoring': (Monitoring, False),


Test patch:
Repository: cloudtools/troposphere

Issue:
Add 'Kind' property to AWS::AppSync::Resolver
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-kind

The Kind property is required when using the new PipelineConfig feature for AppSync.

There are only two allowable values, PIPELINE or UNIT. The property is not required if using the standard resolvers.


Discussion:

Resolving patch:
diff --git a/troposphere/appsync.py b/troposphere/appsync.py
--- a/troposphere/appsync.py
+++ b/troposphere/appsync.py
@@ -7,6 +7,13 @@
 from .validators import boolean, integer
 
 
+def resolver_kind_validator(x):
+    valid_types = ["UNIT", "PIPELINE"]
+    if x not in valid_types:
+        raise ValueError("Kind must be one of: %s" % ", ".join(valid_types))
+    return x
+
+
 class ApiKey(AWSObject):
     resource_type = "AWS::AppSync::ApiKey"
 
@@ -153,6 +160,7 @@ class Resolver(AWSObject):
         'ApiId': (basestring, True),
         'DataSourceName': (basestring, True),
         'FieldName': (basestring, True),
+        'Kind': (resolver_kind_validator, False),
         'PipelineConfig': (PipelineConfig, False),
         'RequestMappingTemplate': (basestring, False),
         'RequestMappingTemplateS3Location': (basestring, False),


Test patch:
diff --git a/tests/test_appsync.py b/tests/test_appsync.py
new file mode 100644
--- /dev/null
+++ b/tests/test_appsync.py
@@ -0,0 +1,46 @@
+import unittest
+from troposphere.appsync import Resolver, PipelineConfig
+
+
+class TestAppsyncResolver(unittest.TestCase):
+    def test_resolver_kind_bad_value(self):
+        with self.assertRaisesRegexp(ValueError, 'Kind must be one of'):
+            Resolver(
+                'MutationField',
+                DataSourceName='SomeDatasource',
+                FieldName='Field',
+                TypeName='Mutation',
+                ApiId='some_api_id',
+                Kind='SOME_KIND',
+                PipelineConfig=PipelineConfig(
+                    Functions=['FunctionId1', 'FunctionId']
+                ),
+                RequestMappingTemplateS3Location=('s3://bucket/key.req.vtl'),
+                ResponseMappingTemplateS3Location=('s3://bucket/key.res.vtl')
+            )
+
+    def test_resolver(self):
+        Resolver(
+            'MutationField',
+            DataSourceName='SomeDatasource',
+            FieldName='Field',
+            TypeName='Mutation',
+            ApiId='some_api_id',
+            Kind='PIPELINE',
+            PipelineConfig=PipelineConfig(
+                Functions=['FunctionId1', 'FunctionId']
+            ),
+            RequestMappingTemplateS3Location=('s3://bucket/key.req.vtl'),
+            ResponseMappingTemplateS3Location=('s3://bucket/key.res.vtl')
+        )
+
+        Resolver(
+            'MutationField',
+            DataSourceName='SomeDatasource',
+            FieldName='Field',
+            TypeName='Mutation',
+            ApiId='some_api_id',
+            Kind='UNIT',
+            RequestMappingTemplateS3Location=('s3://bucket/key.req.vtl'),
+            ResponseMappingTemplateS3Location=('s3://bucket/key.res.vtl')
+        )